SDAP entity: store interface name

Simplify interface handling by storing the name: this allows to simplify
to remove_ip_if(), which does not need to recreate a valid name, and
will simplify handling of ethernet PDU sessions with a possibly
different name.
This commit is contained in:
Robert Schmidt
2026-01-20 11:11:36 +01:00
parent 2557df87f5
commit 7ede84cb1d
2 changed files with 10 additions and 11 deletions
+9 -11
View File
@@ -166,16 +166,18 @@ void start_sdap_tun_gnb_first_ue_default_pdu_session(ue_id_t ue_id, int pdu_sess
char ifname[IFNAMSIZ]; char ifname[IFNAMSIZ];
tun_generate_ifname(ifname, ifprefix, ue_id - 1); tun_generate_ifname(ifname, ifprefix, ue_id - 1);
entity->pdusession_sock = tun_alloc(ifname); entity->pdusession_sock = tun_alloc(ifname);
entity->pdusession_if_name = strdup(ifname);
tun_config(ifname, "10.0.1.1", NULL); tun_config(ifname, "10.0.1.1", NULL);
threadCreate(&entity->pdusession_thread, sdap_tun_read_thread, entity, "gnb_tun_read_thread", -1, OAI_PRIORITY_RT_LOW); threadCreate(&entity->pdusession_thread, sdap_tun_read_thread, entity, "gnb_tun_read_thread", -1, OAI_PRIORITY_RT_LOW);
} }
static void start_sdap_tun_ue(ue_id_t ue_id, int pdu_session_id, int sock) static void start_sdap_tun_ue(ue_id_t ue_id, int pdu_session_id, int sock, const char *ifname)
{ {
nr_sdap_entity_t *entity = nr_sdap_get_entity(ue_id, pdu_session_id); nr_sdap_entity_t *entity = nr_sdap_get_entity(ue_id, pdu_session_id);
DevAssert(entity != NULL); DevAssert(entity != NULL);
DevAssert(!entity->is_gnb); DevAssert(!entity->is_gnb);
entity->pdusession_sock = sock; entity->pdusession_sock = sock;
entity->pdusession_if_name = strdup(ifname);
entity->stop_thread = false; entity->stop_thread = false;
char thread_name[64]; char thread_name[64];
snprintf(thread_name, sizeof(thread_name), "ue_tun_read_%ld_p%d", ue_id, pdu_session_id); snprintf(thread_name, sizeof(thread_name), "ue_tun_read_%ld_p%d", ue_id, pdu_session_id);
@@ -193,12 +195,14 @@ void create_ue_ip_if(const char *ipv4, const char *ipv6, int ue_id, int pdu_sess
if (ipv4) { if (ipv4) {
setup_ue_ipv4_route(ifname, ue_id, ipv4); setup_ue_ipv4_route(ifname, ue_id, ipv4);
} }
start_sdap_tun_ue(ue_id, pdu_session_id, sock); // interface name suffix is ue_id+1 start_sdap_tun_ue(ue_id, pdu_session_id, sock, ifname); // interface name suffix is ue_id+1
} }
void remove_ip_if(nr_sdap_entity_t *entity) void remove_ip_if(nr_sdap_entity_t *entity)
{ {
DevAssert(entity != NULL); DevAssert(entity != NULL);
DevAssert(entity->pdusession_if_name != NULL);
// Stop the read thread // Stop the read thread
entity->stop_thread = true; entity->stop_thread = true;
@@ -208,13 +212,7 @@ void remove_ip_if(nr_sdap_entity_t *entity)
int ret = pthread_join(entity->pdusession_thread, NULL); int ret = pthread_join(entity->pdusession_thread, NULL);
AssertFatal(ret == 0, "pthread_join() failed, errno: %d, %s\n", errno, strerror(errno)); AssertFatal(ret == 0, "pthread_join() failed, errno: %d, %s\n", errno, strerror(errno));
// Bring down the IP interface // Bring down the IP interface
int default_pdu = get_softmodem_params()->default_pdu_session_id; tun_destroy(entity->pdusession_if_name);
char ifname[IFNAMSIZ]; free(entity->pdusession_if_name);
if (entity->is_gnb) { entity->pdusession_if_name = NULL;
char *ifprefix = get_softmodem_params()->nsa ? "oaitun_gnb" : "oaitun_enb";
tun_generate_ifname(ifname, ifprefix, entity->ue_id - 1);
} else {
tun_generate_ue_ifname(ifname, entity->ue_id, entity->pdusession_id != default_pdu ? entity->pdusession_id : -1);
}
tun_destroy(ifname);
} }
+1
View File
@@ -102,6 +102,7 @@ typedef struct nr_sdap_entity_s {
bool enable_sdap; bool enable_sdap;
int pdusession_id; int pdusession_id;
int pdusession_sock; int pdusession_sock;
char *pdusession_if_name;
pthread_t pdusession_thread; pthread_t pdusession_thread;
bool stop_thread; bool stop_thread;
int qfi; int qfi;