mirror of
https://github.com/open5gs/open5gs.git
synced 2026-05-05 15:24:14 +00:00
[SEPP] Initial Update for 5G Roaming (#2739)
[SEPP] Initial Update for 5G Roaming
This commit is contained in:
parent
e12b1be313
commit
e92293e0af
324 changed files with 26622 additions and 14319 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue