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:
Alexander Couzens 2024-02-20 17:35:15 +01:00
parent b09bf95aee
commit 241e106a49
3 changed files with 106 additions and 3 deletions

View File

@ -23,6 +23,7 @@
#include "osmo_epdg_ue.h"
#include <daemon.h>
#include <collections/linked_list.h>
#include <credentials/keys/shared_key.h>
#include <osmocom/gsm/apn.h>
#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
@ -199,13 +200,55 @@ METHOD(attribute_provider_t, release_address, bool,
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*,
private_osmo_epdg_provider_t *this, linked_list_t *pools, ike_sa_t *ike_sa,
linked_list_t *vips)
{
/* don't forget fixing the this point if needed */
/* no additional attributes for this ike_sa */
return enumerator_create_empty();
this = container_of((void *) this, private_osmo_epdg_provider_t, public.attribute);
enumerator_t *enumerator = NULL;
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,

View File

@ -20,6 +20,7 @@
#include <sa/ike_sa.h>
#include <threading/rwlock.h>
#include <collections/linked_list.h>
#include <utils/utils.h>
#include <utils/debug.h>
@ -59,6 +60,13 @@ struct private_osmo_epdg_ue_t {
*/
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.
* 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;
}
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,
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,
private_osmo_epdg_ue_t *this)
{
this->lock->destroy(this->lock);
this->attributes->destroy_function(this->attributes, destroy_attribute);
free(this->apn);
free(this->imsi);
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,
.get_state = _get_state,
.set_state = _set_state,
.get_attributes = _get_attributes,
.destroy = _destroy,
},
.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,
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
.state = UE_WAIT_LOCATION_UPDATE,
.attributes = linked_list_create(),
.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;
}

View File

@ -79,6 +79,11 @@ struct osmo_epdg_ue_t {
*/
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
*/
@ -117,6 +122,13 @@ struct osmo_epdg_ue_t {
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.
* A newly created object will come with refcount = 1. Use put() to destroy it.