Extend PDU session types and make PDU session req flexible

This commit is contained in:
Robert Schmidt
2026-01-20 11:47:28 +01:00
parent 0eddb4d3e3
commit 69edfa25cb
4 changed files with 22 additions and 9 deletions
+4 -1
View File
@@ -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;
}
@@ -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
+14 -7
View File
@@ -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
+2 -1
View File
@@ -32,6 +32,7 @@
#define __NR_NAS_MSG_SIM_H__
#include <common/utils/assertions.h>
#include "common/5g_platform_types.h"
#include <openair3/UICC/usim_interface.h>
#include <stdbool.h>
#include <stdint.h>
@@ -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__*/