Read PDU session configuration and request
Use the new PDU session configuration functionality of the parent commit. It is now possible to request multiple PDU sessions, and to request specific PDU session types. While the new uicc0.pdu_sessions is preferred, it is still possible to use the "legacy" uicc0.dnn/nssai_sst/nssai_sd. The old parameters --default-pdu-id and --extra-pdu-id are not allowed anymore, as it is possible to manually define this in the UE configuration. Correspondingly, fix the use of those options, where applicable. Note: since the default_pdu_id is changed to -1, all interface names will have pX to interface names appended (oaitun_ue1pX). The next commit will correct this.
This commit is contained in:
@@ -1773,8 +1773,9 @@ 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, int t, nssai_t nssai, const char *dnn)
|
||||
void request_pdusession(nr_ue_nas_t *nas, const pdu_session_config_t *pdu)
|
||||
{
|
||||
int t = pdu->type;
|
||||
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",
|
||||
@@ -1782,12 +1783,12 @@ void request_pdusession(nr_ue_nas_t *nas, int pdusession_id, int t, nssai_t nssa
|
||||
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_id = pdu->id;
|
||||
// 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);
|
||||
pdu_req->sst = pdu->nssai.sst;
|
||||
pdu_req->sd = pdu->nssai.sd;
|
||||
snprintf(pdu_req->dnn, sizeof(pdu_req->dnn), "%s", pdu->dnn);
|
||||
itti_send_msg_to_task(TASK_NAS_NRUE, nas->UE_id, message_p);
|
||||
}
|
||||
|
||||
@@ -1873,14 +1874,18 @@ static void handle_registration_accept(nr_ue_nas_t *nas, const uint8_t *pdu_buff
|
||||
send_nas_uplink_data_req(nas, &initialNasMsg);
|
||||
LOG_I(NAS, "Send NAS_UPLINK_DATA_REQ message(RegistrationComplete)\n");
|
||||
}
|
||||
nssai_t ch_nssai = {nas->uicc->nssai_sst, nas->uicc->nssai_sd};
|
||||
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 {
|
||||
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, PDU_SESSION_TYPE_IPV4, nssai, nas->uicc->dnnStr);
|
||||
if (nas->uicc->n_pdu_sessions == 0)
|
||||
LOG_W(SIM, "no PDU sessions to request configured\n");
|
||||
for (const pdu_session_config_t *pdu = nas->uicc->pdu_sessions; pdu < nas->uicc->pdu_sessions + nas->uicc->n_pdu_sessions; ++pdu) {
|
||||
if (get_user_nssai_idx(pdu->nssai, msg.nas_allowed_nssai) < 0) {
|
||||
LOG_E(NAS,
|
||||
"PDU session ID %d NSSAI %d.%d: mismatch for allowed NSSAI. Couldn't request PDU session.\n",
|
||||
pdu->id,
|
||||
pdu->nssai.sst,
|
||||
pdu->nssai.sd);
|
||||
} else {
|
||||
LOG_I(NAS, "requested PDU session ID %d type %d NSSAI %d.%d DNN %s\n", pdu->id, pdu->type, pdu->nssai.sst, pdu->nssai.sd, pdu->dnn);
|
||||
request_pdusession(nas, pdu);
|
||||
}
|
||||
}
|
||||
// Free local message after processing
|
||||
|
||||
@@ -114,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, int type, nssai_t nssai, const char *dnn);
|
||||
void request_pdusession(nr_ue_nas_t *nas, const pdu_session_config_t *pdu);
|
||||
|
||||
#endif /* __NR_NAS_MSG_SIM_H__*/
|
||||
|
||||
@@ -82,7 +82,7 @@ static int config_check_dnn(configmodule_interface_t *cfg, paramdef_t *param)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_pdu_session_configs(int module_id, pdu_session_config_t *configs, int max_len)
|
||||
int get_pdu_session_configs(const char *uiccName, pdu_session_config_t *configs, int max_len)
|
||||
{
|
||||
paramdef_t pdu_sess_params[] = PDU_SESS_PARAMS_DESC;
|
||||
const int npsp = sizeofArray(pdu_sess_params);
|
||||
@@ -92,7 +92,7 @@ int get_pdu_session_configs(int module_id, pdu_session_config_t *configs, int ma
|
||||
"param_def_t array and corresponding checkedparam_t array should have the same size");
|
||||
for (int i = 0; i < sizeofArray(pdu_sess_params); ++i)
|
||||
pdu_sess_params[i].chkPptr = &pdu_sess_params_check[i];
|
||||
int ret = config_getlist(config_get_if(), &pdu_sess_list, pdu_sess_params, sizeofArray(pdu_sess_params), NULL);
|
||||
int ret = config_getlist(config_get_if(), &pdu_sess_list, pdu_sess_params, sizeofArray(pdu_sess_params), uiccName);
|
||||
if (ret < 0) {
|
||||
// couldn't load configuration from pdu_sessions, caller has to handle
|
||||
return -1;
|
||||
|
||||
@@ -31,6 +31,6 @@ typedef struct {
|
||||
char *dnn; // [103]?
|
||||
} pdu_session_config_t;
|
||||
|
||||
int get_pdu_session_configs(int module_id, pdu_session_config_t *configs, int max_len);
|
||||
int get_pdu_session_configs(const char *uiccName, pdu_session_config_t *configs, int max_len);
|
||||
|
||||
#endif /* PDU_SESSION_H_ */
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
*/
|
||||
#include <ctype.h>
|
||||
|
||||
#include "common/platform_constants.h"
|
||||
#include <openair3/UICC/usim_interface.h>
|
||||
#include <openair3/NAS/COMMON/milenage.h>
|
||||
extern uint16_t NB_UE_INST;
|
||||
@@ -76,10 +77,7 @@ uicc_t *init_uicc(char *sectionName) {
|
||||
// key, OPc, sqn, amf don't need to be read from the true USIM
|
||||
int ret = config_get(config_get_if(), uicc_params, sizeofArray(uicc_params), sectionName);
|
||||
AssertFatal(ret >= 0, "configuration couldn't be performed for uicc name: %s", sectionName);
|
||||
LOG_I(SIM,
|
||||
"UICC simulation: IMSI=%s, IMEISV=%s, Ki=%s, OPc=%s, DNN=%s, SST=0x%02x, SD=0x%06x\n",
|
||||
uicc->imsiStr, uicc->imeisvStr, uicc->keyStr, uicc->opcStr,
|
||||
uicc->dnnStr, uicc->nssai_sst, uicc->nssai_sd);
|
||||
LOG_I(SIM, "UICC simulation: IMSI=%s, IMEISV=%s, Ki=%s, OPc=%s\n", uicc->imsiStr, uicc->imeisvStr, uicc->keyStr, uicc->opcStr);
|
||||
to_hex(uicc->keyStr,uicc->key, sizeof(uicc->key) );
|
||||
to_hex(uicc->opcStr,uicc->opc, sizeof(uicc->opc) );
|
||||
to_hex(uicc->sqnStr,uicc->sqn, sizeof(uicc->sqn) );
|
||||
@@ -112,6 +110,36 @@ uicc_t * checkUicc(int Mod_id) {
|
||||
char uiccName[64];
|
||||
sprintf(uiccName,"uicc%d", Mod_id);
|
||||
uiccArray[Mod_id]=(void*)init_uicc(uiccName);
|
||||
uicc_t *uicc = uiccArray[Mod_id];
|
||||
uicc->n_pdu_sessions = get_pdu_session_configs(uiccName, uicc->pdu_sessions, sizeof(uicc->pdu_sessions));
|
||||
if (uicc->n_pdu_sessions > 0) {
|
||||
LOG_I(SIM, "overriding potential %s.dnn/nssai_sst/nssai_sd from %s.pdu_sessions\n", uiccName, uiccName);
|
||||
} else if (uicc->n_pdu_sessions < 0) {
|
||||
// we could not load from "new" pdu_sessions list, so read from "legacy"
|
||||
// config
|
||||
LOG_W(SIM,
|
||||
"loading PDU session parameters from legacy UICC configuration. Please update to use %s.pdu_sessions instead to make this warning disappear\n",
|
||||
uiccName);
|
||||
sleep(3);
|
||||
uicc->n_pdu_sessions = 1;
|
||||
pdu_session_config_t *pdu = &uicc->pdu_sessions[0];
|
||||
AssertFatal(uicc->dnnStr != NULL, "no default DNN, cannot create\n");
|
||||
pdu->id = DEFAULT_NOS1_PDU_ID; // any default would do
|
||||
pdu->dnn = strdup(uicc->dnnStr);
|
||||
pdu->nssai.sst = uicc->nssai_sst;
|
||||
pdu->nssai.sd = uicc->nssai_sd;
|
||||
pdu->type = 1; /* = PDU_SESSION_TYPE_IPV4 */
|
||||
} // else: uicc->n_pdu_sessions == 0 => don't request a PDU session
|
||||
for (int i = 0; i < uicc->n_pdu_sessions; ++i) {
|
||||
const pdu_session_config_t *pdu = &uicc->pdu_sessions[i];
|
||||
LOG_I(SIM,
|
||||
"will request PDU session ID %d, type %d, DNN %s, NSSAI %d.%6x\n",
|
||||
pdu->id,
|
||||
pdu->type,
|
||||
pdu->dnn,
|
||||
pdu->nssai.sst,
|
||||
pdu->nssai.sd);
|
||||
}
|
||||
}
|
||||
return (uicc_t*) uiccArray[Mod_id];
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <common/utils/load_module_shlib.h>
|
||||
#include <common/config/config_userapi.h>
|
||||
#include "common_lib.h"
|
||||
#include "pdu_session.h"
|
||||
|
||||
/* 3GPP glossary
|
||||
RES RESponse
|
||||
@@ -53,6 +54,8 @@ typedef struct {
|
||||
char *dnnStr;
|
||||
int nssai_sst;
|
||||
int nssai_sd;
|
||||
pdu_session_config_t pdu_sessions[256];
|
||||
int n_pdu_sessions;
|
||||
uint8_t key[16];
|
||||
uint8_t opc[16];
|
||||
uint8_t amf[2];
|
||||
|
||||
Reference in New Issue
Block a user