[SEPP] Initial Update for 5G Roaming (#2739)

[SEPP] Initial Update for 5G Roaming
This commit is contained in:
Sukchan Lee 2023-11-19 19:34:51 +09:00 committed by GitHub
parent e12b1be313
commit e92293e0af
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
324 changed files with 26622 additions and 14319 deletions

View file

@ -34,21 +34,26 @@ uint32_t ogs_plmn_id_hexdump(void *plmn_id)
uint16_t ogs_plmn_id_mcc(ogs_plmn_id_t *plmn_id)
{
ogs_assert(plmn_id);
return plmn_id->mcc1 * 100 + plmn_id->mcc2 * 10 + plmn_id->mcc3;
}
uint16_t ogs_plmn_id_mnc(ogs_plmn_id_t *plmn_id)
{
ogs_assert(plmn_id);
return plmn_id->mnc1 == 0xf ? plmn_id->mnc2 * 10 + plmn_id->mnc3 :
plmn_id->mnc1 * 100 + plmn_id->mnc2 * 10 + plmn_id->mnc3;
}
uint16_t ogs_plmn_id_mnc_len(ogs_plmn_id_t *plmn_id)
{
ogs_assert(plmn_id);
return plmn_id->mnc1 == 0xf ? 2 : 3;
}
void *ogs_plmn_id_build(ogs_plmn_id_t *plmn_id,
uint16_t mcc, uint16_t mnc, uint16_t mnc_len)
{
ogs_assert(plmn_id);
plmn_id->mcc1 = PLMN_ID_DIGIT1(mcc);
plmn_id->mcc2 = PLMN_ID_DIGIT2(mcc);
plmn_id->mcc3 = PLMN_ID_DIGIT3(mcc);
@ -67,6 +72,9 @@ void *ogs_plmn_id_build(ogs_plmn_id_t *plmn_id,
void *ogs_nas_from_plmn_id(
ogs_nas_plmn_id_t *ogs_nas_plmn_id, ogs_plmn_id_t *plmn_id)
{
ogs_assert(ogs_nas_plmn_id);
ogs_assert(plmn_id);
memcpy(ogs_nas_plmn_id, plmn_id, OGS_PLMN_ID_LEN);
if (plmn_id->mnc1 != 0xf) {
ogs_nas_plmn_id->mnc1 = plmn_id->mnc1;
@ -78,6 +86,9 @@ void *ogs_nas_from_plmn_id(
void *ogs_nas_to_plmn_id(
ogs_plmn_id_t *plmn_id, ogs_nas_plmn_id_t *ogs_nas_plmn_id)
{
ogs_assert(plmn_id);
ogs_assert(ogs_nas_plmn_id);
memcpy(plmn_id, ogs_nas_plmn_id, OGS_PLMN_ID_LEN);
if (plmn_id->mnc1 != 0xf) {
plmn_id->mnc1 = ogs_nas_plmn_id->mnc1;
@ -87,13 +98,6 @@ void *ogs_nas_to_plmn_id(
return plmn_id;
}
char *ogs_serving_network_name_from_plmn_id(ogs_plmn_id_t *plmn_id)
{
ogs_assert(plmn_id);
return ogs_msprintf("5G:mnc%03d.mcc%03d.3gppnetwork.org",
ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id));
}
char *ogs_plmn_id_mcc_string(ogs_plmn_id_t *plmn_id)
{
ogs_assert(plmn_id);
@ -124,6 +128,110 @@ char *ogs_plmn_id_to_string(ogs_plmn_id_t *plmn_id, char *buf)
return buf;
}
#define FQDN_3GPPNETWORK_ORG ".3gppnetwork.org"
#define FQDN_5GC_MNC "5gc.mnc"
#define FQDN_MCC ".mcc"
char *ogs_serving_network_name_from_plmn_id(ogs_plmn_id_t *plmn_id)
{
ogs_assert(plmn_id);
return ogs_msprintf("5G:mnc%03d.mcc%03d" FQDN_3GPPNETWORK_ORG,
ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id));
}
char *ogs_home_network_domain_from_plmn_id(ogs_plmn_id_t *plmn_id)
{
ogs_assert(plmn_id);
return ogs_msprintf("5gc.mnc%03d.mcc%03d" FQDN_3GPPNETWORK_ORG,
ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id));
}
char *ogs_nrf_fqdn_from_plmn_id(ogs_plmn_id_t *plmn_id)
{
return ogs_msprintf("nrf.5gc.mnc%03d.mcc%03d" FQDN_3GPPNETWORK_ORG,
ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id));
}
char *ogs_nssf_fqdn_from_plmn_id(ogs_plmn_id_t *plmn_id)
{
return ogs_msprintf("nssf.5gc.mnc%03d.mcc%03d" FQDN_3GPPNETWORK_ORG,
ogs_plmn_id_mnc(plmn_id), ogs_plmn_id_mcc(plmn_id));
}
char *ogs_home_network_domain_from_fqdn(char *fqdn)
{
char *p = NULL;
ogs_assert(fqdn);
if (strlen(fqdn) <
strlen(FQDN_5GC_MNC "XXX" FQDN_MCC "XXX" FQDN_3GPPNETWORK_ORG)) {
return NULL;
}
p = fqdn + strlen(fqdn);
if (strncmp(p - strlen(FQDN_3GPPNETWORK_ORG),
FQDN_3GPPNETWORK_ORG, strlen(FQDN_3GPPNETWORK_ORG)) != 0) {
return NULL;
}
p -= (strlen(FQDN_3GPPNETWORK_ORG) + 3);
if (strncmp(p - strlen(FQDN_MCC),
FQDN_MCC, strlen(FQDN_MCC)) != 0) {
return NULL;
}
p -= (strlen(FQDN_MCC) + 3);
if (strncmp(p - strlen(FQDN_5GC_MNC),
FQDN_5GC_MNC, strlen(FQDN_5GC_MNC)) != 0) {
return NULL;
}
return p - strlen(FQDN_5GC_MNC);
}
uint16_t ogs_plmn_id_mcc_from_fqdn(char *fqdn)
{
char mcc[4];
char *p = NULL;
ogs_assert(fqdn);
p = ogs_home_network_domain_from_fqdn(fqdn);
if (p == NULL) {
ogs_error("Invalid FQDN [%d:%s]", (int)strlen(fqdn), fqdn);
return 0;
}
p += strlen(FQDN_5GC_MNC) + 3 + strlen(FQDN_MCC);
memcpy(mcc, p, 3);
mcc[3] = 0;
return atoi(mcc);
}
uint16_t ogs_plmn_id_mnc_from_fqdn(char *fqdn)
{
char mnc[4];
char *p = NULL;
ogs_assert(fqdn);
p = ogs_home_network_domain_from_fqdn(fqdn);
if (p == NULL) {
ogs_error("Invalid FQDN [%d:%s]", (int)strlen(fqdn), fqdn);
return 0;
}
p += strlen(FQDN_5GC_MNC);
memcpy(mnc, p, 3);
mnc[3] = 0;
return atoi(mnc);
}
uint32_t ogs_amf_id_hexdump(ogs_amf_id_t *amf_id)
{
uint32_t hex;
@ -617,6 +725,47 @@ int ogs_ipv6prefix_from_string(uint8_t *addr6, uint8_t *prefixlen, char *string)
return OGS_OK;
}
int ogs_check_br_conf(ogs_bitrate_t *br)
{
ogs_assert(br);
if (br->downlink == 0) {
ogs_error("No Downlink");
return OGS_ERROR;
}
if (br->uplink == 0) {
ogs_error("No Uplink");
return OGS_ERROR;
}
return OGS_OK;
}
int ogs_check_qos_conf(ogs_qos_t *qos)
{
ogs_assert(qos);
if (!qos->index) {
ogs_error("No QCI");
return OGS_ERROR;
}
if (!qos->arp.priority_level) {
ogs_error("No Priority Level");
return OGS_ERROR;
}
if (!qos->arp.pre_emption_capability) {
ogs_error("No Pre-emption Capability");
return OGS_ERROR;
}
if (!qos->arp.pre_emption_vulnerability) {
ogs_error("No Pre-emption Vulnerability ");
return OGS_ERROR;
}
return OGS_OK;
}
int ogs_sockaddr_to_user_plane_ip_resource_info(
ogs_sockaddr_t *addr, ogs_sockaddr_t *addr6,
ogs_user_plane_ip_resource_info_t *info)
@ -713,19 +862,6 @@ void ogs_subscription_data_free(ogs_subscription_data_t *subscription_data)
subscription_data->num_of_msisdn = 0;
}
void ogs_session_data_free(ogs_session_data_t *session_data)
{
int i;
ogs_assert(session_data);
if (session_data->session.name)
ogs_free(session_data->session.name);
for (i = 0; i < session_data->num_of_pcc_rule; i++)
OGS_PCC_RULE_FREE(&session_data->pcc_rule[i]);
}
void ogs_ims_data_free(ogs_ims_data_t *ims_data)
{
int i, j, k;