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:
Robert Schmidt
2025-11-17 01:09:10 +01:00
parent 9b4898ee57
commit 27e01e081b
12 changed files with 80 additions and 30 deletions

View File

@@ -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;

View File

@@ -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_ */

View File

@@ -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];
}

View File

@@ -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];