From dc968d4dc965bcf753635f9d8f82360774e5fcdf Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 7 Jan 2026 17:27:51 +0100 Subject: [PATCH] Handle PDU session type Ethernet in NAS and SDAP --- openair2/SDAP/nr_sdap/nr_sdap.c | 9 +++++++++ openair2/SDAP/nr_sdap/nr_sdap.h | 1 + openair3/NAS/NR_UE/nr_nas_msg.c | 11 +++++++---- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/openair2/SDAP/nr_sdap/nr_sdap.c b/openair2/SDAP/nr_sdap/nr_sdap.c index a38550f993..29e5dc93db 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap.c +++ b/openair2/SDAP/nr_sdap/nr_sdap.c @@ -197,6 +197,15 @@ void create_ue_ip_if(const char *ipv4, const char *ipv6, int ue_id, int pdu_sess start_sdap_tun_ue(ue_id, pdu_session_id, sock, ifname); // interface name suffix is ue_id+1 } +void create_ue_eth_if(int ue_id, int pdu_session_id, bool is_default) +{ + char ifname[IFNAMSIZ]; + tuntap_generate_ue_ifname(ifname, IFF_TAP, ue_id, is_default ? -1 : pdu_session_id); + const int sock = tuntap_alloc(IFF_TAP, ifname); + tap_config(ifname); // brings the interface up + start_sdap_tun_ue(ue_id, pdu_session_id, sock, ifname); +} + void remove_ip_if(nr_sdap_entity_t *entity) { DevAssert(entity != NULL); diff --git a/openair2/SDAP/nr_sdap/nr_sdap.h b/openair2/SDAP/nr_sdap/nr_sdap.h index 682c97b6fc..bb85fdf249 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap.h +++ b/openair2/SDAP/nr_sdap/nr_sdap.h @@ -62,5 +62,6 @@ void sdap_data_ind(int pdcp_entity, void start_sdap_tun_gnb_first_ue_default_pdu_session(ue_id_t ue_id, int pdu_session_id); void create_ue_ip_if(const char *ipv4, const char *ipv6, int ue_id, int pdu_session_id, bool is_default); +void create_ue_eth_if(int ue_id, int pdu_session_id, bool is_default); #endif diff --git a/openair3/NAS/NR_UE/nr_nas_msg.c b/openair3/NAS/NR_UE/nr_nas_msg.c index 3add94a549..1e6c98b744 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg.c +++ b/openair3/NAS/NR_UE/nr_nas_msg.c @@ -1568,11 +1568,14 @@ static void handle_pdu_session_accept(const nr_ue_nas_t *nas, uint8_t *pdu_buffe // process PDU Session: pass ID -1 to not append PDU ID to interface bool is_default = idx == 0; - if (msg.pdu_addr_ie.pdu_length) + if (msg.pdu_type == PDU_SESSION_TYPE_ETHER) { + create_ue_eth_if(instance, sm_header.pdu_session_id, is_default); + } else if (msg.pdu_addr_ie.pdu_length) { process_pdu_session_addr(&msg, instance, sm_header.pdu_session_id, is_default); - else - LOG_W(NAS, "Optional PDU Address IE was not provided\n"); - + } else { + LOG_W(NAS, "Unhandled PDU session type %d, ignoring PDU session ID %d\n", msg.pdu_type, sm_header.pdu_session_id); + } + set_qfi(msg.qos_rules.rule->qfi, sm_header.pdu_session_id, instance); }