Extend PDU session types and make PDU session req flexible
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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__*/
|
||||
|
||||
Reference in New Issue
Block a user