osmo-epdg: fill attributes INTERNAL_DNS and P_CSCF_IP4_ADDRESS
In order to get a pixel7a connecting to the ePDG. Add the remaining code so PCOs could be added later.
This commit is contained in:
parent
b09bf95aee
commit
241e106a49
|
@ -23,6 +23,7 @@
|
||||||
#include "osmo_epdg_ue.h"
|
#include "osmo_epdg_ue.h"
|
||||||
|
|
||||||
#include <daemon.h>
|
#include <daemon.h>
|
||||||
|
#include <collections/linked_list.h>
|
||||||
#include <credentials/keys/shared_key.h>
|
#include <credentials/keys/shared_key.h>
|
||||||
#include <osmocom/gsm/apn.h>
|
#include <osmocom/gsm/apn.h>
|
||||||
#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
|
#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
|
||||||
|
@ -199,13 +200,55 @@ METHOD(attribute_provider_t, release_address, bool,
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* see attr_provider for similar usage */
|
||||||
|
CALLBACK(attribute_enum_filter, bool,
|
||||||
|
void *data, enumerator_t *orig, va_list args)
|
||||||
|
{
|
||||||
|
osmo_epdg_attribute_t *entry;
|
||||||
|
configuration_attribute_type_t *type;
|
||||||
|
chunk_t *value;
|
||||||
|
|
||||||
|
VA_ARGS_VGET(args, type, value);
|
||||||
|
while (orig->enumerate(orig, &entry))
|
||||||
|
{
|
||||||
|
if (entry->valid)
|
||||||
|
{
|
||||||
|
*type = entry->type;
|
||||||
|
*value = entry->value;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(attribute_provider_t, create_attribute_enumerator, enumerator_t*,
|
METHOD(attribute_provider_t, create_attribute_enumerator, enumerator_t*,
|
||||||
private_osmo_epdg_provider_t *this, linked_list_t *pools, ike_sa_t *ike_sa,
|
private_osmo_epdg_provider_t *this, linked_list_t *pools, ike_sa_t *ike_sa,
|
||||||
linked_list_t *vips)
|
linked_list_t *vips)
|
||||||
{
|
{
|
||||||
/* don't forget fixing the this point if needed */
|
this = container_of((void *) this, private_osmo_epdg_provider_t, public.attribute);
|
||||||
/* no additional attributes for this ike_sa */
|
enumerator_t *enumerator = NULL;
|
||||||
return enumerator_create_empty();
|
linked_list_t *attributes = NULL;
|
||||||
|
osmo_epdg_ue_t *ue = this->db->get_subscriber_ike(this->db, ike_sa);
|
||||||
|
|
||||||
|
/* create an iterator based on the llist */
|
||||||
|
if (!ue)
|
||||||
|
{
|
||||||
|
return enumerator_create_empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this ref is giving into the enumerator */
|
||||||
|
ue->get(ue);
|
||||||
|
attributes = ue->get_attributes(ue);
|
||||||
|
enumerator = enumerator_create_cleaner(
|
||||||
|
enumerator_create_filter(
|
||||||
|
attributes->create_enumerator(attributes),
|
||||||
|
attribute_enum_filter, NULL, NULL),
|
||||||
|
(void *)ue->put, ue);
|
||||||
|
|
||||||
|
/* this ref was taken by get_subscriber */
|
||||||
|
ue->put(ue);
|
||||||
|
return enumerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(osmo_epdg_provider_t, destroy, void,
|
METHOD(osmo_epdg_provider_t, destroy, void,
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include <sa/ike_sa.h>
|
#include <sa/ike_sa.h>
|
||||||
#include <threading/rwlock.h>
|
#include <threading/rwlock.h>
|
||||||
|
#include <collections/linked_list.h>
|
||||||
#include <utils/utils.h>
|
#include <utils/utils.h>
|
||||||
#include <utils/debug.h>
|
#include <utils/debug.h>
|
||||||
|
|
||||||
|
@ -59,6 +60,13 @@ struct private_osmo_epdg_ue_t {
|
||||||
*/
|
*/
|
||||||
host_t *address;
|
host_t *address;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The requested attributes/PCO options on GTP
|
||||||
|
* e.g. P-CSCF requests, DNS, ..
|
||||||
|
* holds attribute_entry_t
|
||||||
|
*/
|
||||||
|
linked_list_t *attributes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refcount to track this object.
|
* Refcount to track this object.
|
||||||
* It will call destroy() when refcount reaches 0
|
* It will call destroy() when refcount reaches 0
|
||||||
|
@ -145,6 +153,13 @@ METHOD(osmo_epdg_ue_t, get_state, enum osmo_epdg_ue_state,
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(osmo_epdg_ue_t, get_attributes, linked_list_t *,
|
||||||
|
private_osmo_epdg_ue_t *this)
|
||||||
|
{
|
||||||
|
/* TODO: check if we need to also take locking .. also refcounting would be great here */
|
||||||
|
return this->attributes;
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(osmo_epdg_ue_t, get, void,
|
METHOD(osmo_epdg_ue_t, get, void,
|
||||||
private_osmo_epdg_ue_t *this)
|
private_osmo_epdg_ue_t *this)
|
||||||
{
|
{
|
||||||
|
@ -160,10 +175,23 @@ METHOD(osmo_epdg_ue_t, put, void,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CALLBACK(destroy_attribute, void,
|
||||||
|
osmo_epdg_attribute_t *attr)
|
||||||
|
{
|
||||||
|
if (attr->valid)
|
||||||
|
{
|
||||||
|
chunk_free(&attr->value);
|
||||||
|
}
|
||||||
|
free(attr);
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(osmo_epdg_ue_t, destroy, void,
|
METHOD(osmo_epdg_ue_t, destroy, void,
|
||||||
private_osmo_epdg_ue_t *this)
|
private_osmo_epdg_ue_t *this)
|
||||||
{
|
{
|
||||||
this->lock->destroy(this->lock);
|
this->lock->destroy(this->lock);
|
||||||
|
this->attributes->destroy_function(this->attributes, destroy_attribute);
|
||||||
|
|
||||||
free(this->apn);
|
free(this->apn);
|
||||||
free(this->imsi);
|
free(this->imsi);
|
||||||
free(this);
|
free(this);
|
||||||
|
@ -191,6 +219,7 @@ osmo_epdg_ue_t *osmo_epdg_ue_create(uint32_t id, const char *imsi, const char *a
|
||||||
.set_address = _set_address,
|
.set_address = _set_address,
|
||||||
.get_state = _get_state,
|
.get_state = _get_state,
|
||||||
.set_state = _set_state,
|
.set_state = _set_state,
|
||||||
|
.get_attributes = _get_attributes,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
.apn = strdup(apn),
|
.apn = strdup(apn),
|
||||||
|
@ -198,8 +227,27 @@ osmo_epdg_ue_t *osmo_epdg_ue_create(uint32_t id, const char *imsi, const char *a
|
||||||
.id = id,
|
.id = id,
|
||||||
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
|
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
|
||||||
.state = UE_WAIT_LOCATION_UPDATE,
|
.state = UE_WAIT_LOCATION_UPDATE,
|
||||||
|
.attributes = linked_list_create(),
|
||||||
.refcount = 1,
|
.refcount = 1,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* hardcode P-CSCF and DNS entry */
|
||||||
|
osmo_epdg_attribute_t *entry;
|
||||||
|
host_t *host = host_create_from_string_and_family("10.74.0.31", AF_INET, 0);
|
||||||
|
INIT(entry,
|
||||||
|
.type = INTERNAL_IP4_DNS,
|
||||||
|
.value = chunk_clone(host->get_address(host)),
|
||||||
|
.valid = TRUE,
|
||||||
|
);
|
||||||
|
this->attributes->insert_last(this->attributes, entry);
|
||||||
|
|
||||||
|
INIT(entry,
|
||||||
|
.type = P_CSCF_IP4_ADDRESS,
|
||||||
|
.value = chunk_clone(host->get_address(host)),
|
||||||
|
.valid = TRUE,
|
||||||
|
);
|
||||||
|
this->attributes->insert_last(this->attributes, entry);
|
||||||
|
host->destroy(host);
|
||||||
|
|
||||||
return &this->public;
|
return &this->public;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,11 @@ struct osmo_epdg_ue_t {
|
||||||
*/
|
*/
|
||||||
void (*set_id)(osmo_epdg_ue_t *this, uint32_t unique_id);
|
void (*set_id)(osmo_epdg_ue_t *this, uint32_t unique_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Linked list of osmo_epdg_attribute_t
|
||||||
|
*/
|
||||||
|
linked_list_t *(*get_attributes)(osmo_epdg_ue_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get address. Returns NULL or a cloned' host_t object
|
* Get address. Returns NULL or a cloned' host_t object
|
||||||
*/
|
*/
|
||||||
|
@ -117,6 +122,13 @@ struct osmo_epdg_ue_t {
|
||||||
void (*destroy)(osmo_epdg_ue_t *this);
|
void (*destroy)(osmo_epdg_ue_t *this);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct osmo_epdg_attribute_t {
|
||||||
|
configuration_attribute_type_t type;
|
||||||
|
chunk_t value;
|
||||||
|
bool valid;
|
||||||
|
};
|
||||||
|
typedef struct osmo_epdg_attribute_t osmo_epdg_attribute_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a osmo_epdg_ue instance.
|
* Create a osmo_epdg_ue instance.
|
||||||
* A newly created object will come with refcount = 1. Use put() to destroy it.
|
* A newly created object will come with refcount = 1. Use put() to destroy it.
|
||||||
|
|
Loading…
Reference in New Issue