mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-03 05:23:38 +00:00
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:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user