UE context transfer (#3052)

* [SBI] Handle and store AMF info

* [SBI] Add "target GUAMI" discovery option

* [SBI] Handle UeContextTransfer request and response messages

* [AMF] Handle NF discovery from AMF to AMF

* [AMF] Add UE Context Transfer Request/Response from AMF to AMF

* [SCP] Handle UeContextTransfer

* Follow-up on #3052

* [AMF] force authentication after 'Ue context transfer' for now

* [AMF] force authentication after 'Ue context transfer' for now

---------

Co-authored-by: Sukchan Lee <acetcom@gmail.com>
This commit is contained in:
Matej Gradišar
2024-03-20 23:07:25 +01:00
committed by GitHub
parent ea122da9fc
commit e1820e4e54
24 changed files with 1352 additions and 5 deletions

View File

@@ -189,6 +189,10 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message)
OpenAPI_sec_negotiate_req_data_free(message->SecNegotiateReqData);
if (message->SecNegotiateRspData)
OpenAPI_sec_negotiate_rsp_data_free(message->SecNegotiateRspData);
if (message->UeContextTransferReqData)
OpenAPI_ue_context_transfer_req_data_free(message->UeContextTransferReqData);
if (message->UeContextTransferRspData)
OpenAPI_ue_context_transfer_rsp_data_free(message->UeContextTransferRspData);
/* HTTP Part */
for (i = 0; i < message->num_of_part; i++) {
@@ -282,6 +286,7 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
int i;
ogs_sbi_request_t *request = NULL;
OpenAPI_nf_type_e nf_type = OpenAPI_nf_type_NULL;
char sender_timestamp[OGS_SBI_RFC7231_DATE_LEN];
char *max_rsp_time = NULL;
@@ -389,6 +394,18 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID,
discovery_option->requester_nf_instance_id);
}
if (discovery_option->target_guami) {
char *v = ogs_sbi_discovery_option_build_guami(discovery_option);
if (v) {
ogs_sbi_header_set(request->http.params,
OGS_SBI_PARAM_GUAMI, v);
ogs_free(v);
} else {
ogs_warn("build failed: service-names[%d:%s]",
discovery_option->num_of_service_names,
discovery_option->service_names[0]);
}
}
if (ogs_sbi_self()->discovery_config.no_service_names == false &&
discovery_option->num_of_service_names) {
@@ -817,9 +834,14 @@ int ogs_sbi_parse_request(
ogs_sbi_discovery_option_parse_snssais(discovery_option, v);
discovery_option_presence = true;
}
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_GUAMI)) {
char *v = ogs_hash_this_val(hi);
if (v) {
ogs_sbi_discovery_option_parse_guami(discovery_option, v);
discovery_option_presence = true;
}
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_DNN)) {
char *v = ogs_hash_this_val(hi);
if (v) {
ogs_sbi_discovery_option_set_dnn(discovery_option, v);
discovery_option_presence = true;
@@ -1340,6 +1362,14 @@ static char *build_json(ogs_sbi_message_t *message)
item = OpenAPI_sec_negotiate_rsp_data_convertToJSON(
message->SecNegotiateRspData);
ogs_assert(item);
} else if (message->UeContextTransferReqData) {
item = OpenAPI_ue_context_transfer_req_data_convertToJSON(
message->UeContextTransferReqData);
ogs_assert(item);
} else if (message->UeContextTransferRspData) {
item = OpenAPI_ue_context_transfer_rsp_data_convertToJSON(
message->UeContextTransferRspData);
ogs_assert(item);
}
if (item) {
@@ -2082,6 +2112,27 @@ static int parse_json(ogs_sbi_message_t *message,
}
break;
CASE(OGS_SBI_RESOURCE_NAME_TRANSFER)
if (message->res_status == 0) {
message->UeContextTransferReqData =
OpenAPI_ue_context_transfer_req_data_parseFromJSON(item);
if (!message->UeContextTransferReqData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else if (message->res_status == OGS_SBI_HTTP_STATUS_OK) {
message->UeContextTransferRspData =
OpenAPI_ue_context_transfer_rsp_data_parseFromJSON(item);
if (!message->UeContextTransferRspData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
DEFAULT
rv = OGS_ERROR;
ogs_error("Unknown resource name [%s]",
@@ -2889,6 +2940,8 @@ void ogs_sbi_discovery_option_free(
ogs_free(discovery_option->requester_nf_instance_id);
if (discovery_option->dnn)
ogs_free(discovery_option->dnn);
if (discovery_option->target_guami)
ogs_free(discovery_option->target_guami);
for (i = 0; i < discovery_option->num_of_service_names; i++)
ogs_free(discovery_option->service_names[i]);
@@ -3129,6 +3182,71 @@ void ogs_sbi_discovery_option_parse_snssais(
ogs_free(v);
}
char *ogs_sbi_discovery_option_build_guami(
ogs_sbi_discovery_option_t *discovery_option)
{
OpenAPI_guami_t *Guami = NULL;
cJSON *guamiItem = NULL;
char *v = NULL;
ogs_assert(discovery_option);
ogs_assert(discovery_option->target_guami);
Guami = ogs_sbi_build_guami(discovery_option->target_guami);
ogs_assert(Guami);
guamiItem = OpenAPI_guami_convertToJSON(Guami);
ogs_assert(guamiItem);
ogs_sbi_free_guami(Guami);
v = cJSON_PrintUnformatted(guamiItem);
ogs_expect(v);
cJSON_Delete(guamiItem);
return v;
}
void ogs_sbi_discovery_option_parse_guami(
ogs_sbi_discovery_option_t *discovery_option, char *guami)
{
OpenAPI_guami_t *Guami = NULL;
cJSON *guamItem = NULL;
char *v = NULL;
ogs_assert(discovery_option);
ogs_assert(guami);
v = ogs_sbi_url_decode(guami);
if (!v) {
ogs_error("ogs_sbi_url_decode() failed : guami[%s]", guami);
return;
}
guamItem = cJSON_Parse(v);
if (!guamItem) {
ogs_error("Cannot parse guami[%s]", guami);
ogs_free(v);
return;
}
Guami = OpenAPI_guami_parseFromJSON(guamItem);
if (Guami) {
ogs_guami_t *ogs_guami = NULL;
discovery_option->target_guami = ogs_malloc(sizeof(*ogs_guami));
ogs_assert(discovery_option->target_guami);
ogs_sbi_parse_guami(discovery_option->target_guami, Guami);
OpenAPI_guami_free(Guami);
} else {
ogs_error("OpenAPI_guami_parseFromJSON() failed : guami[%s]",
guami);
}
cJSON_Delete(guamItem);
ogs_free(v);
}
void ogs_sbi_discovery_option_set_tai(
ogs_sbi_discovery_option_t *discovery_option, ogs_5gs_tai_t *tai)
{