From 69edfa25cbe6c2df9e7c3994d4551959ed2a667e Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 7 Jan 2026 18:01:56 +0100 Subject: [PATCH] Extend PDU session types and make PDU session req flexible --- common/utils/telnetsrv/telnetsrv_ciUE.c | 5 ++++- .../5GSM/MSG/PduSessionEstablishmentAccept.h | 2 ++ openair3/NAS/NR_UE/nr_nas_msg.c | 21 ++++++++++++------- openair3/NAS/NR_UE/nr_nas_msg.h | 3 ++- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/common/utils/telnetsrv/telnetsrv_ciUE.c b/common/utils/telnetsrv/telnetsrv_ciUE.c index cc580b1a83..81451796e0 100644 --- a/common/utils/telnetsrv/telnetsrv_ciUE.c +++ b/common/utils/telnetsrv/telnetsrv_ciUE.c @@ -172,7 +172,10 @@ static int add_pdu_session(char *buf, int debug, telnet_printfunc_t prnt) if (!nas) ERROR_MSG_RET("No NAS context found for UE_ID %d\n", ue_id); - request_pdusession(nas, pdusession_id); + DevAssert(nas->uicc); + nssai_t nssai = {nas->uicc->nssai_sst, nas->uicc->nssai_sd}; + const char *dnn = nas->uicc->dnnStr; + request_pdusession(nas, pdusession_id, 1 /* = PDU_SESSION_TYPE_IPV4 */, nssai, dnn); prnt("Triggered PDU session request for UE %d with ID %d\n", ue_id, pdusession_id); return 0; } diff --git a/openair3/NAS/NR_UE/5GS/5GSM/MSG/PduSessionEstablishmentAccept.h b/openair3/NAS/NR_UE/5GS/5GSM/MSG/PduSessionEstablishmentAccept.h index 80694814b4..9c515e858f 100644 --- a/openair3/NAS/NR_UE/5GS/5GSM/MSG/PduSessionEstablishmentAccept.h +++ b/openair3/NAS/NR_UE/5GS/5GSM/MSG/PduSessionEstablishmentAccept.h @@ -49,6 +49,8 @@ typedef enum { FOREACH_IEI(TO_ENUM) } pduSessionEstablishment_IEI_t; #define PDU_SESSION_TYPE_IPV4 0b001 #define PDU_SESSION_TYPE_IPV6 0b010 #define PDU_SESSION_TYPE_IPV4V6 0b011 +#define PDU_SESSION_TYPE_UNSTRUCT 0b100 +#define PDU_SESSION_TYPE_ETHER 0b101 #define IPv4_ADDRESS_LENGTH 4 // length of the IPv4 address associated with a PDU session #define IPv6_INTERFACE_ID_LENGTH 8 // interface identifier for the IPv6 link local address #define SMF_IPv6_LLA_LENGTH 16 diff --git a/openair3/NAS/NR_UE/nr_nas_msg.c b/openair3/NAS/NR_UE/nr_nas_msg.c index 1df4409bbe..f839ff4be6 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg.c +++ b/openair3/NAS/NR_UE/nr_nas_msg.c @@ -1773,15 +1773,21 @@ static void send_nas_5gmm_ind(instance_t instance, const Guti5GSMobileIdentity_t itti_send_msg_to_task(TASK_RRC_NRUE, instance, msg); } -void request_pdusession(nr_ue_nas_t *nas, int pdusession_id) +void request_pdusession(nr_ue_nas_t *nas, int pdusession_id, int t, nssai_t nssai, const char *dnn) { + AssertFatal(t == PDU_SESSION_TYPE_IPV4 || t == PDU_SESSION_TYPE_IPV6 || t == PDU_SESSION_TYPE_IPV4V6 + || t == PDU_SESSION_TYPE_UNSTRUCT || t == PDU_SESSION_TYPE_ETHER, + "illegal PDU session type %d\n", + t); + AssertFatal(t != PDU_SESSION_TYPE_UNSTRUCT, "unstructured PDU sessions not handled yet\n"); MessageDef *message_p = itti_alloc_new_message(TASK_NAS_NRUE, nas->UE_id, NAS_PDU_SESSION_REQ); nas_pdu_session_req_t *pdu_req = &NAS_PDU_SESSION_REQ(message_p); pdu_req->pdusession_id = pdusession_id; - pdu_req->pdusession_type = 0x91; // 0x91 = IPv4, 0x92 = IPv6, 0x93 = IPv4v6 - pdu_req->sst = nas->uicc->nssai_sst; - pdu_req->sd = nas->uicc->nssai_sd; - snprintf(pdu_req->dnn, sizeof(pdu_req->dnn), "%s", nas->uicc->dnnStr); + // 24.501: joint PDU session type IEI (0x9-, Table 8.3.1.1.1) and type (9.11.4.11) + pdu_req->pdusession_type = 0x90 | t; + pdu_req->sst = nssai.sst; + pdu_req->sd = nssai.sd; + snprintf(pdu_req->dnn, sizeof(pdu_req->dnn), "%s", dnn); itti_send_msg_to_task(TASK_NAS_NRUE, nas->UE_id, message_p); } @@ -1871,9 +1877,10 @@ static void handle_registration_accept(nr_ue_nas_t *nas, const uint8_t *pdu_buff if (get_user_nssai_idx(ch_nssai, msg.nas_allowed_nssai) < 0) { LOG_E(NAS, "NSSAI parameters not match with allowed NSSAI. Couldn't request PDU session.\n"); } else { - request_pdusession(nas, get_softmodem_params()->default_pdu_session_id); + nssai_t nssai = {nas->uicc->nssai_sst, nas->uicc->nssai_sd}; + request_pdusession(nas, get_softmodem_params()->default_pdu_session_id, PDU_SESSION_TYPE_IPV4, nssai, nas->uicc->dnnStr); if (get_nrUE_params()->extra_pdu_id != -1) { - request_pdusession(nas, get_nrUE_params()->extra_pdu_id); + request_pdusession(nas, get_nrUE_params()->extra_pdu_id, PDU_SESSION_TYPE_IPV4, nssai, nas->uicc->dnnStr); } } // Free local message after processing diff --git a/openair3/NAS/NR_UE/nr_nas_msg.h b/openair3/NAS/NR_UE/nr_nas_msg.h index 7a19997444..1dd5afafe9 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg.h +++ b/openair3/NAS/NR_UE/nr_nas_msg.h @@ -32,6 +32,7 @@ #define __NR_NAS_MSG_SIM_H__ #include +#include "common/5g_platform_types.h" #include #include #include @@ -113,6 +114,6 @@ void *nas_nrue_task(void *args_p); void *nas_nrue(void *args_p); void nas_init_nrue(int num_ues); void nr_ue_create_ip_if(const char *ifnameprefix, const char *ipv4, const char *ipv6, int ue_id, int pdu_session_id); -void request_pdusession(nr_ue_nas_t *nas, int pdusession_id); +void request_pdusession(nr_ue_nas_t *nas, int pdusession_id, int type, nssai_t nssai, const char *dnn); #endif /* __NR_NAS_MSG_SIM_H__*/