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)
|
if (!nas)
|
||||||
ERROR_MSG_RET("No NAS context found for UE_ID %d\n", ue_id);
|
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);
|
prnt("Triggered PDU session request for UE %d with ID %d\n", ue_id, pdusession_id);
|
||||||
return 0;
|
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_IPV4 0b001
|
||||||
#define PDU_SESSION_TYPE_IPV6 0b010
|
#define PDU_SESSION_TYPE_IPV6 0b010
|
||||||
#define PDU_SESSION_TYPE_IPV4V6 0b011
|
#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 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 IPv6_INTERFACE_ID_LENGTH 8 // interface identifier for the IPv6 link local address
|
||||||
#define SMF_IPv6_LLA_LENGTH 16
|
#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);
|
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);
|
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);
|
nas_pdu_session_req_t *pdu_req = &NAS_PDU_SESSION_REQ(message_p);
|
||||||
pdu_req->pdusession_id = pdusession_id;
|
pdu_req->pdusession_id = pdusession_id;
|
||||||
pdu_req->pdusession_type = 0x91; // 0x91 = IPv4, 0x92 = IPv6, 0x93 = IPv4v6
|
// 24.501: joint PDU session type IEI (0x9-, Table 8.3.1.1.1) and type (9.11.4.11)
|
||||||
pdu_req->sst = nas->uicc->nssai_sst;
|
pdu_req->pdusession_type = 0x90 | t;
|
||||||
pdu_req->sd = nas->uicc->nssai_sd;
|
pdu_req->sst = nssai.sst;
|
||||||
snprintf(pdu_req->dnn, sizeof(pdu_req->dnn), "%s", nas->uicc->dnnStr);
|
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);
|
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) {
|
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");
|
LOG_E(NAS, "NSSAI parameters not match with allowed NSSAI. Couldn't request PDU session.\n");
|
||||||
} else {
|
} 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) {
|
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
|
// Free local message after processing
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
#define __NR_NAS_MSG_SIM_H__
|
#define __NR_NAS_MSG_SIM_H__
|
||||||
|
|
||||||
#include <common/utils/assertions.h>
|
#include <common/utils/assertions.h>
|
||||||
|
#include "common/5g_platform_types.h"
|
||||||
#include <openair3/UICC/usim_interface.h>
|
#include <openair3/UICC/usim_interface.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -113,6 +114,6 @@ void *nas_nrue_task(void *args_p);
|
|||||||
void *nas_nrue(void *args_p);
|
void *nas_nrue(void *args_p);
|
||||||
void nas_init_nrue(int num_ues);
|
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 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__*/
|
#endif /* __NR_NAS_MSG_SIM_H__*/
|
||||||
|
|||||||
Reference in New Issue
Block a user