Review ogs_expect() (#314)
This commit is contained in:
parent
2cd9f496e2
commit
636170e0da
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtp-tlv.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2019-09-26 22:10:18.839117 by acetcom
|
||||
* Created on: 2019-11-30 15:13:18.975101 by acetcom
|
||||
* from 29274-d80.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -2916,134 +2916,133 @@ int ogs_gtp_parse_msg(ogs_gtp_message_t *gtp_message, ogs_pkbuf_t *pkbuf)
|
|||
return rv;
|
||||
}
|
||||
|
||||
int ogs_gtp_build_msg(ogs_pkbuf_t **pkbuf, ogs_gtp_message_t *gtp_message)
|
||||
ogs_pkbuf_t *ogs_gtp_build_msg(ogs_gtp_message_t *gtp_message)
|
||||
{
|
||||
int rv = OGS_ERROR;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(gtp_message);
|
||||
switch(gtp_message->h.type)
|
||||
{
|
||||
case OGS_GTP_ECHO_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_echo_request,
|
||||
>p_message->echo_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_ECHO_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_echo_response,
|
||||
>p_message->echo_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_SESSION_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_create_session_request,
|
||||
>p_message->create_session_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_SESSION_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_create_session_response,
|
||||
>p_message->create_session_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_BEARER_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_modify_bearer_request,
|
||||
>p_message->modify_bearer_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_BEARER_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_modify_bearer_response,
|
||||
>p_message->modify_bearer_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_SESSION_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_delete_session_request,
|
||||
>p_message->delete_session_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_SESSION_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_delete_session_response,
|
||||
>p_message->delete_session_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_BEARER_COMMAND_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_modify_bearer_command,
|
||||
>p_message->modify_bearer_command, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_BEARER_FAILURE_INDICATION_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_modify_bearer_failure_indication,
|
||||
>p_message->modify_bearer_failure_indication, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_COMMAND_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_delete_bearer_command,
|
||||
>p_message->delete_bearer_command, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_FAILURE_INDICATION_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_delete_bearer_failure_indication,
|
||||
>p_message->delete_bearer_failure_indication, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_FAILURE_INDICATION_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_downlink_data_notification_failure_indication,
|
||||
>p_message->downlink_data_notification_failure_indication, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_BEARER_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_create_bearer_request,
|
||||
>p_message->create_bearer_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_BEARER_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_create_bearer_response,
|
||||
>p_message->create_bearer_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_UPDATE_BEARER_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_update_bearer_request,
|
||||
>p_message->update_bearer_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_UPDATE_BEARER_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_update_bearer_response,
|
||||
>p_message->update_bearer_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_delete_bearer_request,
|
||||
>p_message->delete_bearer_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_delete_bearer_response,
|
||||
>p_message->delete_bearer_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_create_indirect_data_forwarding_tunnel_request,
|
||||
>p_message->create_indirect_data_forwarding_tunnel_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_create_indirect_data_forwarding_tunnel_response,
|
||||
>p_message->create_indirect_data_forwarding_tunnel_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_delete_indirect_data_forwarding_tunnel_request,
|
||||
>p_message->delete_indirect_data_forwarding_tunnel_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_delete_indirect_data_forwarding_tunnel_response,
|
||||
>p_message->delete_indirect_data_forwarding_tunnel_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_release_access_bearers_request,
|
||||
>p_message->release_access_bearers_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_release_access_bearers_response,
|
||||
>p_message->release_access_bearers_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_downlink_data_notification,
|
||||
>p_message->downlink_data_notification, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_downlink_data_notification_acknowledge,
|
||||
>p_message->downlink_data_notification_acknowledge, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_ACCESS_BEARERS_REQUEST_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_modify_access_bearers_request,
|
||||
>p_message->modify_access_bearers_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_ACCESS_BEARERS_RESPONSE_TYPE:
|
||||
rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_modify_access_bearers_response,
|
||||
>p_message->modify_access_bearers_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
default:
|
||||
ogs_warn("Not implmeneted(type:%d)", gtp_message->h.type);
|
||||
break;
|
||||
switch(gtp_message->h.type) {
|
||||
case OGS_GTP_ECHO_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_echo_request,
|
||||
>p_message->echo_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_ECHO_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_echo_response,
|
||||
>p_message->echo_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_SESSION_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_create_session_request,
|
||||
>p_message->create_session_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_SESSION_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_create_session_response,
|
||||
>p_message->create_session_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_BEARER_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_modify_bearer_request,
|
||||
>p_message->modify_bearer_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_BEARER_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_modify_bearer_response,
|
||||
>p_message->modify_bearer_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_SESSION_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_delete_session_request,
|
||||
>p_message->delete_session_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_SESSION_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_delete_session_response,
|
||||
>p_message->delete_session_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_BEARER_COMMAND_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_modify_bearer_command,
|
||||
>p_message->modify_bearer_command, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_BEARER_FAILURE_INDICATION_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_modify_bearer_failure_indication,
|
||||
>p_message->modify_bearer_failure_indication, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_COMMAND_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_delete_bearer_command,
|
||||
>p_message->delete_bearer_command, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_FAILURE_INDICATION_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_delete_bearer_failure_indication,
|
||||
>p_message->delete_bearer_failure_indication, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_FAILURE_INDICATION_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_downlink_data_notification_failure_indication,
|
||||
>p_message->downlink_data_notification_failure_indication, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_BEARER_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_create_bearer_request,
|
||||
>p_message->create_bearer_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_BEARER_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_create_bearer_response,
|
||||
>p_message->create_bearer_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_UPDATE_BEARER_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_update_bearer_request,
|
||||
>p_message->update_bearer_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_UPDATE_BEARER_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_update_bearer_response,
|
||||
>p_message->update_bearer_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_delete_bearer_request,
|
||||
>p_message->delete_bearer_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_delete_bearer_response,
|
||||
>p_message->delete_bearer_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_create_indirect_data_forwarding_tunnel_request,
|
||||
>p_message->create_indirect_data_forwarding_tunnel_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_create_indirect_data_forwarding_tunnel_response,
|
||||
>p_message->create_indirect_data_forwarding_tunnel_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_delete_indirect_data_forwarding_tunnel_request,
|
||||
>p_message->delete_indirect_data_forwarding_tunnel_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_delete_indirect_data_forwarding_tunnel_response,
|
||||
>p_message->delete_indirect_data_forwarding_tunnel_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_release_access_bearers_request,
|
||||
>p_message->release_access_bearers_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_release_access_bearers_response,
|
||||
>p_message->release_access_bearers_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_downlink_data_notification,
|
||||
>p_message->downlink_data_notification, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_downlink_data_notification_acknowledge,
|
||||
>p_message->downlink_data_notification_acknowledge, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_ACCESS_BEARERS_REQUEST_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_modify_access_bearers_request,
|
||||
>p_message->modify_access_bearers_request, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
case OGS_GTP_MODIFY_ACCESS_BEARERS_RESPONSE_TYPE:
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_modify_access_bearers_response,
|
||||
>p_message->modify_access_bearers_response, OGS_TLV_MODE_T1_L2_I1);
|
||||
break;
|
||||
default:
|
||||
ogs_warn("Not implmeneted(type:%d)", gtp_message->h.type);
|
||||
break;
|
||||
}
|
||||
|
||||
return rv;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by gtp-tlv.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2019-09-26 22:10:18.823195 by acetcom
|
||||
* Created on: 2019-11-30 15:13:18.956844 by acetcom
|
||||
* from 29274-d80.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -1169,7 +1169,7 @@ typedef struct ogs_gtp_message_s {
|
|||
} ogs_gtp_message_t;
|
||||
|
||||
int ogs_gtp_parse_msg(ogs_gtp_message_t *gtp_message, ogs_pkbuf_t *pkbuf);
|
||||
int ogs_gtp_build_msg(ogs_pkbuf_t **pkbuf, ogs_gtp_message_t *gtp_message);
|
||||
ogs_pkbuf_t *ogs_gtp_build_msg(ogs_gtp_message_t *gtp_message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -273,13 +273,13 @@ void ogs_gtp_send_error_message(
|
|||
tlv->len = sizeof(cause);
|
||||
tlv->data = &cause;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, &errmsg);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(&errmsg);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &errmsg.h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
|
|
|
@ -523,7 +523,7 @@ f.write(" };\n");
|
|||
f.write("} ogs_gtp_message_t;\n\n")
|
||||
|
||||
f.write("""int ogs_gtp_parse_msg(ogs_gtp_message_t *gtp_message, ogs_pkbuf_t *pkbuf);
|
||||
int ogs_gtp_build_msg(ogs_pkbuf_t **pkbuf, ogs_gtp_message_t *gtp_message);
|
||||
ogs_pkbuf_t *ogs_gtp_build_msg(ogs_gtp_message_t *gtp_message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -647,26 +647,25 @@ f.write(""" default:
|
|||
|
||||
""")
|
||||
|
||||
f.write("""int ogs_gtp_build_msg(ogs_pkbuf_t **pkbuf, ogs_gtp_message_t *gtp_message)
|
||||
f.write("""ogs_pkbuf_t *ogs_gtp_build_msg(ogs_gtp_message_t *gtp_message)
|
||||
{
|
||||
int rv = OGS_ERROR;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(gtp_message);
|
||||
switch(gtp_message->h.type)
|
||||
{
|
||||
switch(gtp_message->h.type) {
|
||||
""")
|
||||
for (k, v) in sorted_msg_list:
|
||||
if "ies" in msg_list[k]:
|
||||
f.write(" case OGS_GTP_%s_TYPE:\n" % v_upper(k))
|
||||
f.write(" rv = ogs_tlv_build_msg(pkbuf, &ogs_tlv_desc_%s,\n" % v_lower(k))
|
||||
f.write(" >p_message->%s, OGS_TLV_MODE_T1_L2_I1);\n" % v_lower(k))
|
||||
f.write(" break;\n")
|
||||
f.write(""" default:
|
||||
ogs_warn("Not implmeneted(type:%d)", gtp_message->h.type);
|
||||
break;
|
||||
f.write(" case OGS_GTP_%s_TYPE:\n" % v_upper(k))
|
||||
f.write(" pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_%s,\n" % v_lower(k))
|
||||
f.write(" >p_message->%s, OGS_TLV_MODE_T1_L2_I1);\n" % v_lower(k))
|
||||
f.write(" break;\n")
|
||||
f.write(""" default:
|
||||
ogs_warn("Not implmeneted(type:%d)", gtp_message->h.type);
|
||||
break;
|
||||
}
|
||||
|
||||
return rv;
|
||||
return pkbuf;
|
||||
}
|
||||
""")
|
||||
|
||||
|
|
|
@ -253,13 +253,12 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
|
|||
return count;
|
||||
}
|
||||
|
||||
int ogs_tlv_build_msg(ogs_pkbuf_t **pkbuf, ogs_tlv_desc_t *desc, void *msg,
|
||||
int mode)
|
||||
ogs_pkbuf_t *ogs_tlv_build_msg(ogs_tlv_desc_t *desc, void *msg, int mode)
|
||||
{
|
||||
ogs_tlv_t *root = NULL;
|
||||
uint32_t r, length, rendlen;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(pkbuf);
|
||||
ogs_assert(desc);
|
||||
ogs_assert(msg);
|
||||
|
||||
|
@ -270,17 +269,17 @@ int ogs_tlv_build_msg(ogs_pkbuf_t **pkbuf, ogs_tlv_desc_t *desc, void *msg,
|
|||
ogs_assert(r > 0 && root);
|
||||
|
||||
length = ogs_tlv_calc_length(root, mode);
|
||||
*pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM+length);
|
||||
ogs_assert(*pkbuf);
|
||||
ogs_pkbuf_reserve(*pkbuf, OGS_TLV_MAX_HEADROOM);
|
||||
ogs_pkbuf_put(*pkbuf, length);
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM+length);
|
||||
ogs_assert(pkbuf);
|
||||
ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM);
|
||||
ogs_pkbuf_put(pkbuf, length);
|
||||
|
||||
rendlen = ogs_tlv_render(root, (*pkbuf)->data, length, mode);
|
||||
rendlen = ogs_tlv_render(root, pkbuf->data, length, mode);
|
||||
ogs_assert(rendlen == length);
|
||||
|
||||
ogs_tlv_free_all(root);
|
||||
|
||||
return OGS_OK;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
static ogs_tlv_desc_t* tlv_find_desc(uint8_t *desc_index,
|
||||
|
|
|
@ -155,11 +155,9 @@ typedef struct ogs_tlv_null_s {
|
|||
ogs_tlv_presence_t presence;
|
||||
} ogs_tlv_null_t;
|
||||
|
||||
int ogs_tlv_build_msg(ogs_pkbuf_t **pkbuf, ogs_tlv_desc_t *desc, void *msg,
|
||||
int mode);
|
||||
|
||||
int ogs_tlv_parse_msg(void *msg, ogs_tlv_desc_t *desc, ogs_pkbuf_t *pkbuf,
|
||||
int mode);
|
||||
ogs_pkbuf_t *ogs_tlv_build_msg(ogs_tlv_desc_t *desc, void *msg, int mode);
|
||||
int ogs_tlv_parse_msg(
|
||||
void *msg, ogs_tlv_desc_t *desc, ogs_pkbuf_t *pkbuf, int mode);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
161
lib/gtp/xact.c
161
lib/gtp/xact.c
|
@ -105,7 +105,11 @@ ogs_gtp_xact_t *ogs_gtp_xact_local_create(ogs_gtp_node_t *gnode,
|
|||
&xact->gnode->local_list : &xact->gnode->remote_list, xact);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, hdesc, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_gtp_xact_update_tx() failed");
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ogs_debug("[%d] %s Create peer [%s]:%d",
|
||||
xact->xid,
|
||||
|
@ -185,15 +189,24 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact,
|
|||
if (xact->org == OGS_GTP_LOCAL_ORIGINATOR) {
|
||||
switch (stage) {
|
||||
case GTP_XACT_INITIAL_STAGE:
|
||||
ogs_assert(xact->step == 0);
|
||||
if (xact->step != 0) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
case GTP_XACT_INTERMEDIATE_STAGE:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_expect(0);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
|
||||
case GTP_XACT_FINAL_STAGE:
|
||||
ogs_assert(xact->step == 2);
|
||||
if (xact->step != 2) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -203,20 +216,29 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact,
|
|||
} else if (xact->org == OGS_GTP_REMOTE_ORIGINATOR) {
|
||||
switch (stage) {
|
||||
case GTP_XACT_INITIAL_STAGE:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_expect(0);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
|
||||
case GTP_XACT_INTERMEDIATE_STAGE:
|
||||
case GTP_XACT_FINAL_STAGE:
|
||||
ogs_assert(xact->step == 1);
|
||||
if (xact->step != 1) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_error("invalid stage[%d]", stage);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
} else
|
||||
ogs_assert_if_reached();
|
||||
} else {
|
||||
ogs_error("invalid org[%d]", xact->org);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
ogs_pkbuf_push(pkbuf, OGS_GTPV2C_HEADER_LEN);
|
||||
h = (ogs_gtp_header_t *)pkbuf->data;
|
||||
|
@ -257,14 +279,18 @@ int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
|
|||
if (xact->org == OGS_GTP_LOCAL_ORIGINATOR) {
|
||||
switch (stage) {
|
||||
case GTP_XACT_INITIAL_STAGE:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_expect(0);
|
||||
return OGS_ERROR;
|
||||
|
||||
case GTP_XACT_INTERMEDIATE_STAGE:
|
||||
if (xact->seq[1].type == type) {
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(xact->step == 2 || xact->step == 3);
|
||||
if (xact->step != 2 && xact->step != 3) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
pkbuf = xact->seq[2].pkbuf;
|
||||
if (pkbuf) {
|
||||
|
@ -282,7 +308,7 @@ int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
|
|||
buf),
|
||||
OGS_PORT(&xact->gnode->remote_addr));
|
||||
rv = ogs_gtp_sendto(xact->gnode, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
ogs_warn("[%d] %s Request Duplicated. Discard!"
|
||||
" for step %d type %d peer [%s]:%d",
|
||||
|
@ -298,7 +324,10 @@ int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
|
|||
return OGS_RETRY;
|
||||
}
|
||||
|
||||
ogs_assert(xact->step == 1);
|
||||
if (xact->step != 1) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (xact->tm_holding)
|
||||
ogs_timer_start(
|
||||
|
@ -307,12 +336,15 @@ int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
|
|||
break;
|
||||
|
||||
case GTP_XACT_FINAL_STAGE:
|
||||
ogs_assert(xact->step == 1);
|
||||
if (xact->step != 1) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_error("invalid stage[%d]", stage);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
} else if (xact->org == OGS_GTP_REMOTE_ORIGINATOR) {
|
||||
switch (stage) {
|
||||
|
@ -320,7 +352,10 @@ int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
|
|||
if (xact->seq[0].type == type) {
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(xact->step == 1 || xact->step == 2);
|
||||
if (xact->step != 1 && xact->step != 2) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
pkbuf = xact->seq[1].pkbuf;
|
||||
if (pkbuf) {
|
||||
|
@ -338,7 +373,7 @@ int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
|
|||
buf),
|
||||
OGS_PORT(&xact->gnode->remote_addr));
|
||||
rv = ogs_gtp_sendto(xact->gnode, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
ogs_warn("[%d] %s Request Duplicated. Discard!"
|
||||
" for step %d type %d peer [%s]:%d",
|
||||
|
@ -354,7 +389,10 @@ int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
|
|||
return OGS_RETRY;
|
||||
}
|
||||
|
||||
ogs_assert(xact->step == 0);
|
||||
if (xact->step != 0) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
if (xact->tm_holding)
|
||||
ogs_timer_start(
|
||||
xact->tm_holding, GTP_T3_DUPLICATED_DURATION);
|
||||
|
@ -362,21 +400,26 @@ int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
|
|||
break;
|
||||
|
||||
case GTP_XACT_INTERMEDIATE_STAGE:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_expect(0);
|
||||
return OGS_ERROR;
|
||||
|
||||
case GTP_XACT_FINAL_STAGE:
|
||||
ogs_assert(xact->step == 2);
|
||||
if (xact->step != 2) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
/* continue */
|
||||
break;
|
||||
|
||||
default:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_error("invalid stage[%d]", stage);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
} else
|
||||
ogs_assert_if_reached();
|
||||
} else {
|
||||
ogs_error("invalid org[%d]", xact->org);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (xact->tm_response)
|
||||
ogs_timer_stop(xact->tm_response);
|
||||
|
@ -415,20 +458,28 @@ int ogs_gtp_xact_commit(ogs_gtp_xact_t *xact)
|
|||
if (xact->org == OGS_GTP_LOCAL_ORIGINATOR) {
|
||||
switch (stage) {
|
||||
case GTP_XACT_INITIAL_STAGE:
|
||||
ogs_assert(xact->step == 1);
|
||||
if (xact->step != 1) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (xact->tm_response)
|
||||
ogs_timer_start(
|
||||
xact->tm_response, GTP_T3_RESPONSE_DURATION);
|
||||
ogs_timer_start(xact->tm_response, GTP_T3_RESPONSE_DURATION);
|
||||
|
||||
break;
|
||||
|
||||
case GTP_XACT_INTERMEDIATE_STAGE:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_expect(0);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
|
||||
case GTP_XACT_FINAL_STAGE:
|
||||
ogs_assert(xact->step == 2 || xact->step == 3);
|
||||
if (xact->step != 2 && xact->step != 3) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
if (xact->step == 2) {
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_OK;
|
||||
|
@ -437,17 +488,23 @@ int ogs_gtp_xact_commit(ogs_gtp_xact_t *xact)
|
|||
break;
|
||||
|
||||
default:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_error("invalid stage[%d]", stage);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
} else if (xact->org == OGS_GTP_REMOTE_ORIGINATOR) {
|
||||
switch (stage) {
|
||||
case GTP_XACT_INITIAL_STAGE:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_expect(0);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
|
||||
case GTP_XACT_INTERMEDIATE_STAGE:
|
||||
ogs_assert(xact->step == 2);
|
||||
if (xact->step != 2) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
if (xact->tm_response)
|
||||
ogs_timer_start(
|
||||
xact->tm_response, GTP_T3_RESPONSE_DURATION);
|
||||
|
@ -455,7 +512,11 @@ int ogs_gtp_xact_commit(ogs_gtp_xact_t *xact)
|
|||
break;
|
||||
|
||||
case GTP_XACT_FINAL_STAGE:
|
||||
ogs_assert(xact->step == 2 || xact->step == 3);
|
||||
if (xact->step != 2 && xact->step != 3) {
|
||||
ogs_error("invalid step[%d]", xact->step);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
if (xact->step == 3) {
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_OK;
|
||||
|
@ -464,17 +525,21 @@ int ogs_gtp_xact_commit(ogs_gtp_xact_t *xact)
|
|||
break;
|
||||
|
||||
default:
|
||||
ogs_assert_if_reached();
|
||||
break;
|
||||
ogs_error("invalid stage[%d]", stage);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
} else
|
||||
ogs_assert_if_reached();
|
||||
} else {
|
||||
ogs_error("invalid org[%d]", xact->org);
|
||||
ogs_gtp_xact_delete(xact);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
pkbuf = xact->seq[xact->step-1].pkbuf;
|
||||
ogs_assert(pkbuf);
|
||||
|
||||
rv = ogs_gtp_sendto(xact->gnode, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
@ -584,6 +649,8 @@ int ogs_gtp_xact_receive(
|
|||
|
||||
rv = ogs_gtp_xact_update_rx(new, h->type);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_gtp_xact_update_rx() failed");
|
||||
ogs_gtp_xact_delete(new);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,8 +42,9 @@ void ogs_nas_imsi_to_bcd(
|
|||
|
||||
bcd_len = imsi_len * 2 - 1;
|
||||
if (!imsi->odd_even) { /* if bcd length is even */
|
||||
if (bcd[bcd_len] != 0xf)
|
||||
ogs_warn("Spec warning : bcd[%d] = 0x%x", bcd_len, bcd[bcd_len]);
|
||||
if (imsi->digit15 != 0xf)
|
||||
ogs_warn("Spec warning : bcd[%d] = 0x%x, 0x%x",
|
||||
bcd_len-1, imsi->digit15, bcd[bcd_len-1]);
|
||||
(bcd_len)--;
|
||||
}
|
||||
|
||||
|
@ -103,8 +104,10 @@ void ogs_nas_imeisv_to_bcd(
|
|||
|
||||
bcd_len = imeisv_len * 2 - 1;
|
||||
if (!imeisv->odd_even) { /* if bcd length is even */
|
||||
if (bcd[bcd_len] != 0xf)
|
||||
ogs_warn("Spec warning : bcd[%d] = 0x%x", bcd_len, bcd[bcd_len]);
|
||||
if (imeisv->digit17 != 0xf) {
|
||||
ogs_warn("Spec warning : bcd[%d] = 0x%x, 0x%x",
|
||||
bcd_len-1, imeisv->digit17, bcd[bcd_len-1]);
|
||||
}
|
||||
(bcd_len)--;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2019-09-30 22:46:44.508167 by acetcom
|
||||
* Created on: 2019-11-29 20:48:26.777198 by acetcom
|
||||
* from 24301-d80.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2019-09-30 22:46:44.517916 by acetcom
|
||||
* Created on: 2019-11-29 20:48:26.787333 by acetcom
|
||||
* from 24301-d80.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -3015,8 +3015,9 @@ int ogs_nas_encode_esm_status(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message)
|
|||
return encoded;
|
||||
}
|
||||
|
||||
int ogs_nas_emm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
||||
ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_message_t *message)
|
||||
{
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
int size = 0;
|
||||
int encoded = 0;
|
||||
|
||||
|
@ -3024,23 +3025,23 @@ int ogs_nas_emm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
|||
|
||||
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
|
||||
* When calculating AES_CMAC, we need to use the headroom of the packet. */
|
||||
*pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_assert(*pkbuf);
|
||||
ogs_pkbuf_reserve(*pkbuf, OGS_NAS_HEADROOM);
|
||||
ogs_pkbuf_put(*pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_assert(pkbuf);
|
||||
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
|
||||
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
|
||||
|
||||
size = sizeof(ogs_nas_emm_header_t);
|
||||
ogs_assert(ogs_pkbuf_pull(*pkbuf, size));
|
||||
ogs_assert(ogs_pkbuf_pull(pkbuf, size));
|
||||
|
||||
memcpy((*pkbuf)->data - size, &message->emm.h, size);
|
||||
memcpy(pkbuf->data - size, &message->emm.h, size);
|
||||
encoded += size;
|
||||
|
||||
if (message->emm.h.security_header_type >=
|
||||
OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE)
|
||||
{
|
||||
ogs_assert(ogs_pkbuf_push(*pkbuf, 1));
|
||||
ogs_assert(ogs_pkbuf_push(pkbuf, 1));
|
||||
encoded -= 1;
|
||||
size = ogs_nas_encode_service_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_service_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
|
||||
|
@ -3050,160 +3051,161 @@ int ogs_nas_emm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
|||
switch(message->emm.h.message_type)
|
||||
{
|
||||
case OGS_NAS_ATTACH_REQUEST:
|
||||
size = ogs_nas_encode_attach_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_attach_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ATTACH_ACCEPT:
|
||||
size = ogs_nas_encode_attach_accept(*pkbuf, message);
|
||||
size = ogs_nas_encode_attach_accept(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ATTACH_COMPLETE:
|
||||
size = ogs_nas_encode_attach_complete(*pkbuf, message);
|
||||
size = ogs_nas_encode_attach_complete(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ATTACH_REJECT:
|
||||
size = ogs_nas_encode_attach_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_attach_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_DETACH_REQUEST:
|
||||
size = ogs_nas_encode_detach_request_to_ue(*pkbuf, message);
|
||||
size = ogs_nas_encode_detach_request_to_ue(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_DETACH_ACCEPT:
|
||||
break;
|
||||
case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST:
|
||||
size = ogs_nas_encode_tracking_area_update_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_tracking_area_update_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT:
|
||||
size = ogs_nas_encode_tracking_area_update_accept(*pkbuf, message);
|
||||
size = ogs_nas_encode_tracking_area_update_accept(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_TRACKING_AREA_UPDATE_COMPLETE:
|
||||
break;
|
||||
case OGS_NAS_TRACKING_AREA_UPDATE_REJECT:
|
||||
size = ogs_nas_encode_tracking_area_update_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_tracking_area_update_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_EXTENDED_SERVICE_REQUEST:
|
||||
size = ogs_nas_encode_extended_service_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_extended_service_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_SERVICE_REJECT:
|
||||
size = ogs_nas_encode_service_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_service_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_GUTI_REALLOCATION_COMMAND:
|
||||
size = ogs_nas_encode_guti_reallocation_command(*pkbuf, message);
|
||||
size = ogs_nas_encode_guti_reallocation_command(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_GUTI_REALLOCATION_COMPLETE:
|
||||
break;
|
||||
case OGS_NAS_AUTHENTICATION_REQUEST:
|
||||
size = ogs_nas_encode_authentication_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_authentication_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_AUTHENTICATION_RESPONSE:
|
||||
size = ogs_nas_encode_authentication_response(*pkbuf, message);
|
||||
size = ogs_nas_encode_authentication_response(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_AUTHENTICATION_REJECT:
|
||||
break;
|
||||
case OGS_NAS_IDENTITY_REQUEST:
|
||||
size = ogs_nas_encode_identity_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_identity_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_IDENTITY_RESPONSE:
|
||||
size = ogs_nas_encode_identity_response(*pkbuf, message);
|
||||
size = ogs_nas_encode_identity_response(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_AUTHENTICATION_FAILURE:
|
||||
size = ogs_nas_encode_authentication_failure(*pkbuf, message);
|
||||
size = ogs_nas_encode_authentication_failure(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_SECURITY_MODE_COMMAND:
|
||||
size = ogs_nas_encode_security_mode_command(*pkbuf, message);
|
||||
size = ogs_nas_encode_security_mode_command(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_SECURITY_MODE_COMPLETE:
|
||||
size = ogs_nas_encode_security_mode_complete(*pkbuf, message);
|
||||
size = ogs_nas_encode_security_mode_complete(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_SECURITY_MODE_REJECT:
|
||||
size = ogs_nas_encode_security_mode_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_security_mode_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_EMM_STATUS:
|
||||
size = ogs_nas_encode_emm_status(*pkbuf, message);
|
||||
size = ogs_nas_encode_emm_status(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_EMM_INFORMATION:
|
||||
size = ogs_nas_encode_emm_information(*pkbuf, message);
|
||||
size = ogs_nas_encode_emm_information(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_DOWNLINK_NAS_TRANSPORT:
|
||||
size = ogs_nas_encode_downlink_nas_transport(*pkbuf, message);
|
||||
size = ogs_nas_encode_downlink_nas_transport(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_UPLINK_NAS_TRANSPORT:
|
||||
size = ogs_nas_encode_uplink_nas_transport(*pkbuf, message);
|
||||
size = ogs_nas_encode_uplink_nas_transport(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_CS_SERVICE_NOTIFICATION:
|
||||
size = ogs_nas_encode_cs_service_notification(*pkbuf, message);
|
||||
size = ogs_nas_encode_cs_service_notification(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT:
|
||||
size = ogs_nas_encode_uplink_generic_nas_transport(*pkbuf, message);
|
||||
size = ogs_nas_encode_uplink_generic_nas_transport(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT:
|
||||
size = ogs_nas_encode_downlink_generic_nas_transport(*pkbuf, message);
|
||||
size = ogs_nas_encode_downlink_generic_nas_transport(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
default:
|
||||
ogs_error("Unknown message type (0x%x) or not implemented",
|
||||
message->emm.h.message_type);
|
||||
ogs_pkbuf_free((*pkbuf));
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
out:
|
||||
ogs_assert(ogs_pkbuf_push(*pkbuf, encoded));
|
||||
ogs_assert(ogs_pkbuf_push(pkbuf, encoded));
|
||||
|
||||
(*pkbuf)->len = encoded;
|
||||
pkbuf->len = encoded;
|
||||
|
||||
return OGS_OK;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
int ogs_nas_esm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
||||
ogs_pkbuf_t *ogs_nas_esm_encode(ogs_nas_message_t *message)
|
||||
{
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
int size = 0;
|
||||
int encoded = 0;
|
||||
|
||||
|
@ -3211,139 +3213,139 @@ int ogs_nas_esm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
|||
|
||||
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
|
||||
* When calculating AES_CMAC, we need to use the headroom of the packet. */
|
||||
*pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_assert(*pkbuf);
|
||||
ogs_pkbuf_reserve(*pkbuf, OGS_NAS_HEADROOM);
|
||||
ogs_pkbuf_put(*pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_assert(pkbuf);
|
||||
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
|
||||
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
|
||||
|
||||
size = sizeof(ogs_nas_esm_header_t);
|
||||
ogs_assert(ogs_pkbuf_pull(*pkbuf, size));
|
||||
memcpy((*pkbuf)->data - size, &message->esm.h, size);
|
||||
ogs_assert(ogs_pkbuf_pull(pkbuf, size));
|
||||
memcpy(pkbuf->data - size, &message->esm.h, size);
|
||||
encoded += size;
|
||||
|
||||
switch(message->esm.h.message_type)
|
||||
{
|
||||
case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST:
|
||||
size = ogs_nas_encode_activate_default_eps_bearer_context_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_activate_default_eps_bearer_context_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
size = ogs_nas_encode_activate_default_eps_bearer_context_accept(*pkbuf, message);
|
||||
size = ogs_nas_encode_activate_default_eps_bearer_context_accept(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT:
|
||||
size = ogs_nas_encode_activate_default_eps_bearer_context_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_activate_default_eps_bearer_context_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST:
|
||||
size = ogs_nas_encode_activate_dedicated_eps_bearer_context_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_activate_dedicated_eps_bearer_context_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
size = ogs_nas_encode_activate_dedicated_eps_bearer_context_accept(*pkbuf, message);
|
||||
size = ogs_nas_encode_activate_dedicated_eps_bearer_context_accept(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT:
|
||||
size = ogs_nas_encode_activate_dedicated_eps_bearer_context_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_activate_dedicated_eps_bearer_context_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST:
|
||||
size = ogs_nas_encode_modify_eps_bearer_context_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_modify_eps_bearer_context_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
size = ogs_nas_encode_modify_eps_bearer_context_accept(*pkbuf, message);
|
||||
size = ogs_nas_encode_modify_eps_bearer_context_accept(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT:
|
||||
size = ogs_nas_encode_modify_eps_bearer_context_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_modify_eps_bearer_context_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST:
|
||||
size = ogs_nas_encode_deactivate_eps_bearer_context_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_deactivate_eps_bearer_context_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
size = ogs_nas_encode_deactivate_eps_bearer_context_accept(*pkbuf, message);
|
||||
size = ogs_nas_encode_deactivate_eps_bearer_context_accept(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_PDN_CONNECTIVITY_REQUEST:
|
||||
size = ogs_nas_encode_pdn_connectivity_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_pdn_connectivity_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_PDN_CONNECTIVITY_REJECT:
|
||||
size = ogs_nas_encode_pdn_connectivity_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_pdn_connectivity_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_PDN_DISCONNECT_REQUEST:
|
||||
size = ogs_nas_encode_pdn_disconnect_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_pdn_disconnect_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_PDN_DISCONNECT_REJECT:
|
||||
size = ogs_nas_encode_pdn_disconnect_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_pdn_disconnect_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST:
|
||||
size = ogs_nas_encode_bearer_resource_allocation_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_bearer_resource_allocation_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT:
|
||||
size = ogs_nas_encode_bearer_resource_allocation_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_bearer_resource_allocation_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST:
|
||||
size = ogs_nas_encode_bearer_resource_modification_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_bearer_resource_modification_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT:
|
||||
size = ogs_nas_encode_bearer_resource_modification_reject(*pkbuf, message);
|
||||
size = ogs_nas_encode_bearer_resource_modification_reject(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ESM_INFORMATION_REQUEST:
|
||||
break;
|
||||
case OGS_NAS_ESM_INFORMATION_RESPONSE:
|
||||
size = ogs_nas_encode_esm_information_response(*pkbuf, message);
|
||||
size = ogs_nas_encode_esm_information_response(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
case OGS_NAS_ESM_STATUS:
|
||||
size = ogs_nas_encode_esm_status(*pkbuf, message);
|
||||
size = ogs_nas_encode_esm_status(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
break;
|
||||
default:
|
||||
ogs_error("Unknown message type (0x%x) or not implemented",
|
||||
message->esm.h.message_type);
|
||||
ogs_pkbuf_free((*pkbuf));
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ogs_assert(ogs_pkbuf_push(*pkbuf, encoded));
|
||||
(*pkbuf)->len = encoded;
|
||||
ogs_assert(ogs_pkbuf_push(pkbuf, encoded));
|
||||
pkbuf->len = encoded;
|
||||
|
||||
return OGS_OK;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
int ogs_nas_plain_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
||||
ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message)
|
||||
{
|
||||
ogs_assert(message);
|
||||
|
||||
|
@ -3352,12 +3354,10 @@ int ogs_nas_plain_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
|||
|
||||
if (message->emm.h.protocol_discriminator ==
|
||||
OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM)
|
||||
return ogs_nas_emm_encode(pkbuf, message);
|
||||
return ogs_nas_emm_encode(message);
|
||||
else if (message->emm.h.protocol_discriminator ==
|
||||
OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM)
|
||||
return ogs_nas_esm_encode(pkbuf, message);
|
||||
return ogs_nas_esm_encode(message);
|
||||
|
||||
ogs_assert_if_reached();
|
||||
|
||||
return OGS_OK;
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2019-09-30 22:46:44.494712 by acetcom
|
||||
* Created on: 2019-11-29 20:48:26.763343 by acetcom
|
||||
* from 24301-d80.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2019-09-30 22:46:44.492673 by acetcom
|
||||
* Created on: 2019-11-29 20:48:26.761226 by acetcom
|
||||
* from 24301-d80.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/*******************************************************************************
|
||||
* This file had been created by nas-message.py script v0.1.0
|
||||
* Please do not modify this file but regenerate it via script.
|
||||
* Created on: 2019-09-30 22:46:44.500512 by acetcom
|
||||
* Created on: 2019-11-29 20:48:26.769392 by acetcom
|
||||
* from 24301-d80.docx
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -1408,12 +1408,11 @@ typedef struct ogs_nas_message_s {
|
|||
};
|
||||
} ogs_nas_message_t;
|
||||
|
||||
int ogs_nas_emm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message);
|
||||
int ogs_nas_esm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message);
|
||||
ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_message_t *message);
|
||||
ogs_pkbuf_t *ogs_nas_esm_encode(ogs_nas_message_t *message);
|
||||
int ogs_nas_emm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf);
|
||||
int ogs_nas_esm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf);
|
||||
int ogs_nas_plain_encode(
|
||||
ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message);
|
||||
ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -622,12 +622,11 @@ typedef struct ogs_nas_message_s {
|
|||
};
|
||||
} ogs_nas_message_t;
|
||||
|
||||
int ogs_nas_emm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message);
|
||||
int ogs_nas_esm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message);
|
||||
ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_message_t *message);
|
||||
ogs_pkbuf_t *ogs_nas_esm_encode(ogs_nas_message_t *message);
|
||||
int ogs_nas_emm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf);
|
||||
int ogs_nas_esm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf);
|
||||
int ogs_nas_plain_encode(
|
||||
ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message);
|
||||
ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -863,8 +862,9 @@ for (k, v) in sorted_msg_list:
|
|||
""")
|
||||
|
||||
|
||||
f.write("""int ogs_nas_emm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
||||
f.write("""ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_message_t *message)
|
||||
{
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
int size = 0;
|
||||
int encoded = 0;
|
||||
|
||||
|
@ -872,23 +872,23 @@ f.write("""int ogs_nas_emm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *messag
|
|||
|
||||
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
|
||||
* When calculating AES_CMAC, we need to use the headroom of the packet. */
|
||||
*pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_assert(*pkbuf);
|
||||
ogs_pkbuf_reserve(*pkbuf, OGS_NAS_HEADROOM);
|
||||
ogs_pkbuf_put(*pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_assert(pkbuf);
|
||||
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
|
||||
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
|
||||
|
||||
size = sizeof(ogs_nas_emm_header_t);
|
||||
ogs_assert(ogs_pkbuf_pull(*pkbuf, size));
|
||||
ogs_assert(ogs_pkbuf_pull(pkbuf, size));
|
||||
|
||||
memcpy((*pkbuf)->data - size, &message->emm.h, size);
|
||||
memcpy(pkbuf->data - size, &message->emm.h, size);
|
||||
encoded += size;
|
||||
|
||||
if (message->emm.h.security_header_type >=
|
||||
OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE)
|
||||
{
|
||||
ogs_assert(ogs_pkbuf_push(*pkbuf, 1));
|
||||
ogs_assert(ogs_pkbuf_push(pkbuf, 1));
|
||||
encoded -= 1;
|
||||
size = ogs_nas_encode_service_request(*pkbuf, message);
|
||||
size = ogs_nas_encode_service_request(pkbuf, message);
|
||||
ogs_assert(size >= 0);
|
||||
encoded += size;
|
||||
|
||||
|
@ -905,7 +905,7 @@ for (k, v) in sorted_msg_list:
|
|||
if float(msg_list[k]["type"]) < 192 and k.find("FROM UE") == -1 and k != "SERVICE REQUEST":
|
||||
f.write(" case OGS_NAS_%s:\n" % v_upper(k))
|
||||
if len(msg_list[k]["ies"]) != 0:
|
||||
f.write(" size = ogs_nas_encode_%s(*pkbuf, message);\n" % v_lower(k))
|
||||
f.write(" size = ogs_nas_encode_%s(pkbuf, message);\n" % v_lower(k))
|
||||
f.write(" ogs_assert(size >= 0);\n")
|
||||
f.write(" encoded += size;\n")
|
||||
f.write(" break;\n")
|
||||
|
@ -913,22 +913,23 @@ for (k, v) in sorted_msg_list:
|
|||
f.write(""" default:
|
||||
ogs_error("Unknown message type (0x%x) or not implemented",
|
||||
message->emm.h.message_type);
|
||||
ogs_pkbuf_free((*pkbuf));
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
out:
|
||||
ogs_assert(ogs_pkbuf_push(*pkbuf, encoded));
|
||||
ogs_assert(ogs_pkbuf_push(pkbuf, encoded));
|
||||
|
||||
(*pkbuf)->len = encoded;
|
||||
pkbuf->len = encoded;
|
||||
|
||||
return OGS_OK;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
""")
|
||||
|
||||
f.write("""int ogs_nas_esm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
||||
f.write("""ogs_pkbuf_t *ogs_nas_esm_encode(ogs_nas_message_t *message)
|
||||
{
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
int size = 0;
|
||||
int encoded = 0;
|
||||
|
||||
|
@ -936,14 +937,14 @@ f.write("""int ogs_nas_esm_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *messag
|
|||
|
||||
/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM.
|
||||
* When calculating AES_CMAC, we need to use the headroom of the packet. */
|
||||
*pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_assert(*pkbuf);
|
||||
ogs_pkbuf_reserve(*pkbuf, OGS_NAS_HEADROOM);
|
||||
ogs_pkbuf_put(*pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_assert(pkbuf);
|
||||
ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM);
|
||||
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM);
|
||||
|
||||
size = sizeof(ogs_nas_esm_header_t);
|
||||
ogs_assert(ogs_pkbuf_pull(*pkbuf, size));
|
||||
memcpy((*pkbuf)->data - size, &message->esm.h, size);
|
||||
ogs_assert(ogs_pkbuf_pull(pkbuf, size));
|
||||
memcpy(pkbuf->data - size, &message->esm.h, size);
|
||||
encoded += size;
|
||||
|
||||
switch(message->esm.h.message_type)
|
||||
|
@ -956,7 +957,7 @@ for (k, v) in sorted_msg_list:
|
|||
if float(msg_list[k]["type"]) >= 192:
|
||||
f.write(" case OGS_NAS_%s:\n" % v_upper(k))
|
||||
if len(msg_list[k]["ies"]) != 0:
|
||||
f.write(" size = ogs_nas_encode_%s(*pkbuf, message);\n" % v_lower(k))
|
||||
f.write(" size = ogs_nas_encode_%s(pkbuf, message);\n" % v_lower(k))
|
||||
f.write(" ogs_assert(size >= 0);\n")
|
||||
f.write(" encoded += size;\n")
|
||||
f.write(" break;\n")
|
||||
|
@ -964,17 +965,17 @@ for (k, v) in sorted_msg_list:
|
|||
f.write(""" default:
|
||||
ogs_error("Unknown message type (0x%x) or not implemented",
|
||||
message->esm.h.message_type);
|
||||
ogs_pkbuf_free((*pkbuf));
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ogs_assert(ogs_pkbuf_push(*pkbuf, encoded));
|
||||
(*pkbuf)->len = encoded;
|
||||
ogs_assert(ogs_pkbuf_push(pkbuf, encoded));
|
||||
pkbuf->len = encoded;
|
||||
|
||||
return OGS_OK;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
int ogs_nas_plain_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
||||
ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message)
|
||||
{
|
||||
ogs_assert(message);
|
||||
|
||||
|
@ -983,14 +984,12 @@ int ogs_nas_plain_encode(ogs_pkbuf_t **pkbuf, ogs_nas_message_t *message)
|
|||
|
||||
if (message->emm.h.protocol_discriminator ==
|
||||
OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM)
|
||||
return ogs_nas_emm_encode(pkbuf, message);
|
||||
return ogs_nas_emm_encode(message);
|
||||
else if (message->emm.h.protocol_discriminator ==
|
||||
OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM)
|
||||
return ogs_nas_esm_encode(pkbuf, message);
|
||||
return ogs_nas_esm_encode(message);
|
||||
|
||||
ogs_assert_if_reached();
|
||||
|
||||
return OGS_OK;
|
||||
return NULL;
|
||||
}
|
||||
""")
|
||||
|
||||
|
|
|
@ -21,30 +21,32 @@
|
|||
|
||||
int __ogs_s1ap_domain;
|
||||
|
||||
int ogs_s1ap_encode(ogs_pkbuf_t **pkbuf, ogs_s1ap_message_t *message)
|
||||
ogs_pkbuf_t *ogs_s1ap_encode(ogs_s1ap_message_t *message)
|
||||
{
|
||||
asn_enc_rval_t enc_ret = {0};
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(message);
|
||||
|
||||
if (ogs_log_get_domain_level(OGS_LOG_DOMAIN) >= OGS_LOG_TRACE)
|
||||
asn_fprint(stdout, &asn_DEF_S1AP_S1AP_PDU, message);
|
||||
|
||||
*pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_pkbuf_put(*pkbuf, OGS_MAX_SDU_LEN);
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
||||
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN);
|
||||
|
||||
enc_ret = aper_encode_to_buffer(&asn_DEF_S1AP_S1AP_PDU, NULL,
|
||||
message, (*pkbuf)->data, OGS_MAX_SDU_LEN);
|
||||
if (enc_ret.encoded < 0)
|
||||
{
|
||||
message, pkbuf->data, OGS_MAX_SDU_LEN);
|
||||
ogs_s1ap_free(message);
|
||||
|
||||
if (enc_ret.encoded < 0) {
|
||||
ogs_error("Failed to encode S1AP-PDU[%d]", (int)enc_ret.encoded);
|
||||
ogs_pkbuf_free(*pkbuf);
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ogs_pkbuf_trim(*pkbuf, (enc_ret.encoded >> 3));
|
||||
ogs_pkbuf_trim(pkbuf, (enc_ret.encoded >> 3));
|
||||
|
||||
return OGS_OK;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
int ogs_s1ap_decode(ogs_s1ap_message_t *message, ogs_pkbuf_t *pkbuf)
|
||||
|
|
|
@ -53,7 +53,7 @@ extern "C" {
|
|||
typedef struct S1AP_S1AP_PDU ogs_s1ap_message_t;
|
||||
|
||||
int ogs_s1ap_decode(ogs_s1ap_message_t *message, ogs_pkbuf_t *pkbuf);
|
||||
int ogs_s1ap_encode(ogs_pkbuf_t **pkbuf, ogs_s1ap_message_t *message);
|
||||
ogs_pkbuf_t *ogs_s1ap_encode(ogs_s1ap_message_t *message);
|
||||
int ogs_s1ap_free(ogs_s1ap_message_t *message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -25,11 +25,11 @@
|
|||
#undef OGS_LOG_DOMAIN
|
||||
#define OGS_LOG_DOMAIN __emm_log_domain
|
||||
|
||||
int emm_build_attach_accept(
|
||||
ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf)
|
||||
ogs_pkbuf_t *emm_build_attach_accept(
|
||||
mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf)
|
||||
{
|
||||
int rv;
|
||||
ogs_nas_message_t message;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
ogs_nas_attach_accept_t *attach_accept = &message.emm.attach_accept;
|
||||
ogs_nas_eps_attach_result_t *eps_attach_result =
|
||||
&attach_accept->eps_attach_result;
|
||||
|
@ -130,18 +130,17 @@ int emm_build_attach_accept(
|
|||
ogs_debug(" P-TMSI: 0x%08x", tmsi->tmsi);
|
||||
}
|
||||
|
||||
rv = nas_security_encode(emmbuf, mme_ue, &message);
|
||||
ogs_assert(rv == OGS_OK && *emmbuf);
|
||||
pkbuf = nas_security_encode(mme_ue, &message);
|
||||
ogs_pkbuf_free(esmbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
int emm_build_attach_reject(
|
||||
ogs_pkbuf_t **emmbuf, ogs_nas_emm_cause_t emm_cause, ogs_pkbuf_t *esmbuf)
|
||||
ogs_pkbuf_t *emm_build_attach_reject(
|
||||
ogs_nas_emm_cause_t emm_cause, ogs_pkbuf_t *esmbuf)
|
||||
{
|
||||
int rv;
|
||||
ogs_nas_message_t message;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
ogs_nas_attach_reject_t *attach_reject = &message.emm.attach_reject;
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
|
@ -157,20 +156,15 @@ int emm_build_attach_reject(
|
|||
attach_reject->esm_message_container.length = esmbuf->len;
|
||||
}
|
||||
|
||||
rv = ogs_nas_plain_encode(emmbuf, &message);
|
||||
ogs_assert(rv == OGS_OK && *emmbuf);
|
||||
|
||||
if (esmbuf) {
|
||||
pkbuf = ogs_nas_plain_encode(&message);
|
||||
if (esmbuf)
|
||||
ogs_pkbuf_free(esmbuf);
|
||||
}
|
||||
|
||||
return rv;
|
||||
return pkbuf;
|
||||
}
|
||||
|
||||
int emm_build_identity_request(
|
||||
ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *emm_build_identity_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_identity_request_t *identity_request =
|
||||
&message.emm.identity_request;
|
||||
|
@ -185,16 +179,12 @@ int emm_build_identity_request(
|
|||
ogs_debug(" Identity Type 2 : IMSI");
|
||||
identity_request->identity_type.type = OGS_NAS_IDENTITY_TYPE_2_IMSI;
|
||||
|
||||
rv = ogs_nas_plain_encode(emmbuf, &message);
|
||||
ogs_assert(rv == OGS_OK && *emmbuf);
|
||||
|
||||
return rv;
|
||||
return ogs_nas_plain_encode(&message);
|
||||
}
|
||||
|
||||
int emm_build_authentication_request(
|
||||
ogs_pkbuf_t **emmbuf, ogs_diam_e_utran_vector_t *e_utran_vector)
|
||||
ogs_pkbuf_t *emm_build_authentication_request(
|
||||
ogs_diam_e_utran_vector_t *e_utran_vector)
|
||||
{
|
||||
int rv;
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_authentication_request_t *authentication_request =
|
||||
&message.emm.authentication_request;
|
||||
|
@ -212,15 +202,11 @@ int emm_build_authentication_request(
|
|||
authentication_request->authentication_parameter_autn.length =
|
||||
OGS_AUTN_LEN;
|
||||
|
||||
rv = ogs_nas_plain_encode(emmbuf, &message);
|
||||
ogs_assert(rv == OGS_OK && *emmbuf);
|
||||
|
||||
return rv;
|
||||
return ogs_nas_plain_encode(&message);
|
||||
}
|
||||
|
||||
int emm_build_authentication_reject(ogs_pkbuf_t **emmbuf)
|
||||
ogs_pkbuf_t *emm_build_authentication_reject(void)
|
||||
{
|
||||
int rv;
|
||||
ogs_nas_message_t message;
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
|
@ -228,17 +214,11 @@ int emm_build_authentication_reject(ogs_pkbuf_t **emmbuf)
|
|||
message.emm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
|
||||
message.emm.h.message_type = OGS_NAS_AUTHENTICATION_REJECT;
|
||||
|
||||
rv = ogs_nas_plain_encode(emmbuf, &message);
|
||||
ogs_assert(rv == OGS_OK && *emmbuf);
|
||||
|
||||
return rv;
|
||||
return ogs_nas_plain_encode(&message);
|
||||
}
|
||||
|
||||
int emm_build_security_mode_command(
|
||||
ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *emm_build_security_mode_command(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_security_mode_command_t *security_mode_command =
|
||||
&message.emm.security_mode_command;
|
||||
|
@ -314,11 +294,10 @@ int emm_build_security_mode_command(
|
|||
imeisv_request->imeisv_request_value = OGS_NAS_IMEISV_REQUESTED;
|
||||
|
||||
if (mme_ue->selected_int_algorithm == OGS_NAS_SECURITY_ALGORITHMS_EIA0) {
|
||||
ogs_fatal("Encrypt[0x%x] can be skipped with EEA0, "
|
||||
ogs_error("Encrypt[0x%x] can be skipped with EEA0, "
|
||||
"but Integrity[0x%x] cannot be bypassed with EIA0",
|
||||
mme_ue->selected_enc_algorithm, mme_ue->selected_int_algorithm);
|
||||
ogs_assert_if_reached();
|
||||
return OGS_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mme_kdf_nas(MME_KDF_NAS_INT_ALG, mme_ue->selected_int_algorithm,
|
||||
|
@ -326,15 +305,11 @@ int emm_build_security_mode_command(
|
|||
mme_kdf_nas(MME_KDF_NAS_ENC_ALG, mme_ue->selected_enc_algorithm,
|
||||
mme_ue->kasme, mme_ue->knas_enc);
|
||||
|
||||
rv = nas_security_encode(emmbuf, mme_ue, &message);
|
||||
ogs_assert(rv == OGS_OK && *emmbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
||||
int emm_build_detach_accept(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *emm_build_detach_accept(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_nas_message_t message;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
|
@ -350,13 +325,10 @@ int emm_build_detach_accept(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue)
|
|||
message.emm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
|
||||
message.emm.h.message_type = OGS_NAS_DETACH_ACCEPT;
|
||||
|
||||
rv = nas_security_encode(emmbuf, mme_ue, &message);
|
||||
ogs_assert(rv == OGS_OK && emmbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
||||
int emm_build_tau_accept(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue)
|
||||
{
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_tracking_area_update_accept_t *tau_accept =
|
||||
|
@ -449,14 +421,11 @@ int emm_build_tau_accept(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue)
|
|||
tau_accept->eps_network_feature_support.length = 1;
|
||||
tau_accept->eps_network_feature_support.ims_vops = 1;
|
||||
|
||||
ogs_assert(nas_security_encode(emmbuf, mme_ue, &message) == OGS_OK &&
|
||||
*emmbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
||||
int emm_build_tau_reject(ogs_pkbuf_t **emmbuf, ogs_nas_emm_cause_t emm_cause,
|
||||
mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *emm_build_tau_reject(
|
||||
ogs_nas_emm_cause_t emm_cause, mme_ue_t *mme_ue)
|
||||
{
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_tracking_area_update_reject_t *tau_reject =
|
||||
|
@ -474,13 +443,11 @@ int emm_build_tau_reject(ogs_pkbuf_t **emmbuf, ogs_nas_emm_cause_t emm_cause,
|
|||
|
||||
tau_reject->emm_cause = emm_cause;
|
||||
|
||||
ogs_assert(ogs_nas_plain_encode(emmbuf, &message) == OGS_OK && *emmbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_nas_plain_encode(&message);
|
||||
}
|
||||
|
||||
int emm_build_service_reject(ogs_pkbuf_t **emmbuf, ogs_nas_emm_cause_t emm_cause,
|
||||
mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *emm_build_service_reject(
|
||||
ogs_nas_emm_cause_t emm_cause, mme_ue_t *mme_ue)
|
||||
{
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_service_reject_t *service_reject = &message.emm.service_reject;
|
||||
|
@ -496,12 +463,10 @@ int emm_build_service_reject(ogs_pkbuf_t **emmbuf, ogs_nas_emm_cause_t emm_cause
|
|||
|
||||
service_reject->emm_cause = emm_cause;
|
||||
|
||||
ogs_assert(ogs_nas_plain_encode(emmbuf, &message) == OGS_OK && *emmbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_nas_plain_encode(&message);
|
||||
}
|
||||
|
||||
int emm_build_cs_service_notification(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *emm_build_cs_service_notification(mme_ue_t *mme_ue)
|
||||
{
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_cs_service_notification_t *cs_service_notification =
|
||||
|
@ -525,14 +490,11 @@ int emm_build_cs_service_notification(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue)
|
|||
|
||||
/* FIXME : What optional filed should be included in this message? */
|
||||
|
||||
ogs_assert(nas_security_encode(emmbuf, mme_ue, &message) == OGS_OK &&
|
||||
*emmbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
||||
int emm_build_downlink_nas_transport(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue,
|
||||
uint8_t *buffer, uint8_t length)
|
||||
ogs_pkbuf_t *emm_build_downlink_nas_transport(
|
||||
mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length)
|
||||
{
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_downlink_nas_transport_t *downlink_nas_transport =
|
||||
|
@ -553,8 +515,5 @@ int emm_build_downlink_nas_transport(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue,
|
|||
nas_message_container->length = length;
|
||||
memcpy(nas_message_container->buffer, buffer, length);
|
||||
|
||||
ogs_assert(nas_security_encode(emmbuf, mme_ue, &message) == OGS_OK &&
|
||||
*emmbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
|
|
@ -26,33 +26,30 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int emm_build_attach_accept(ogs_pkbuf_t **emmbuf,
|
||||
ogs_pkbuf_t *emm_build_attach_accept(
|
||||
mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf);
|
||||
int emm_build_attach_reject(ogs_pkbuf_t **emmbuf,
|
||||
ogs_pkbuf_t *emm_build_attach_reject(
|
||||
ogs_nas_emm_cause_t emm_cause, ogs_pkbuf_t *esmbuf);
|
||||
|
||||
int emm_build_identity_request(
|
||||
ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue);
|
||||
int emm_build_security_mode_command(
|
||||
ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue);
|
||||
ogs_pkbuf_t *emm_build_identity_request(mme_ue_t *mme_ue);
|
||||
ogs_pkbuf_t *emm_build_security_mode_command(mme_ue_t *mme_ue);
|
||||
|
||||
int emm_build_authentication_request(
|
||||
ogs_pkbuf_t **emmbuf, ogs_diam_e_utran_vector_t *e_utran_vector);
|
||||
int emm_build_authentication_reject(ogs_pkbuf_t **emmbuf);
|
||||
ogs_pkbuf_t *emm_build_authentication_request(
|
||||
ogs_diam_e_utran_vector_t *e_utran_vector);
|
||||
ogs_pkbuf_t *emm_build_authentication_reject(void);
|
||||
|
||||
int emm_build_detach_accept(
|
||||
ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue);
|
||||
ogs_pkbuf_t *emm_build_detach_accept(mme_ue_t *mme_ue);
|
||||
|
||||
int emm_build_tau_accept(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue);
|
||||
int emm_build_tau_reject(ogs_pkbuf_t **emmbuf,
|
||||
ogs_nas_emm_cause_t emm_cause,mme_ue_t *mme_ue);
|
||||
|
||||
int emm_build_service_reject(ogs_pkbuf_t **emmbuf,
|
||||
ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue);
|
||||
ogs_pkbuf_t *emm_build_tau_reject(
|
||||
ogs_nas_emm_cause_t emm_cause, mme_ue_t *mme_ue);
|
||||
|
||||
int emm_build_cs_service_notification(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue);
|
||||
int emm_build_downlink_nas_transport(ogs_pkbuf_t **emmbuf, mme_ue_t *mme_ue,
|
||||
uint8_t *buffer, uint8_t length);
|
||||
ogs_pkbuf_t *emm_build_service_reject(
|
||||
ogs_nas_emm_cause_t emm_cause, mme_ue_t *mme_ue);
|
||||
|
||||
ogs_pkbuf_t *emm_build_cs_service_notification(mme_ue_t *mme_ue);
|
||||
ogs_pkbuf_t *emm_build_downlink_nas_transport(
|
||||
mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -221,7 +221,10 @@ int emm_handle_attach_complete(
|
|||
(int)local.tm_gmtoff);
|
||||
|
||||
rv = nas_send_emm_to_esm(mme_ue, &attach_complete->esm_message_container);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("nas_send_emm_to_esm() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
message.h.security_header_type =
|
||||
|
@ -272,11 +275,9 @@ int emm_handle_attach_complete(
|
|||
&mme_self()->short_name, sizeof(ogs_nas_network_name_t));
|
||||
}
|
||||
|
||||
rv = nas_security_encode(&emmbuf, mme_ue, &message);
|
||||
if (rv == OGS_OK) {
|
||||
ogs_assert(emmbuf);
|
||||
ogs_expect(nas_send_to_downlink_nas_transport(mme_ue, emmbuf) == OGS_OK);
|
||||
}
|
||||
emmbuf = nas_security_encode(mme_ue, &message);
|
||||
if (emmbuf)
|
||||
nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
|
||||
ogs_debug("[EMM] EMM information");
|
||||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
@ -301,15 +302,22 @@ int emm_handle_identity_response(
|
|||
if (mobile_identity->imsi.type == OGS_NAS_IDENTITY_TYPE_2_IMSI) {
|
||||
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
|
||||
|
||||
ogs_assert(sizeof(ogs_nas_mobile_identity_imsi_t) ==
|
||||
mobile_identity->length);
|
||||
if (sizeof(ogs_nas_mobile_identity_imsi_t) != mobile_identity->length) {
|
||||
ogs_error("mobile_identity length (%d != %d)",
|
||||
(int)sizeof(ogs_nas_mobile_identity_imsi_t),
|
||||
mobile_identity->length);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
memcpy(&mme_ue->nas_mobile_identity_imsi,
|
||||
&mobile_identity->imsi, mobile_identity->length);
|
||||
ogs_nas_imsi_to_bcd(
|
||||
&mobile_identity->imsi, mobile_identity->length, imsi_bcd);
|
||||
mme_ue_set_imsi(mme_ue, imsi_bcd);
|
||||
|
||||
ogs_expect(mme_ue->imsi_len);
|
||||
if (mme_ue->imsi_len != OGS_MAX_IMSI_LEN) {
|
||||
ogs_error("Invalid IMSI LEN[%d]", mme_ue->imsi_len);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
} else {
|
||||
ogs_warn("Not supported Identity type[%d]", mobile_identity->imsi.type);
|
||||
}
|
||||
|
|
|
@ -143,8 +143,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
return;
|
||||
}
|
||||
|
||||
rv = s1ap_send_initial_context_setup_request(mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_initial_context_setup_request(mme_ue);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -191,9 +190,8 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!MME_UE_HAVE_IMSI(mme_ue)) {
|
||||
ogs_warn("[EMM] TAU request : Unknown UE");
|
||||
rv = nas_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
nas_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
return;
|
||||
}
|
||||
|
@ -241,7 +239,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
}
|
||||
|
||||
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
|
||||
rv = sgsap_send_detach_indication(mme_ue);
|
||||
sgsap_send_detach_indication(mme_ue);
|
||||
} else {
|
||||
mme_send_delete_session_or_detach(mme_ue);
|
||||
}
|
||||
|
@ -262,11 +260,10 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
MME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id;
|
||||
ENB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id;
|
||||
|
||||
rv = s1ap_send_error_indication(enb_ue->enb,
|
||||
s1ap_send_error_indication(enb_ue->enb,
|
||||
&MME_UE_S1AP_ID, &ENB_UE_S1AP_ID,
|
||||
S1AP_Cause_PR_transport,
|
||||
S1AP_CauseTransport_transport_resource_unavailable);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -339,8 +336,15 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
rv = nas_send_emm_to_esm(mme_ue,
|
||||
&mme_ue->pdn_connectivity_request);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
OGS_FSM_TRAN(s, &emm_state_initial_context_setup);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("nas_send_emm_to_esm() failed");
|
||||
nas_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
} else {
|
||||
OGS_FSM_TRAN(s, &emm_state_initial_context_setup);
|
||||
}
|
||||
} else {
|
||||
if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
|
||||
mme_gtp_send_delete_all_sessions(mme_ue);
|
||||
|
@ -355,9 +359,8 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
|
||||
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
|
||||
rv = nas_send_tau_reject(mme_ue,
|
||||
nas_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
OGS_FSM_TRAN(s, emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -371,21 +374,17 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (procedureCode == S1AP_ProcedureCode_id_initialUEMessage) {
|
||||
ogs_debug(" Iniital UE Message");
|
||||
if (mme_ue->nas_eps.update.active_flag) {
|
||||
rv = nas_send_tau_accept(mme_ue,
|
||||
nas_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_InitialContextSetup);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
rv = nas_send_tau_accept(mme_ue,
|
||||
nas_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_downlinkNASTransport);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
mme_send_release_access_bearer_or_ue_context_release(enb_ue);
|
||||
}
|
||||
} else if (procedureCode == S1AP_ProcedureCode_id_uplinkNASTransport) {
|
||||
ogs_debug(" Uplink NAS Transport");
|
||||
rv = nas_send_tau_accept(mme_ue,
|
||||
nas_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_downlinkNASTransport);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
ogs_fatal("Invalid Procedure Code[%d]", (int)procedureCode);
|
||||
}
|
||||
|
@ -440,8 +439,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
return;
|
||||
}
|
||||
|
||||
rv = s1ap_send_initial_context_setup_request(mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_initial_context_setup_request(mme_ue);
|
||||
|
||||
} else if (procedureCode == S1AP_ProcedureCode_id_uplinkNASTransport) {
|
||||
ogs_debug(" Uplink NAS Transport");
|
||||
|
@ -466,8 +464,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
return;
|
||||
}
|
||||
|
||||
rv = s1ap_send_ue_context_modification_request(mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_ue_context_modification_request(mme_ue);
|
||||
} else {
|
||||
ogs_fatal("Invalid Procedure Code[%d]", (int)procedureCode);
|
||||
}
|
||||
|
@ -525,8 +522,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
|
|||
authentication_response_parameter->length);
|
||||
ogs_log_hexdump(OGS_LOG_WARN,
|
||||
mme_ue->xres, OGS_MAX_RES_LEN);
|
||||
rv = nas_send_authentication_reject(mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
nas_send_authentication_reject(mme_ue);
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
|
||||
} else {
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode);
|
||||
|
@ -569,8 +565,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
|
|||
break;
|
||||
}
|
||||
|
||||
rv = nas_send_authentication_reject(mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
nas_send_authentication_reject(mme_ue);
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
|
||||
|
||||
break;
|
||||
|
@ -751,9 +746,8 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
|
|||
break;
|
||||
case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST:
|
||||
ogs_debug("[EMM] Tracking area update request");
|
||||
rv = nas_send_tau_reject(mme_ue,
|
||||
nas_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
case OGS_NAS_EMM_STATUS:
|
||||
|
|
|
@ -24,8 +24,8 @@
|
|||
#undef OGS_LOG_DOMAIN
|
||||
#define OGS_LOG_DOMAIN __esm_log_domain
|
||||
|
||||
int esm_build_pdn_connectivity_reject(
|
||||
ogs_pkbuf_t **pkbuf, mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause)
|
||||
ogs_pkbuf_t *esm_build_pdn_connectivity_reject(
|
||||
mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
ogs_nas_message_t message;
|
||||
|
@ -54,16 +54,13 @@ int esm_build_pdn_connectivity_reject(
|
|||
pdn_connectivity_reject->esm_cause = esm_cause;
|
||||
|
||||
if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) {
|
||||
ogs_expect(nas_security_encode(pkbuf, mme_ue, &message) == OGS_OK &&
|
||||
*pkbuf);
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
} else {
|
||||
ogs_expect(ogs_nas_plain_encode(pkbuf, &message) == OGS_OK && *pkbuf);
|
||||
return ogs_nas_plain_encode(&message);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int esm_build_information_request(ogs_pkbuf_t **pkbuf, mme_bearer_t *bearer)
|
||||
ogs_pkbuf_t *esm_build_information_request(mme_bearer_t *bearer)
|
||||
{
|
||||
ogs_nas_message_t message;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
@ -88,14 +85,11 @@ int esm_build_information_request(ogs_pkbuf_t **pkbuf, mme_bearer_t *bearer)
|
|||
message.esm.h.procedure_transaction_identity = sess->pti;
|
||||
message.esm.h.message_type = OGS_NAS_ESM_INFORMATION_REQUEST;
|
||||
|
||||
ogs_expect(nas_security_encode(pkbuf, mme_ue, &message) == OGS_OK &&
|
||||
*pkbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
||||
int esm_build_activate_default_bearer_context_request(
|
||||
ogs_pkbuf_t **pkbuf, mme_sess_t *sess)
|
||||
ogs_pkbuf_t *esm_build_activate_default_bearer_context_request(
|
||||
mme_sess_t *sess)
|
||||
{
|
||||
ogs_nas_message_t message;
|
||||
ogs_nas_activate_default_eps_bearer_context_request_t
|
||||
|
@ -171,7 +165,7 @@ int esm_build_activate_default_bearer_context_request(
|
|||
ogs_debug(" IPv4v6");
|
||||
} else {
|
||||
ogs_error("Unexpected PDN Type %u", pdn_address->pdn_type);
|
||||
return OGS_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pdn->ambr.downlink || pdn->ambr.uplink) {
|
||||
|
@ -189,17 +183,14 @@ int esm_build_activate_default_bearer_context_request(
|
|||
}
|
||||
|
||||
if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) {
|
||||
ogs_expect(nas_security_encode(pkbuf, mme_ue, &message) == OGS_OK &&
|
||||
*pkbuf);
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
} else {
|
||||
ogs_expect(ogs_nas_plain_encode(pkbuf, &message) == OGS_OK && *pkbuf);
|
||||
return ogs_nas_plain_encode(&message);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int esm_build_activate_dedicated_bearer_context_request(
|
||||
ogs_pkbuf_t **pkbuf, mme_bearer_t *bearer)
|
||||
ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request(
|
||||
mme_bearer_t *bearer)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_bearer_t *linked_bearer = NULL;
|
||||
|
@ -246,14 +237,11 @@ int esm_build_activate_dedicated_bearer_context_request(
|
|||
ogs_assert(bearer->tft.data);
|
||||
memcpy(tft->buffer, bearer->tft.data, tft->length);
|
||||
|
||||
ogs_expect(nas_security_encode(pkbuf, mme_ue, &message) == OGS_OK &&
|
||||
*pkbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
||||
int esm_build_modify_bearer_context_request(
|
||||
ogs_pkbuf_t **pkbuf, mme_bearer_t *bearer, int qos_presence, int tft_presence)
|
||||
ogs_pkbuf_t *esm_build_modify_bearer_context_request(
|
||||
mme_bearer_t *bearer, int qos_presence, int tft_presence)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
|
@ -303,14 +291,11 @@ int esm_build_modify_bearer_context_request(
|
|||
memcpy(tft->buffer, bearer->tft.data, tft->length);
|
||||
}
|
||||
|
||||
ogs_expect(nas_security_encode(pkbuf, mme_ue, &message) == OGS_OK &&
|
||||
*pkbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
||||
int esm_build_deactivate_bearer_context_request(
|
||||
ogs_pkbuf_t **pkbuf, mme_bearer_t *bearer, ogs_nas_esm_cause_t esm_cause)
|
||||
ogs_pkbuf_t *esm_build_deactivate_bearer_context_request(
|
||||
mme_bearer_t *bearer, ogs_nas_esm_cause_t esm_cause)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
|
@ -342,8 +327,5 @@ int esm_build_deactivate_bearer_context_request(
|
|||
|
||||
deactivate_eps_bearer_context_request->esm_cause = esm_cause;
|
||||
|
||||
ogs_expect(nas_security_encode(pkbuf, mme_ue, &message) == OGS_OK &&
|
||||
*pkbuf);
|
||||
|
||||
return OGS_OK;
|
||||
return nas_security_encode(mme_ue, &message);
|
||||
}
|
||||
|
|
|
@ -26,17 +26,16 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int esm_build_pdn_connectivity_reject(ogs_pkbuf_t **pkbuf,
|
||||
ogs_pkbuf_t *esm_build_pdn_connectivity_reject(
|
||||
mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause);
|
||||
int esm_build_information_request(ogs_pkbuf_t **pkbuf,
|
||||
ogs_pkbuf_t *esm_build_information_request(mme_bearer_t *bearer);
|
||||
ogs_pkbuf_t *esm_build_activate_default_bearer_context_request(
|
||||
mme_sess_t *sess);
|
||||
ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request(
|
||||
mme_bearer_t *bearer);
|
||||
int esm_build_activate_default_bearer_context_request(
|
||||
ogs_pkbuf_t **pkbuf, mme_sess_t *sess);
|
||||
int esm_build_activate_dedicated_bearer_context_request(
|
||||
ogs_pkbuf_t **pkbuf, mme_bearer_t *bearer);
|
||||
int esm_build_modify_bearer_context_request(ogs_pkbuf_t **pkbuf,
|
||||
ogs_pkbuf_t *esm_build_modify_bearer_context_request(
|
||||
mme_bearer_t *bearer, int qos_presence, int tft_presence);
|
||||
int esm_build_deactivate_bearer_context_request(ogs_pkbuf_t **pkbuf,
|
||||
ogs_pkbuf_t *esm_build_deactivate_bearer_context_request(
|
||||
mme_bearer_t *bearer, ogs_nas_esm_cause_t esm_cause);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
||||
ogs_nas_pdn_connectivity_request_t *pdn_connectivity_request)
|
||||
{
|
||||
int rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
uint8_t security_protected_required = 0;
|
||||
|
@ -67,10 +66,8 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
|||
pdn_connectivity_request->access_point_name.apn);
|
||||
if (!sess->pdn) {
|
||||
/* Invalid APN */
|
||||
rv = nas_send_pdn_connectivity_reject(
|
||||
nas_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -98,13 +95,10 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
|||
|
||||
if (sess->pdn) {
|
||||
ogs_debug(" APN[%s]", sess->pdn->apn);
|
||||
rv = mme_gtp_send_create_session_request(sess);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_create_session_request(sess);
|
||||
} else {
|
||||
rv = nas_send_pdn_connectivity_reject(
|
||||
nas_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -114,7 +108,6 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
|||
int esm_handle_information_response(mme_sess_t *sess,
|
||||
ogs_nas_esm_information_response_t *esm_information_response)
|
||||
{
|
||||
int rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
ogs_assert(sess);
|
||||
|
@ -147,14 +140,11 @@ int esm_handle_information_response(mme_sess_t *sess,
|
|||
nas_send_attach_accept(mme_ue);
|
||||
}
|
||||
} else {
|
||||
rv = mme_gtp_send_create_session_request(sess);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_create_session_request(sess);
|
||||
}
|
||||
} else {
|
||||
rv = nas_send_pdn_connectivity_reject(
|
||||
nas_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
|
|
@ -110,13 +110,10 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
|
|||
/* Check if Initial Context Setup Response or
|
||||
* E-RAB Setup Response is received */
|
||||
if (MME_HAVE_ENB_S1U_PATH(bearer)) {
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_modify_bearer_request(bearer, 0);
|
||||
}
|
||||
|
||||
rv = nas_send_activate_all_dedicated_bearers(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
nas_send_activate_all_dedicated_bearers(bearer);
|
||||
OGS_FSM_TRAN(s, esm_state_active);
|
||||
break;
|
||||
case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
|
@ -127,8 +124,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
|
|||
/* Check if Initial Context Setup Response or
|
||||
* E-RAB Setup Response is received */
|
||||
if (MME_HAVE_ENB_S1U_PATH(bearer)) {
|
||||
rv = mme_gtp_send_create_bearer_response(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_create_bearer_response(bearer);
|
||||
}
|
||||
|
||||
OGS_FSM_TRAN(s, esm_state_active);
|
||||
|
@ -216,11 +212,9 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
|
||||
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
|
||||
if (MME_HAVE_SGW_S1U_PATH(sess)) {
|
||||
rv = mme_gtp_send_delete_session_request(sess);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_delete_session_request(sess);
|
||||
} else {
|
||||
rv = nas_send_deactivate_bearer_context_request(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
nas_send_deactivate_bearer_context_request(bearer);
|
||||
}
|
||||
OGS_FSM_TRAN(s, esm_state_pdn_will_disconnect);
|
||||
break;
|
||||
|
@ -229,16 +223,14 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
|
||||
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
|
||||
|
||||
rv = mme_gtp_send_update_bearer_response(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_update_bearer_response(bearer);
|
||||
break;
|
||||
case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
ogs_debug("[ESM] [A] Deactivate EPS bearer "
|
||||
"context accept");
|
||||
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
|
||||
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
|
||||
rv = mme_gtp_send_delete_bearer_response(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_delete_bearer_response(bearer);
|
||||
OGS_FSM_TRAN(s, esm_state_bearer_deactivated);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -160,7 +160,7 @@ void mme_gtp_close(void)
|
|||
ogs_socknode_remove_all(&mme_self()->gtpc_list6);
|
||||
}
|
||||
|
||||
int mme_gtp_send_create_session_request(mme_sess_t *sess)
|
||||
void mme_gtp_send_create_session_request(mme_sess_t *sess)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_header_t h;
|
||||
|
@ -175,24 +175,17 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess)
|
|||
h.type = OGS_GTP_CREATE_SESSION_REQUEST_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_create_session_request(&pkbuf, h.type, sess);
|
||||
if (rv != OGS_OK)
|
||||
return rv;
|
||||
pkbuf = mme_s11_build_create_session_request(h.type, sess);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
||||
int mme_gtp_send_modify_bearer_request(
|
||||
void mme_gtp_send_modify_bearer_request(
|
||||
mme_bearer_t *bearer, int uli_presence)
|
||||
{
|
||||
int rv;
|
||||
|
@ -211,24 +204,17 @@ int mme_gtp_send_modify_bearer_request(
|
|||
h.type = OGS_GTP_MODIFY_BEARER_REQUEST_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_modify_bearer_request(
|
||||
&pkbuf, h.type, bearer, uli_presence);
|
||||
if (rv != OGS_OK)
|
||||
return rv;
|
||||
pkbuf = mme_s11_build_modify_bearer_request(h.type, bearer, uli_presence);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int mme_gtp_send_delete_session_request(mme_sess_t *sess)
|
||||
void mme_gtp_send_delete_session_request(mme_sess_t *sess)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s11buf = NULL;
|
||||
|
@ -244,25 +230,18 @@ int mme_gtp_send_delete_session_request(mme_sess_t *sess)
|
|||
h.type = OGS_GTP_DELETE_SESSION_REQUEST_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_delete_session_request(&s11buf, h.type, sess);
|
||||
if (rv != OGS_OK)
|
||||
return rv;
|
||||
s11buf = mme_s11_build_delete_session_request(h.type, sess);
|
||||
ogs_expect_or_return(s11buf);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, s11buf, timeout, sess);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(s11buf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
mme_sess_t *sess = NULL, *next_sess = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
|
@ -287,8 +266,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue)
|
|||
OGS_FSM_CHECK(&bearer->sm, esm_state_pdn_will_disconnect)) {
|
||||
ogs_warn("PDN will disconnect[EBI:%d]", bearer->ebi);
|
||||
} else {
|
||||
rv = mme_gtp_send_delete_session_request(sess);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_delete_session_request(sess);
|
||||
}
|
||||
} else {
|
||||
mme_sess_remove(sess);
|
||||
|
@ -298,7 +276,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue)
|
|||
}
|
||||
}
|
||||
|
||||
int mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
|
||||
void mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -318,23 +296,17 @@ int mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
|
|||
h.type = OGS_GTP_CREATE_BEARER_RESPONSE_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, bearer);
|
||||
if (rv != OGS_OK)
|
||||
return rv;
|
||||
pkbuf = mme_s11_build_create_bearer_response(h.type, bearer);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int mme_gtp_send_update_bearer_response(mme_bearer_t *bearer)
|
||||
void mme_gtp_send_update_bearer_response(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -354,23 +326,17 @@ int mme_gtp_send_update_bearer_response(mme_bearer_t *bearer)
|
|||
h.type = OGS_GTP_UPDATE_BEARER_RESPONSE_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_update_bearer_response(&pkbuf, h.type, bearer);
|
||||
if (rv != OGS_OK)
|
||||
return rv;
|
||||
pkbuf = mme_s11_build_update_bearer_response(h.type, bearer);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int mme_gtp_send_delete_bearer_response(mme_bearer_t *bearer)
|
||||
void mme_gtp_send_delete_bearer_response(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -390,21 +356,14 @@ int mme_gtp_send_delete_bearer_response(mme_bearer_t *bearer)
|
|||
h.type = OGS_GTP_DELETE_BEARER_RESPONSE_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_delete_bearer_response(&pkbuf, h.type, bearer);
|
||||
if (rv != OGS_OK)
|
||||
return rv;
|
||||
|
||||
pkbuf = mme_s11_build_delete_bearer_response(h.type, bearer);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue)
|
||||
|
@ -420,21 +379,17 @@ void mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue)
|
|||
h.type = OGS_GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_release_access_bearers_request(&pkbuf, h.type);
|
||||
if (rv != OGS_OK)
|
||||
return;
|
||||
pkbuf = mme_s11_build_release_access_bearers_request(h.type);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return;
|
||||
}
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
void mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
|
@ -448,24 +403,18 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
|||
h.type = OGS_GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
||||
&pkbuf, h.type, mme_ue);
|
||||
if (rv != OGS_OK)
|
||||
return rv;
|
||||
pkbuf = mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
||||
h.type, mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
void mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
|
@ -483,13 +432,8 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
|||
ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue);
|
||||
if (!xact) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
|
|
@ -29,19 +29,19 @@ extern "C" {
|
|||
int mme_gtp_open(void);
|
||||
void mme_gtp_close(void);
|
||||
|
||||
int mme_gtp_send_create_session_request(mme_sess_t *sess);
|
||||
int mme_gtp_send_modify_bearer_request(
|
||||
void mme_gtp_send_create_session_request(mme_sess_t *sess);
|
||||
void mme_gtp_send_modify_bearer_request(
|
||||
mme_bearer_t *bearer, int uli_presence);
|
||||
int mme_gtp_send_delete_session_request(mme_sess_t *sess);
|
||||
void mme_gtp_send_delete_session_request(mme_sess_t *sess);
|
||||
void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue);
|
||||
int mme_gtp_send_create_bearer_response(mme_bearer_t *bearer);
|
||||
int mme_gtp_send_update_bearer_response(mme_bearer_t *bearer);
|
||||
int mme_gtp_send_delete_bearer_response(mme_bearer_t *bearer);
|
||||
void mme_gtp_send_create_bearer_response(mme_bearer_t *bearer);
|
||||
void mme_gtp_send_update_bearer_response(mme_bearer_t *bearer);
|
||||
void mme_gtp_send_delete_bearer_response(mme_bearer_t *bearer);
|
||||
void mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue);
|
||||
|
||||
int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
void mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue_t *mme_ue);
|
||||
int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
void mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue_t *mme_ue);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -21,8 +21,8 @@
|
|||
|
||||
#include "mme-s11-build.h"
|
||||
|
||||
int mme_s11_build_create_session_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_sess_t *sess)
|
||||
ogs_pkbuf_t *mme_s11_build_create_session_request(
|
||||
uint8_t type, mme_sess_t *sess)
|
||||
{
|
||||
int rv;
|
||||
ogs_pdn_t *pdn = NULL;
|
||||
|
@ -252,13 +252,10 @@ int mme_s11_build_create_session_request(
|
|||
req->charging_characteristics.len = 2;
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int mme_s11_build_modify_bearer_request(ogs_pkbuf_t **pkbuf,
|
||||
ogs_pkbuf_t *mme_s11_build_modify_bearer_request(
|
||||
uint8_t type, mme_bearer_t *bearer, int uli_presence)
|
||||
{
|
||||
int rv;
|
||||
|
@ -315,16 +312,12 @@ int mme_s11_build_modify_bearer_request(ogs_pkbuf_t **pkbuf,
|
|||
}
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int mme_s11_build_delete_session_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_sess_t *sess)
|
||||
ogs_pkbuf_t *mme_s11_build_delete_session_request(
|
||||
uint8_t type, mme_sess_t *sess)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_message_t gtp_message;
|
||||
ogs_gtp_delete_session_request_t *req = >p_message.delete_session_request;
|
||||
|
||||
|
@ -369,14 +362,11 @@ int mme_s11_build_delete_session_request(
|
|||
req->indication_flags.len = sizeof(ogs_gtp_indication_t);
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int mme_s11_build_create_bearer_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_bearer_t *bearer)
|
||||
ogs_pkbuf_t *mme_s11_build_create_bearer_response(
|
||||
uint8_t type, mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_message_t gtp_message;
|
||||
|
@ -470,16 +460,12 @@ int mme_s11_build_create_bearer_response(
|
|||
rsp->ue_time_zone.len = sizeof(ue_timezone);
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int mme_s11_build_update_bearer_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_bearer_t *bearer)
|
||||
ogs_pkbuf_t *mme_s11_build_update_bearer_response(
|
||||
uint8_t type, mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_message_t gtp_message;
|
||||
ogs_gtp_update_bearer_response_t *rsp = >p_message.update_bearer_response;
|
||||
|
||||
|
@ -549,16 +535,12 @@ int mme_s11_build_update_bearer_response(
|
|||
rsp->ue_time_zone.len = sizeof(ue_timezone);
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int mme_s11_build_delete_bearer_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_bearer_t *bearer)
|
||||
ogs_pkbuf_t *mme_s11_build_delete_bearer_response(
|
||||
uint8_t type, mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_message_t gtp_message;
|
||||
ogs_gtp_delete_bearer_response_t *rsp = >p_message.delete_bearer_response;
|
||||
|
||||
|
@ -628,16 +610,11 @@ int mme_s11_build_delete_bearer_response(
|
|||
rsp->ue_time_zone.len = sizeof(ue_timezone);
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int mme_s11_build_release_access_bearers_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type)
|
||||
ogs_pkbuf_t *mme_s11_build_release_access_bearers_request(uint8_t type)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_message_t gtp_message;
|
||||
ogs_gtp_release_access_bearers_request_t *req =
|
||||
>p_message.release_access_bearers_request;
|
||||
|
@ -649,16 +626,11 @@ int mme_s11_build_release_access_bearers_request(
|
|||
req->originating_node.u8 = OGS_GTP_NODE_TYPE_MME;
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int mme_s11_build_downlink_data_notification_ack(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type)
|
||||
ogs_pkbuf_t *mme_s11_build_downlink_data_notification_ack(uint8_t type)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_message_t gtp_message;
|
||||
ogs_gtp_downlink_data_notification_acknowledge_t *ack =
|
||||
>p_message.downlink_data_notification_acknowledge;
|
||||
|
@ -677,14 +649,11 @@ int mme_s11_build_downlink_data_notification_ack(
|
|||
ack->cause.len = sizeof(cause);
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
||||
uint8_t type, mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
int i;
|
||||
|
@ -757,8 +726,5 @@ int mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
|||
}
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
|
|
@ -24,24 +24,22 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int mme_s11_build_create_session_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_sess_t *sess);
|
||||
int mme_s11_build_modify_bearer_request(ogs_pkbuf_t **pkbuf,
|
||||
ogs_pkbuf_t *mme_s11_build_create_session_request(
|
||||
uint8_t type, mme_sess_t *sess);
|
||||
ogs_pkbuf_t *mme_s11_build_modify_bearer_request(
|
||||
uint8_t type, mme_bearer_t *bearer, int uli_presense);
|
||||
int mme_s11_build_delete_session_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_sess_t *sess);
|
||||
int mme_s11_build_create_bearer_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_bearer_t *bearer);
|
||||
int mme_s11_build_update_bearer_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_bearer_t *bearer);
|
||||
int mme_s11_build_delete_bearer_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_bearer_t *bearer);
|
||||
int mme_s11_build_release_access_bearers_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type);
|
||||
int mme_s11_build_downlink_data_notification_ack(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type);
|
||||
int mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, mme_ue_t *mme_ue);
|
||||
ogs_pkbuf_t *mme_s11_build_delete_session_request(
|
||||
uint8_t type, mme_sess_t *sess);
|
||||
ogs_pkbuf_t *mme_s11_build_create_bearer_response(
|
||||
uint8_t type, mme_bearer_t *bearer);
|
||||
ogs_pkbuf_t *mme_s11_build_update_bearer_response(
|
||||
uint8_t type, mme_bearer_t *bearer);
|
||||
ogs_pkbuf_t *mme_s11_build_delete_bearer_response(
|
||||
uint8_t type, mme_bearer_t *bearer);
|
||||
ogs_pkbuf_t *mme_s11_build_release_access_bearers_request(uint8_t type);
|
||||
ogs_pkbuf_t *mme_s11_build_downlink_data_notification_ack(uint8_t type);
|
||||
ogs_pkbuf_t *mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
||||
uint8_t type, mme_ue_t *mme_ue);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ void mme_s11_handle_create_session_response(
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
if (rsp->cause.presence) {
|
||||
ogs_gtp_cause_t *cause = rsp->cause.data;
|
||||
|
@ -177,7 +177,7 @@ void mme_s11_handle_modify_bearer_response(
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
if (rsp->cause.presence) {
|
||||
ogs_gtp_cause_t *cause = rsp->cause.data;
|
||||
|
@ -197,8 +197,7 @@ void mme_s11_handle_modify_bearer_response(
|
|||
}
|
||||
|
||||
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH,
|
||||
rv = s1ap_send_path_switch_ack(mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_path_switch_ack(mme_ue);
|
||||
);
|
||||
|
||||
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_HANDOVER_NOTIFY,
|
||||
|
@ -234,7 +233,7 @@ void mme_s11_handle_delete_session_response(
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
if (rsp->cause.presence) {
|
||||
ogs_gtp_cause_t *cause = rsp->cause.data;
|
||||
|
@ -258,11 +257,10 @@ void mme_s11_handle_delete_session_response(
|
|||
}
|
||||
} else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) {
|
||||
mme_bearer_t *bearer = mme_default_bearer_in_sess(sess);
|
||||
ogs_expect(bearer);
|
||||
ogs_expect_or_return(bearer);
|
||||
|
||||
if (OGS_FSM_CHECK(&bearer->sm, esm_state_pdn_will_disconnect)) {
|
||||
rv = nas_send_deactivate_bearer_context_request(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
nas_send_deactivate_bearer_context_request(bearer);
|
||||
|
||||
/*
|
||||
* mme_sess_remove() should not be called here.
|
||||
|
@ -393,7 +391,7 @@ void mme_s11_handle_create_bearer_request(
|
|||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
/* Bearer QoS */
|
||||
ogs_expect(ogs_gtp_parse_bearer_qos(&bearer_qos,
|
||||
ogs_expect_or_return(ogs_gtp_parse_bearer_qos(&bearer_qos,
|
||||
&req->bearer_contexts.bearer_level_qos) ==
|
||||
req->bearer_contexts.bearer_level_qos.len);
|
||||
bearer->qos.qci = bearer_qos.qci;
|
||||
|
@ -422,8 +420,7 @@ void mme_s11_handle_create_bearer_request(
|
|||
/* Check if Initial Context Setup Response or
|
||||
* E-RAB Setup Response is received */
|
||||
MME_HAVE_ENB_S1U_PATH(default_bearer)) {
|
||||
rv = nas_send_activate_dedicated_bearer_context_request(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
nas_send_activate_dedicated_bearer_context_request(bearer);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -431,7 +428,6 @@ void mme_s11_handle_update_bearer_request(
|
|||
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
|
||||
ogs_gtp_update_bearer_request_t *req)
|
||||
{
|
||||
int rv;
|
||||
uint8_t cause_value = 0;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
ogs_gtp_bearer_qos_t bearer_qos;
|
||||
|
@ -482,7 +478,7 @@ void mme_s11_handle_update_bearer_request(
|
|||
MME_HAVE_ENB_S1U_PATH(bearer)) {
|
||||
if (req->bearer_contexts.bearer_level_qos.presence == 1) {
|
||||
/* Bearer QoS */
|
||||
ogs_expect(ogs_gtp_parse_bearer_qos(&bearer_qos,
|
||||
ogs_expect_or_return(ogs_gtp_parse_bearer_qos(&bearer_qos,
|
||||
&req->bearer_contexts.bearer_level_qos) ==
|
||||
req->bearer_contexts.bearer_level_qos.len);
|
||||
bearer->qos.qci = bearer_qos.qci;
|
||||
|
@ -504,16 +500,13 @@ void mme_s11_handle_update_bearer_request(
|
|||
|
||||
if (req->bearer_contexts.bearer_level_qos.presence == 1 ||
|
||||
req->bearer_contexts.tft.presence == 1) {
|
||||
rv = nas_send_modify_bearer_context_request(
|
||||
bearer,
|
||||
nas_send_modify_bearer_context_request(bearer,
|
||||
req->bearer_contexts.bearer_level_qos.presence,
|
||||
req->bearer_contexts.tft.presence);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
ogs_warn("[IGNORE] Update Bearer Request : "
|
||||
"Both QoS and TFT is NULL");
|
||||
rv = mme_gtp_send_update_bearer_response(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_update_bearer_response(bearer);
|
||||
}
|
||||
} else {
|
||||
if (!OGS_FSM_CHECK(&bearer->sm, esm_state_active)) {
|
||||
|
@ -523,14 +516,12 @@ void mme_s11_handle_update_bearer_request(
|
|||
} else
|
||||
ogs_assert_if_reached();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void mme_s11_handle_delete_bearer_request(
|
||||
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
|
||||
ogs_gtp_delete_bearer_request_t *req)
|
||||
{
|
||||
int rv;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
ogs_assert(xact);
|
||||
|
@ -541,11 +532,11 @@ void mme_s11_handle_delete_bearer_request(
|
|||
if (mme_ue && req->linked_eps_bearer_id.presence == 1) {
|
||||
bearer = mme_bearer_find_by_ue_ebi(
|
||||
mme_ue, req->linked_eps_bearer_id.u8);
|
||||
ogs_expect(bearer);
|
||||
ogs_expect_or_return(bearer);
|
||||
} else if (mme_ue && req->eps_bearer_ids.presence == 1) {
|
||||
bearer = mme_bearer_find_by_ue_ebi(
|
||||
mme_ue, req->eps_bearer_ids.u8);
|
||||
ogs_expect(bearer);
|
||||
ogs_expect_or_return(bearer);
|
||||
} else {
|
||||
ogs_error("No Linked EBI or EPS Bearer ID");
|
||||
ogs_gtp_send_error_message(xact, mme_ue ? mme_ue->sgw_s11_teid : 0,
|
||||
|
@ -555,14 +546,12 @@ void mme_s11_handle_delete_bearer_request(
|
|||
}
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
ogs_assert(bearer);
|
||||
|
||||
ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]",
|
||||
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
|
||||
|
||||
ogs_expect_or_return(bearer);
|
||||
|
||||
/* Save Transaction. will be handled after EMM-attached */
|
||||
ogs_assert(bearer);
|
||||
bearer->xact = xact;
|
||||
|
||||
if (/* Check if Activate Default/Dedicated Bearer Accept is received */
|
||||
|
@ -570,8 +559,7 @@ void mme_s11_handle_delete_bearer_request(
|
|||
/* Check if Initial Context Setup Response or
|
||||
* E-RAB Setup Response is received */
|
||||
MME_HAVE_ENB_S1U_PATH(bearer)) {
|
||||
rv = nas_send_deactivate_bearer_context_request(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
nas_send_deactivate_bearer_context_request(bearer);
|
||||
} else {
|
||||
if (!OGS_FSM_CHECK(&bearer->sm, esm_state_active)) {
|
||||
ogs_assert_if_reached();
|
||||
|
@ -603,7 +591,7 @@ void mme_s11_handle_release_access_bearers_response(
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
if (rsp->cause.presence) {
|
||||
ogs_gtp_cause_t *cause = rsp->cause.data;
|
||||
|
@ -672,11 +660,11 @@ void mme_s11_handle_downlink_data_notification(
|
|||
h.type = OGS_GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_downlink_data_notification_ack(&s11buf, h.type);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s11buf = mme_s11_build_downlink_data_notification_ack(h.type);
|
||||
ogs_expect_or_return(s11buf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, s11buf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -707,7 +695,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
if (rsp->cause.presence) {
|
||||
ogs_gtp_cause_t *cause = rsp->cause.data;
|
||||
|
@ -736,9 +724,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
|||
|
||||
bearer = mme_bearer_find_by_ue_ebi(mme_ue,
|
||||
bearers[i]->eps_bearer_id.u8);
|
||||
ogs_expect(bearer);
|
||||
if (!bearer)
|
||||
continue;
|
||||
ogs_expect_or_return(bearer);
|
||||
|
||||
if (bearers[i]->s4_u_sgsn_f_teid.presence) {
|
||||
teid = bearers[i]->s4_u_sgsn_f_teid.data;
|
||||
|
@ -746,7 +732,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
|||
|
||||
bearer->sgw_dl_teid = ntohl(teid->teid);
|
||||
rv = ogs_gtp_f_teid_to_ip(teid, &bearer->sgw_dl_ip);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
}
|
||||
if (bearers[i]->s2b_u_epdg_f_teid_5.presence) {
|
||||
teid = bearers[i]->s2b_u_epdg_f_teid_5.data;
|
||||
|
@ -754,15 +740,14 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
|||
|
||||
bearer->sgw_ul_teid = ntohl(teid->teid);
|
||||
rv = ogs_gtp_f_teid_to_ip(teid, &bearer->sgw_ul_ip);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
}
|
||||
}
|
||||
|
||||
source_ue = mme_ue->enb_ue;
|
||||
ogs_assert(source_ue);
|
||||
|
||||
rv = s1ap_send_handover_command(source_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_handover_command(source_ue);
|
||||
}
|
||||
|
||||
void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
|
||||
|
@ -784,7 +769,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
if (rsp->cause.presence) {
|
||||
ogs_gtp_cause_t *cause = rsp->cause.data;
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
void mme_s6a_handle_aia(mme_ue_t *mme_ue,
|
||||
ogs_diam_s6a_aia_message_t *aia_message)
|
||||
{
|
||||
int rv;
|
||||
ogs_diam_e_utran_vector_t *e_utran_vector = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
|
@ -41,8 +40,7 @@ void mme_s6a_handle_aia(mme_ue_t *mme_ue,
|
|||
|
||||
CLEAR_MME_UE_TIMER(mme_ue->t3460);
|
||||
|
||||
rv = nas_send_authentication_request(mme_ue, e_utran_vector);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
nas_send_authentication_request(mme_ue, e_utran_vector);
|
||||
}
|
||||
|
||||
void mme_s6a_handle_ula(mme_ue_t *mme_ue,
|
||||
|
|
|
@ -243,10 +243,9 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_fsm_dispatch(&enb->sm, e);
|
||||
} else {
|
||||
ogs_warn("Cannot process S1AP message");
|
||||
rv = s1ap_send_error_indication(
|
||||
s1ap_send_error_indication(
|
||||
enb, NULL, NULL, S1AP_Cause_PR_protocol,
|
||||
S1AP_CauseProtocol_abstract_syntax_error_falsely_constructed_message);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
ogs_s1ap_free(&s1ap_message);
|
||||
|
@ -269,7 +268,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
pkbuf = e->pkbuf;
|
||||
ogs_assert(pkbuf);
|
||||
if (ogs_nas_emm_decode(&nas_message, pkbuf) != OGS_OK) {
|
||||
ogs_expect(0);
|
||||
ogs_error("ogs_nas_emm_decode() failed");
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return;
|
||||
}
|
||||
|
@ -295,7 +294,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
* not to decrypt NAS message */
|
||||
h.ciphered = 0;
|
||||
if (nas_security_decode(mme_ue, h, pkbuf) != OGS_OK) {
|
||||
ogs_expect(0);
|
||||
ogs_error("nas_security_decode() failed");
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
return;
|
||||
}
|
||||
|
@ -343,7 +342,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
pkbuf = e->pkbuf;
|
||||
ogs_assert(pkbuf);
|
||||
if (ogs_nas_esm_decode(&nas_message, pkbuf) != OGS_OK) {
|
||||
ogs_expect(0);
|
||||
ogs_error("ogs_nas_esm_decode() failed");
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
break;
|
||||
}
|
||||
|
@ -358,11 +357,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
sess = bearer->sess;
|
||||
ogs_assert(sess);
|
||||
default_bearer = mme_default_bearer_in_sess(sess);
|
||||
ogs_expect(default_bearer);
|
||||
if (!default_bearer) {
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
break;
|
||||
}
|
||||
ogs_assert(default_bearer);
|
||||
|
||||
e->bearer = bearer;
|
||||
e->nas_message = &nas_message;
|
||||
|
@ -447,7 +442,12 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST) {
|
||||
rv = nas_send_emm_to_esm(mme_ue,
|
||||
&mme_ue->pdn_connectivity_request);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("nas_send_emm_to_esm() failed");
|
||||
nas_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
}
|
||||
} else {
|
||||
ogs_fatal("Invalid Type[%d]", mme_ue->nas_eps.type);
|
||||
ogs_assert_if_reached();
|
||||
|
@ -455,14 +455,11 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
}
|
||||
else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) {
|
||||
if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) {
|
||||
rv = nas_send_tau_accept(mme_ue,
|
||||
nas_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_InitialContextSetup);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else if (mme_ue->nas_eps.type ==
|
||||
MME_EPS_TYPE_SERVICE_REQUEST) {
|
||||
rv = s1ap_send_initial_context_setup_request(
|
||||
mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_initial_context_setup_request(mme_ue);
|
||||
} else {
|
||||
ogs_fatal("Invalid Type[%d]", mme_ue->nas_eps.type);
|
||||
ogs_assert_if_reached();
|
||||
|
|
|
@ -40,6 +40,7 @@ int nas_send_to_enb(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
|||
int nas_send_emm_to_esm(mme_ue_t *mme_ue,
|
||||
ogs_nas_esm_message_container_t *esm_message_container)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *esmbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
|
@ -54,9 +55,12 @@ int nas_send_emm_to_esm(mme_ue_t *mme_ue,
|
|||
ogs_pkbuf_put_data(esmbuf,
|
||||
esm_message_container->buffer, esm_message_container->length);
|
||||
|
||||
ogs_expect(s1ap_send_to_esm(mme_ue, esmbuf) == OGS_OK);
|
||||
rv = s1ap_send_to_esm(mme_ue, esmbuf);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("s1ap_send_to_esm() failed");
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return rv;
|
||||
}
|
||||
|
||||
int nas_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
||||
|
@ -73,17 +77,23 @@ int nas_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
|||
ogs_pkbuf_free(pkbuf);
|
||||
|
||||
} else {
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_downlink_nas_transport(enb_ue, pkbuf);
|
||||
if (!s1apbuf) {
|
||||
ogs_error("s1ap_build_downlink_nas_transport() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("nas_send_to_enb() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_attach_accept(mme_ue_t *mme_ue)
|
||||
void nas_send_attach_accept(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
mme_sess_t *sess = NULL;
|
||||
|
@ -99,19 +109,17 @@ int nas_send_attach_accept(mme_ue_t *mme_ue)
|
|||
ogs_assert(bearer);
|
||||
ogs_assert(mme_bearer_next(bearer) == NULL);
|
||||
|
||||
rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess);
|
||||
ogs_expect(rv == OGS_OK && esmbuf);
|
||||
esmbuf = esm_build_activate_default_bearer_context_request(sess);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
|
||||
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_attach_accept(mme_ue, esmbuf);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void nas_send_attach_reject(mme_ue_t *mme_ue,
|
||||
|
@ -128,19 +136,18 @@ void nas_send_attach_reject(mme_ue_t *mme_ue,
|
|||
|
||||
sess = mme_sess_first(mme_ue);
|
||||
if (sess) {
|
||||
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess, esm_cause);
|
||||
ogs_expect(rv == OGS_OK && esmbuf);
|
||||
esmbuf = esm_build_pdn_connectivity_reject(sess, esm_cause);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
}
|
||||
|
||||
rv = emm_build_attach_reject(&emmbuf, emm_cause, esmbuf);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_attach_reject(emm_cause, esmbuf);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
}
|
||||
|
||||
int nas_send_identity_request(mme_ue_t *mme_ue)
|
||||
void nas_send_identity_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
|
@ -151,21 +158,18 @@ int nas_send_identity_request(mme_ue_t *mme_ue)
|
|||
emmbuf = mme_ue->t3470.pkbuf;
|
||||
|
||||
} else {
|
||||
rv = emm_build_identity_request(&emmbuf, mme_ue);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_identity_request(mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
}
|
||||
|
||||
mme_ue->t3470.pkbuf = ogs_pkbuf_copy(emmbuf);
|
||||
ogs_timer_start(mme_ue->t3470.timer,
|
||||
mme_timer_cfg(MME_TIMER_T3470)->duration);
|
||||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
}
|
||||
|
||||
int nas_send_authentication_request(
|
||||
void nas_send_authentication_request(
|
||||
mme_ue_t *mme_ue, ogs_diam_e_utran_vector_t *e_utran_vector)
|
||||
{
|
||||
int rv;
|
||||
|
@ -181,8 +185,8 @@ int nas_send_authentication_request(
|
|||
|
||||
} else {
|
||||
ogs_assert(e_utran_vector);
|
||||
rv = emm_build_authentication_request(&emmbuf, e_utran_vector);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_authentication_request(e_utran_vector);
|
||||
ogs_expect(emmbuf);
|
||||
}
|
||||
|
||||
mme_ue->t3460.pkbuf = ogs_pkbuf_copy(emmbuf);
|
||||
|
@ -191,11 +195,9 @@ int nas_send_authentication_request(
|
|||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int nas_send_security_mode_command(mme_ue_t *mme_ue)
|
||||
void nas_send_security_mode_command(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -209,8 +211,8 @@ int nas_send_security_mode_command(mme_ue_t *mme_ue)
|
|||
emmbuf = mme_ue->t3460.pkbuf;
|
||||
|
||||
} else {
|
||||
rv = emm_build_security_mode_command(&emmbuf, mme_ue);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_security_mode_command(mme_ue);
|
||||
ogs_expect(emmbuf);
|
||||
}
|
||||
|
||||
mme_ue->t3460.pkbuf = ogs_pkbuf_copy(emmbuf);
|
||||
|
@ -219,11 +221,9 @@ int nas_send_security_mode_command(mme_ue_t *mme_ue)
|
|||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int nas_send_authentication_reject(mme_ue_t *mme_ue)
|
||||
void nas_send_authentication_reject(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -233,13 +233,11 @@ int nas_send_authentication_reject(mme_ue_t *mme_ue)
|
|||
ogs_debug("[EMM] Authentication reject");
|
||||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
rv = emm_build_authentication_reject(&emmbuf);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_authentication_reject();
|
||||
ogs_expect(emmbuf);
|
||||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void nas_send_detach_accept(mme_ue_t *mme_ue)
|
||||
|
@ -254,8 +252,8 @@ void nas_send_detach_accept(mme_ue_t *mme_ue)
|
|||
/* reply with detach accept */
|
||||
if (mme_ue->nas_eps.detach.switch_off == 0) {
|
||||
int rv;
|
||||
rv = emm_build_detach_accept(&emmbuf, mme_ue);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_detach_accept(mme_ue);
|
||||
ogs_expect(emmbuf);
|
||||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -267,7 +265,7 @@ void nas_send_detach_accept(mme_ue_t *mme_ue)
|
|||
}
|
||||
|
||||
|
||||
int nas_send_pdn_connectivity_reject(
|
||||
void nas_send_pdn_connectivity_reject(
|
||||
mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -279,8 +277,8 @@ int nas_send_pdn_connectivity_reject(
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) {
|
||||
rv = esm_build_pdn_connectivity_reject(&esmbuf, sess, esm_cause);
|
||||
ogs_expect(rv == OGS_OK && esmbuf);
|
||||
esmbuf = esm_build_pdn_connectivity_reject(sess, esm_cause);
|
||||
ogs_expect(esmbuf);
|
||||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -290,11 +288,9 @@ int nas_send_pdn_connectivity_reject(
|
|||
nas_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, esm_cause);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_esm_information_request(mme_bearer_t *bearer)
|
||||
void nas_send_esm_information_request(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
@ -307,8 +303,8 @@ int nas_send_esm_information_request(mme_bearer_t *bearer)
|
|||
if (bearer->t3489.pkbuf) {
|
||||
esmbuf = bearer->t3489.pkbuf;
|
||||
} else {
|
||||
rv = esm_build_information_request(&esmbuf, bearer);
|
||||
ogs_expect(rv == OGS_OK && esmbuf);
|
||||
esmbuf = esm_build_information_request(bearer);
|
||||
ogs_expect(esmbuf);
|
||||
}
|
||||
|
||||
bearer->t3489.pkbuf = ogs_pkbuf_copy(esmbuf);
|
||||
|
@ -317,11 +313,9 @@ int nas_send_esm_information_request(mme_bearer_t *bearer)
|
|||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_activate_default_bearer_context_request(mme_bearer_t *bearer)
|
||||
void nas_send_activate_default_bearer_context_request(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -335,19 +329,17 @@ int nas_send_activate_default_bearer_context_request(mme_bearer_t *bearer)
|
|||
mme_ue = bearer->mme_ue;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess);
|
||||
ogs_expect(rv == OGS_OK && esmbuf);
|
||||
esmbuf = esm_build_activate_default_bearer_context_request(sess);
|
||||
ogs_expect(esmbuf);
|
||||
|
||||
rv = s1ap_build_e_rab_setup_request(&s1apbuf, bearer, esmbuf);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_activate_dedicated_bearer_context_request(
|
||||
void nas_send_activate_dedicated_bearer_context_request(
|
||||
mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
|
@ -359,37 +351,29 @@ int nas_send_activate_dedicated_bearer_context_request(
|
|||
mme_ue = bearer->mme_ue;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
rv = esm_build_activate_dedicated_bearer_context_request(&esmbuf, bearer);
|
||||
ogs_expect(rv == OGS_OK && esmbuf);
|
||||
esmbuf = esm_build_activate_dedicated_bearer_context_request(bearer);
|
||||
ogs_expect(esmbuf);
|
||||
|
||||
rv = s1ap_build_e_rab_setup_request(&s1apbuf, bearer, esmbuf);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer)
|
||||
void nas_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ogs_assert(default_bearer);
|
||||
|
||||
mme_bearer_t *dedicated_bearer = mme_bearer_next(default_bearer);
|
||||
while (dedicated_bearer) {
|
||||
rv = nas_send_activate_dedicated_bearer_context_request(
|
||||
nas_send_activate_dedicated_bearer_context_request(
|
||||
dedicated_bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
dedicated_bearer = mme_bearer_next(dedicated_bearer);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_modify_bearer_context_request(
|
||||
void nas_send_modify_bearer_context_request(
|
||||
mme_bearer_t *bearer, int qos_presence, int tft_presence)
|
||||
{
|
||||
int rv;
|
||||
|
@ -401,13 +385,13 @@ int nas_send_modify_bearer_context_request(
|
|||
mme_ue = bearer->mme_ue;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
rv = esm_build_modify_bearer_context_request(
|
||||
&esmbuf, bearer, qos_presence, tft_presence);
|
||||
ogs_expect(rv == OGS_OK && esmbuf);
|
||||
esmbuf = esm_build_modify_bearer_context_request(
|
||||
bearer, qos_presence, tft_presence);
|
||||
ogs_expect(esmbuf);
|
||||
|
||||
if (qos_presence == 1) {
|
||||
rv = s1ap_build_e_rab_modify_request(&s1apbuf, bearer, esmbuf);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_e_rab_modify_request(bearer, esmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -415,11 +399,9 @@ int nas_send_modify_bearer_context_request(
|
|||
rv = nas_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
|
||||
void nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -430,21 +412,19 @@ int nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
|
|||
mme_ue = bearer->mme_ue;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
rv = esm_build_deactivate_bearer_context_request(
|
||||
&esmbuf, bearer, ESM_CAUSE_REGULAR_DEACTIVATION);
|
||||
ogs_expect(rv == OGS_OK && esmbuf);
|
||||
esmbuf = esm_build_deactivate_bearer_context_request(
|
||||
bearer, ESM_CAUSE_REGULAR_DEACTIVATION);
|
||||
ogs_expect(esmbuf);
|
||||
|
||||
rv = s1ap_build_e_rab_release_command(&s1apbuf, bearer, esmbuf,
|
||||
s1apbuf = s1ap_build_e_rab_release_command(bearer, esmbuf,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_tau_accept(
|
||||
void nas_send_tau_accept(
|
||||
mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode)
|
||||
{
|
||||
int rv;
|
||||
|
@ -455,13 +435,13 @@ int nas_send_tau_accept(
|
|||
ogs_debug("[EMM] Tracking area update accept");
|
||||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
rv = emm_build_tau_accept(&emmbuf, mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
emmbuf = emm_build_tau_accept(mme_ue);
|
||||
ogs_expect(emmbuf);
|
||||
|
||||
if (procedureCode == S1AP_ProcedureCode_id_InitialContextSetup) {
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -470,11 +450,9 @@ int nas_send_tau_accept(
|
|||
ogs_expect(rv == OGS_OK);
|
||||
} else
|
||||
ogs_assert_if_reached();
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int nas_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
|
||||
void nas_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -482,13 +460,11 @@ int nas_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
/* Build TAU reject */
|
||||
rv = emm_build_tau_reject(&emmbuf, emm_cause, mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
emmbuf = emm_build_tau_reject(emm_cause, mme_ue);
|
||||
ogs_expect(emmbuf);
|
||||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void nas_send_service_reject(mme_ue_t *mme_ue,
|
||||
|
@ -500,14 +476,14 @@ void nas_send_service_reject(mme_ue_t *mme_ue,
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
/* Build Service Reject */
|
||||
rv = emm_build_service_reject(&emmbuf, emm_cause, mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
emmbuf = emm_build_service_reject(emm_cause, mme_ue);
|
||||
ogs_expect(emmbuf);
|
||||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
int nas_send_cs_service_notification(mme_ue_t *mme_ue)
|
||||
void nas_send_cs_service_notification(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -517,16 +493,14 @@ int nas_send_cs_service_notification(mme_ue_t *mme_ue)
|
|||
ogs_debug("[EMM] CS Service Notification");
|
||||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
rv = emm_build_cs_service_notification(&emmbuf, mme_ue);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_cs_service_notification(mme_ue);
|
||||
ogs_expect(emmbuf);
|
||||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int nas_send_downlink_nas_transport(
|
||||
void nas_send_downlink_nas_transport(
|
||||
mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length)
|
||||
{
|
||||
int rv;
|
||||
|
@ -539,11 +513,9 @@ int nas_send_downlink_nas_transport(
|
|||
ogs_debug("[EMM] Downlink NAS transport");
|
||||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
rv = emm_build_downlink_nas_transport(&emmbuf, mme_ue, buffer, length);
|
||||
ogs_expect(rv == OGS_OK && emmbuf);
|
||||
emmbuf = emm_build_downlink_nas_transport(mme_ue, buffer, length);
|
||||
ogs_expect(emmbuf);
|
||||
|
||||
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
|
|
@ -31,37 +31,37 @@ int nas_send_emm_to_esm(
|
|||
mme_ue_t *mme_ue, ogs_nas_esm_message_container_t *esm_message_container);
|
||||
int nas_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf);
|
||||
|
||||
int nas_send_attach_accept(mme_ue_t *mme_ue);
|
||||
void nas_send_attach_accept(mme_ue_t *mme_ue);
|
||||
void nas_send_attach_reject(mme_ue_t *mme_ue,
|
||||
ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause);
|
||||
|
||||
int nas_send_identity_request(mme_ue_t *mme_ue);
|
||||
void nas_send_identity_request(mme_ue_t *mme_ue);
|
||||
|
||||
int nas_send_authentication_request(
|
||||
void nas_send_authentication_request(
|
||||
mme_ue_t *mme_ue, ogs_diam_e_utran_vector_t *e_utran_vector);
|
||||
int nas_send_authentication_reject(mme_ue_t *mme_ue);
|
||||
void nas_send_authentication_reject(mme_ue_t *mme_ue);
|
||||
|
||||
int nas_send_security_mode_command(mme_ue_t *mme_ue);
|
||||
void nas_send_security_mode_command(mme_ue_t *mme_ue);
|
||||
|
||||
void nas_send_detach_accept(mme_ue_t *mme_ue);
|
||||
|
||||
int nas_send_pdn_connectivity_reject(
|
||||
void nas_send_pdn_connectivity_reject(
|
||||
mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause);
|
||||
int nas_send_esm_information_request(mme_bearer_t *bearer);
|
||||
int nas_send_activate_default_bearer_context_request(mme_bearer_t *bearer);
|
||||
int nas_send_activate_dedicated_bearer_context_request(mme_bearer_t *bearer);
|
||||
int nas_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer);
|
||||
int nas_send_modify_bearer_context_request(
|
||||
void nas_send_esm_information_request(mme_bearer_t *bearer);
|
||||
void nas_send_activate_default_bearer_context_request(mme_bearer_t *bearer);
|
||||
void nas_send_activate_dedicated_bearer_context_request(mme_bearer_t *bearer);
|
||||
void nas_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer);
|
||||
void nas_send_modify_bearer_context_request(
|
||||
mme_bearer_t *bearer, int qos_presence, int tft_presence);
|
||||
int nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer);
|
||||
void nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer);
|
||||
|
||||
int nas_send_tau_accept(mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode);
|
||||
int nas_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_esm_cause_t emm_cause);
|
||||
void nas_send_tau_accept(mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode);
|
||||
void nas_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_esm_cause_t emm_cause);
|
||||
|
||||
void nas_send_service_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause);
|
||||
|
||||
int nas_send_cs_service_notification(mme_ue_t *mme_ue);
|
||||
int nas_send_downlink_nas_transport(
|
||||
void nas_send_cs_service_notification(mme_ue_t *mme_ue);
|
||||
void nas_send_downlink_nas_transport(
|
||||
mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
|
||||
#include "nas-security.h"
|
||||
|
||||
int nas_security_encode(
|
||||
ogs_pkbuf_t **pkbuf, mme_ue_t *mme_ue, ogs_nas_message_t *message)
|
||||
ogs_pkbuf_t *nas_security_encode(
|
||||
mme_ue_t *mme_ue, ogs_nas_message_t *message)
|
||||
{
|
||||
int integrity_protected = 0;
|
||||
int new_security_context = 0;
|
||||
|
@ -31,7 +31,7 @@ int nas_security_encode(
|
|||
|
||||
switch (message->h.security_header_type) {
|
||||
case OGS_NAS_SECURITY_HEADER_PLAIN_NAS_MESSAGE:
|
||||
return ogs_nas_plain_encode(pkbuf, message);
|
||||
return ogs_nas_plain_encode(message);
|
||||
case OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED:
|
||||
integrity_protected = 1;
|
||||
break;
|
||||
|
@ -49,9 +49,9 @@ int nas_security_encode(
|
|||
ciphered = 1;
|
||||
break;
|
||||
default:
|
||||
ogs_warn("Not implemented(securiry header type:0x%x)",
|
||||
ogs_error("Not implemented(securiry header type:0x%x)",
|
||||
message->h.security_header_type);
|
||||
return OGS_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (new_security_context) {
|
||||
|
@ -73,9 +73,10 @@ int nas_security_encode(
|
|||
h.protocol_discriminator = message->h.protocol_discriminator;
|
||||
h.sequence_number = (mme_ue->dl_count & 0xff);
|
||||
|
||||
if (ogs_nas_plain_encode(&new, message) != OGS_OK) {
|
||||
ogs_error("Error encoding plaintext NAS");
|
||||
return OGS_ERROR;
|
||||
new = ogs_nas_plain_encode(message);
|
||||
if (!new) {
|
||||
ogs_error("ogs_nas_plain_encode() failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ciphered) {
|
||||
|
@ -106,12 +107,14 @@ int nas_security_encode(
|
|||
ogs_assert(ogs_pkbuf_push(new, 5));
|
||||
memcpy(new->data, &h, sizeof(ogs_nas_security_header_t));
|
||||
|
||||
*pkbuf = new;
|
||||
|
||||
mme_ue->security_context_available = 1;
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
ogs_error("Invalid param : type[%d] ciphered[%d] integrity_protected[%d]",
|
||||
message->h.security_header_type, ciphered, integrity_protected);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int nas_security_decode(mme_ue_t *mme_ue,
|
||||
|
|
|
@ -46,8 +46,8 @@ typedef struct _nas_security_header_type_t {
|
|||
};
|
||||
} __attribute__ ((packed)) nas_security_header_type_t;
|
||||
|
||||
int nas_security_encode(
|
||||
ogs_pkbuf_t **pkbuf, mme_ue_t *mme_ue, ogs_nas_message_t *message);
|
||||
ogs_pkbuf_t *nas_security_encode(
|
||||
mme_ue_t *mme_ue, ogs_nas_message_t *message);
|
||||
int nas_security_decode(mme_ue_t *mme_ue,
|
||||
nas_security_header_type_t security_header_type, ogs_pkbuf_t *pkbuf);
|
||||
|
||||
|
|
|
@ -23,9 +23,8 @@
|
|||
#include "mme-sm.h"
|
||||
#include "s1ap-build.h"
|
||||
|
||||
int s1ap_build_setup_rsp(ogs_pkbuf_t **pkbuf)
|
||||
ogs_pkbuf_t *s1ap_build_setup_rsp(void)
|
||||
{
|
||||
int rv;
|
||||
int i, j;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
|
@ -110,22 +109,12 @@ int s1ap_build_setup_rsp(ogs_pkbuf_t **pkbuf)
|
|||
|
||||
*RelativeMMECapacity = mme_self()->relative_capacity;
|
||||
|
||||
rv = ogs_s1ap_encode(pkbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_setup_failure(
|
||||
ogs_pkbuf_t **pkbuf, S1AP_Cause_PR group, long cause, long time_to_wait)
|
||||
ogs_pkbuf_t *s1ap_build_setup_failure(
|
||||
S1AP_Cause_PR group, long cause, long time_to_wait)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_UnsuccessfulOutcome_t *unsuccessfulOutcome = NULL;
|
||||
S1AP_S1SetupFailure_t *S1SetupFailure = NULL;
|
||||
|
@ -176,22 +165,12 @@ int s1ap_build_setup_failure(
|
|||
if (TimeToWait)
|
||||
*TimeToWait = time_to_wait;
|
||||
|
||||
rv = ogs_s1ap_encode(pkbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_downlink_nas_transport(
|
||||
ogs_pkbuf_t **s1apbuf, enb_ue_t *enb_ue, ogs_pkbuf_t *emmbuf)
|
||||
ogs_pkbuf_t *s1ap_build_downlink_nas_transport(
|
||||
enb_ue_t *enb_ue, ogs_pkbuf_t *emmbuf)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_DownlinkNASTransport_t *DownlinkNASTransport = NULL;
|
||||
|
@ -259,19 +238,11 @@ int s1ap_build_downlink_nas_transport(
|
|||
memcpy(NAS_PDU->buf, emmbuf->data, NAS_PDU->size);
|
||||
ogs_pkbuf_free(emmbuf);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_initial_context_setup_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue, ogs_pkbuf_t *emmbuf)
|
||||
ogs_pkbuf_t *s1ap_build_initial_context_setup_request(
|
||||
mme_ue_t *mme_ue, ogs_pkbuf_t *emmbuf)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -548,22 +519,11 @@ int s1ap_build_initial_context_setup_request(
|
|||
UERadioCapability);
|
||||
}
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_ue_context_modification_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *s1ap_build_ue_context_modification_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_UEContextModificationRequest_t *UEContextModificationRequest = NULL;
|
||||
|
@ -702,22 +662,12 @@ int s1ap_build_ue_context_modification_request(
|
|||
memcpy(SecurityKey->buf, mme_ue->kenb, SecurityKey->size);
|
||||
}
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_ue_context_release_command(
|
||||
ogs_pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause)
|
||||
ogs_pkbuf_t *s1ap_build_ue_context_release_command(
|
||||
enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_UEContextReleaseCommand_t *UEContextReleaseCommand = NULL;
|
||||
|
@ -730,7 +680,7 @@ int s1ap_build_ue_context_release_command(
|
|||
|
||||
if (enb_ue->mme_ue_s1ap_id == 0) {
|
||||
ogs_error("invalid mme ue s1ap id");
|
||||
return OGS_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(&pdu, 0, sizeof (S1AP_S1AP_PDU_t));
|
||||
|
@ -781,20 +731,12 @@ int s1ap_build_ue_context_release_command(
|
|||
Cause->present = group;
|
||||
Cause->choice.radioNetwork = cause;
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
|
||||
int s1ap_build_e_rab_setup_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf)
|
||||
ogs_pkbuf_t *s1ap_build_e_rab_setup_request(
|
||||
mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -927,22 +869,12 @@ int s1ap_build_e_rab_setup_request(
|
|||
memcpy(nasPdu->buf, esmbuf->data, nasPdu->size);
|
||||
ogs_pkbuf_free(esmbuf);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_e_rab_modify_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf)
|
||||
ogs_pkbuf_t *s1ap_build_e_rab_modify_request(
|
||||
mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_E_RABModifyRequest_t *E_RABModifyRequest = NULL;
|
||||
|
@ -1069,23 +1001,13 @@ int s1ap_build_e_rab_modify_request(
|
|||
memcpy(nasPdu->buf, esmbuf->data, nasPdu->size);
|
||||
ogs_pkbuf_free(esmbuf);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_e_rab_release_command(ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_e_rab_release_command(
|
||||
mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf,
|
||||
S1AP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_E_RABReleaseCommand_t *E_RABReleaseCommand = NULL;
|
||||
|
@ -1209,22 +1131,12 @@ int s1ap_build_e_rab_release_command(ogs_pkbuf_t **s1apbuf,
|
|||
memcpy(nasPdu->buf, esmbuf->data, nasPdu->size);
|
||||
ogs_pkbuf_free(esmbuf);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_paging(ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_paging(
|
||||
mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_Paging_t *Paging = NULL;
|
||||
|
@ -1342,19 +1254,10 @@ int s1ap_build_paging(ogs_pkbuf_t **s1apbuf,
|
|||
&tai_item->tAI.pLMNidentity);
|
||||
ogs_s1ap_uint16_to_OCTET_STRING(mme_ue->tai.tac, &tai_item->tAI.tAC);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_mme_configuration_transfer(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_mme_configuration_transfer(
|
||||
S1AP_SONConfigurationTransfer_t *son_configuration_transfer)
|
||||
{
|
||||
int rv;
|
||||
|
@ -1366,7 +1269,6 @@ int s1ap_build_mme_configuration_transfer(
|
|||
S1AP_MMEConfigurationTransferIEs_t *ie = NULL;
|
||||
S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer = NULL;
|
||||
|
||||
ogs_assert(s1apbuf);
|
||||
ogs_assert(son_configuration_transfer);
|
||||
|
||||
ogs_debug("[MME] MME Configuration Transfer");
|
||||
|
@ -1400,21 +1302,11 @@ int s1ap_build_mme_configuration_transfer(
|
|||
son_configuration_transfer, SONConfigurationTransfer);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_path_switch_ack(ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
|
||||
ogs_pkbuf_t *s1ap_build_path_switch_ack(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_SuccessfulOutcome_t *successfulOutcome = NULL;
|
||||
S1AP_PathSwitchRequestAcknowledge_t *PathSwitchRequestAcknowledge = NULL;
|
||||
|
@ -1491,23 +1383,13 @@ int s1ap_build_path_switch_ack(ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
|
|||
memcpy(SecurityContext->nextHopParameter.buf,
|
||||
mme_ue->nh, SecurityContext->nextHopParameter.size);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_path_switch_failure(ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_path_switch_failure(
|
||||
uint32_t enb_ue_s1ap_id, uint32_t mme_ue_s1ap_id,
|
||||
S1AP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_UnsuccessfulOutcome_t *unsuccessfulOutcome = NULL;
|
||||
S1AP_PathSwitchRequestFailure_t *PathSwitchRequestFailure = NULL;
|
||||
|
@ -1572,18 +1454,10 @@ int s1ap_build_path_switch_failure(ogs_pkbuf_t **s1apbuf,
|
|||
Cause->present = group;
|
||||
Cause->choice.radioNetwork = cause;
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_handover_command(ogs_pkbuf_t **s1apbuf, enb_ue_t *source_ue)
|
||||
ogs_pkbuf_t *s1ap_build_handover_command(enb_ue_t *source_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -1749,22 +1623,12 @@ int s1ap_build_handover_command(ogs_pkbuf_t **s1apbuf, enb_ue_t *source_ue)
|
|||
ogs_s1ap_buffer_to_OCTET_STRING(mme_ue->container.buf, mme_ue->container.size,
|
||||
Target_ToSource_TransparentContainer);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_handover_preparation_failure(
|
||||
ogs_pkbuf_t **s1apbuf, enb_ue_t *source_ue, S1AP_Cause_t *cause)
|
||||
ogs_pkbuf_t *s1ap_build_handover_preparation_failure(
|
||||
enb_ue_t *source_ue, S1AP_Cause_t *cause)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_UnsuccessfulOutcome_t *unsuccessfulOutcome = NULL;
|
||||
S1AP_HandoverPreparationFailure_t *HandoverPreparationFailure = NULL;
|
||||
|
@ -1774,7 +1638,6 @@ int s1ap_build_handover_preparation_failure(
|
|||
S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL;
|
||||
S1AP_Cause_t *Cause = NULL;
|
||||
|
||||
ogs_assert(s1apbuf);
|
||||
ogs_assert(source_ue);
|
||||
ogs_assert(cause);
|
||||
|
||||
|
@ -1834,19 +1697,11 @@ int s1ap_build_handover_preparation_failure(
|
|||
Cause->present = cause->present;
|
||||
Cause->choice.radioNetwork = cause->choice.radioNetwork;
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_handover_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue, enb_ue_t *target_ue,
|
||||
ogs_pkbuf_t *s1ap_build_handover_request(
|
||||
mme_ue_t *mme_ue, enb_ue_t *target_ue,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_HandoverType_t *handovertype,
|
||||
|
@ -2086,21 +1941,11 @@ int s1ap_build_handover_request(
|
|||
memcpy(SecurityContext->nextHopParameter.buf,
|
||||
mme_ue->nh, SecurityContext->nextHopParameter.size);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_handover_cancel_ack(ogs_pkbuf_t **s1apbuf, enb_ue_t *source_ue)
|
||||
ogs_pkbuf_t *s1ap_build_handover_cancel_ack(enb_ue_t *source_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_SuccessfulOutcome_t *successfulOutcome = NULL;
|
||||
S1AP_HandoverCancelAcknowledge_t *HandoverCancelAcknowledge = NULL;
|
||||
|
@ -2153,18 +1998,10 @@ int s1ap_build_handover_cancel_ack(ogs_pkbuf_t **s1apbuf, enb_ue_t *source_ue)
|
|||
ogs_debug(" Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
|
||||
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_mme_status_transfer(ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_mme_status_transfer(
|
||||
enb_ue_t *target_ue,
|
||||
S1AP_ENB_StatusTransfer_TransparentContainer_t
|
||||
*enb_statustransfer_transparentContainer)
|
||||
|
@ -2240,25 +2077,14 @@ int s1ap_build_mme_status_transfer(ogs_pkbuf_t **s1apbuf,
|
|||
ENB_StatusTransfer_TransparentContainer);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_error_indication(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_error_indication(
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
S1AP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_ErrorIndication_t *ErrorIndication = NULL;
|
||||
|
@ -2326,24 +2152,13 @@ int s1ap_build_error_indication(
|
|||
ogs_debug(" Group[%d] Cause[%d]",
|
||||
Cause->present, (int)Cause->choice.radioNetwork);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_s1_reset(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_s1_reset(
|
||||
S1AP_Cause_PR group, long cause,
|
||||
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_Reset_t *Reset = NULL;
|
||||
|
@ -2399,19 +2214,10 @@ int s1ap_build_s1_reset(
|
|||
ResetType->choice.s1_Interface = S1AP_ResetAll_reset_all;
|
||||
}
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_s1_reset_partial(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_s1_reset_partial(
|
||||
S1AP_Cause_PR group, long cause,
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id)
|
||||
|
@ -2436,15 +2242,12 @@ int s1ap_build_s1_reset_partial(
|
|||
item->mME_UE_S1AP_ID = mme_ue_s1ap_id;
|
||||
item->eNB_UE_S1AP_ID = enb_ue_s1ap_id;
|
||||
|
||||
return s1ap_build_s1_reset(s1apbuf, group, cause, partOfS1_Interface);
|
||||
return s1ap_build_s1_reset(group, cause, partOfS1_Interface);
|
||||
}
|
||||
|
||||
int s1ap_build_s1_reset_ack(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_s1_reset_ack(
|
||||
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_SuccessfulOutcome_t *successfulOutcome = NULL;
|
||||
S1AP_ResetAcknowledge_t *ResetAcknowledge = NULL;
|
||||
|
@ -2533,22 +2336,11 @@ int s1ap_build_s1_reset_ack(
|
|||
}
|
||||
}
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_write_replace_warning_request(
|
||||
ogs_pkbuf_t **s1apbuf, sbc_pws_data_t *sbc_pws)
|
||||
ogs_pkbuf_t *s1ap_build_write_replace_warning_request(sbc_pws_data_t *sbc_pws)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_WriteReplaceWarningRequest_t *WriteReplaceWarningRequest = NULL;
|
||||
|
@ -2677,22 +2469,11 @@ int s1ap_build_write_replace_warning_request(
|
|||
SerialNumber->buf[0], SerialNumber->buf[1],
|
||||
(int)*RepetitionPeriod, (int)*NumberofBroadcastRequest);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
||||
int s1ap_build_kill_request(
|
||||
ogs_pkbuf_t **s1apbuf, sbc_pws_data_t *sbc_pws)
|
||||
ogs_pkbuf_t *s1ap_build_kill_request(sbc_pws_data_t *sbc_pws)
|
||||
{
|
||||
int rv;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
S1AP_KillRequest_t *KillRequest = NULL;
|
||||
|
@ -2756,13 +2537,5 @@ int s1ap_build_kill_request(
|
|||
MessageIdentifier->buf[0], MessageIdentifier->buf[1],
|
||||
SerialNumber->buf[0], SerialNumber->buf[1]);
|
||||
|
||||
rv = ogs_s1ap_encode(s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_s1ap_encode(&pdu);
|
||||
}
|
||||
|
|
|
@ -28,47 +28,43 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int s1ap_build_setup_rsp(ogs_pkbuf_t **pkbuf);
|
||||
int s1ap_build_setup_failure(
|
||||
ogs_pkbuf_t **pkbuf, S1AP_Cause_PR group, long cause, long time_to_wait);
|
||||
ogs_pkbuf_t *s1ap_build_setup_rsp(void);
|
||||
ogs_pkbuf_t *s1ap_build_setup_failure(
|
||||
S1AP_Cause_PR group, long cause, long time_to_wait);
|
||||
|
||||
int s1ap_build_downlink_nas_transport(
|
||||
ogs_pkbuf_t **s1apbuf, enb_ue_t *enb_ue, ogs_pkbuf_t *emmbuf);
|
||||
ogs_pkbuf_t *s1ap_build_downlink_nas_transport(
|
||||
enb_ue_t *enb_ue, ogs_pkbuf_t *emmbuf);
|
||||
|
||||
int s1ap_build_initial_context_setup_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue, ogs_pkbuf_t *emmbuf);
|
||||
int s1ap_build_ue_context_modification_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue);
|
||||
int s1ap_build_ue_context_release_command(
|
||||
ogs_pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause);
|
||||
ogs_pkbuf_t *s1ap_build_initial_context_setup_request(
|
||||
mme_ue_t *mme_ue, ogs_pkbuf_t *emmbuf);
|
||||
ogs_pkbuf_t *s1ap_build_ue_context_modification_request(mme_ue_t *mme_ue);
|
||||
ogs_pkbuf_t *s1ap_build_ue_context_release_command(
|
||||
enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause);
|
||||
|
||||
int s1ap_build_e_rab_setup_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf);
|
||||
int s1ap_build_e_rab_modify_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf);
|
||||
int s1ap_build_e_rab_release_command(ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_e_rab_setup_request(
|
||||
mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf);
|
||||
ogs_pkbuf_t *s1ap_build_e_rab_modify_request(
|
||||
mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf);
|
||||
ogs_pkbuf_t *s1ap_build_e_rab_release_command(
|
||||
mme_bearer_t *bearer, ogs_pkbuf_t *esmbuf, S1AP_Cause_PR group, long cause);
|
||||
|
||||
int s1ap_build_paging(ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_paging(
|
||||
mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain);
|
||||
|
||||
int s1ap_build_mme_configuration_transfer(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_mme_configuration_transfer(
|
||||
S1AP_SONConfigurationTransfer_t *son_configuration_transfer);
|
||||
|
||||
int s1ap_build_path_switch_ack(
|
||||
ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue);
|
||||
int s1ap_build_path_switch_failure(ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_path_switch_ack(mme_ue_t *mme_ue);
|
||||
ogs_pkbuf_t *s1ap_build_path_switch_failure(
|
||||
uint32_t enb_ue_s1ap_id, uint32_t mme_ue_s1ap_id,
|
||||
S1AP_Cause_PR group, long cause);
|
||||
|
||||
int s1ap_build_handover_command(
|
||||
ogs_pkbuf_t **s1apbuf, enb_ue_t *source_ue);
|
||||
int s1ap_build_handover_preparation_failure(
|
||||
ogs_pkbuf_t **s1apbuf, enb_ue_t *source_ue, S1AP_Cause_t *cause);
|
||||
ogs_pkbuf_t *s1ap_build_handover_command(enb_ue_t *source_ue);
|
||||
ogs_pkbuf_t *s1ap_build_handover_preparation_failure(
|
||||
enb_ue_t *source_ue, S1AP_Cause_t *cause);
|
||||
|
||||
int s1ap_build_handover_request(
|
||||
ogs_pkbuf_t **s1apbuf, mme_ue_t *mme_ue, enb_ue_t *target_ue,
|
||||
ogs_pkbuf_t *s1ap_build_handover_request(
|
||||
mme_ue_t *mme_ue, enb_ue_t *target_ue,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_HandoverType_t *handovertype,
|
||||
|
@ -76,40 +72,35 @@ int s1ap_build_handover_request(
|
|||
S1AP_Source_ToTarget_TransparentContainer_t
|
||||
*source_totarget_transparentContainer);
|
||||
|
||||
int s1ap_build_handover_cancel_ack(
|
||||
ogs_pkbuf_t **s1apbuf, enb_ue_t *source_ue);
|
||||
ogs_pkbuf_t *s1ap_build_handover_cancel_ack(
|
||||
enb_ue_t *source_ue);
|
||||
|
||||
int s1ap_build_mme_status_transfer(ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_mme_status_transfer(
|
||||
enb_ue_t *target_ue,
|
||||
S1AP_ENB_StatusTransfer_TransparentContainer_t
|
||||
*enb_statustransfer_transparentContainer);
|
||||
|
||||
int s1ap_build_error_indication(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_error_indication(
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
S1AP_Cause_PR group, long cause);
|
||||
|
||||
int s1ap_build_s1_reset(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_s1_reset(
|
||||
S1AP_Cause_PR group, long cause,
|
||||
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface);
|
||||
|
||||
int s1ap_build_s1_reset_partial(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_s1_reset_partial(
|
||||
S1AP_Cause_PR group, long cause,
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id);
|
||||
|
||||
int s1ap_build_s1_reset_ack(
|
||||
ogs_pkbuf_t **s1apbuf,
|
||||
ogs_pkbuf_t *s1ap_build_s1_reset_ack(
|
||||
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface);
|
||||
|
||||
int s1ap_build_write_replace_warning_request(
|
||||
ogs_pkbuf_t **s1apbuf, sbc_pws_data_t *sbc_pws);
|
||||
ogs_pkbuf_t *s1ap_build_write_replace_warning_request(
|
||||
sbc_pws_data_t *sbc_pws);
|
||||
|
||||
int s1ap_build_kill_request(
|
||||
ogs_pkbuf_t **s1apbuf, sbc_pws_data_t *sbc_pws);
|
||||
ogs_pkbuf_t *s1ap_build_kill_request(sbc_pws_data_t *sbc_pws);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -153,15 +153,16 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
|||
|
||||
if (group == S1AP_Cause_PR_NOTHING) {
|
||||
ogs_debug("[MME] S1-Setup response");
|
||||
ogs_assert(s1ap_build_setup_rsp(&s1apbuf) == OGS_OK);
|
||||
s1apbuf = s1ap_build_setup_rsp();
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
} else {
|
||||
ogs_debug("[MME] S1-Setup failure");
|
||||
ogs_assert(s1ap_build_setup_failure(
|
||||
&s1apbuf, group, cause, S1AP_TimeToWait_v10s) == OGS_OK);
|
||||
s1apbuf = s1ap_build_setup_failure(group, cause, S1AP_TimeToWait_v10s);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
}
|
||||
|
||||
ogs_expect(
|
||||
s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING) == OGS_OK);
|
||||
ogs_expect(OGS_OK ==
|
||||
s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING));
|
||||
}
|
||||
|
||||
void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
|
@ -300,7 +301,8 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
|||
ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d] TAC[%d]",
|
||||
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id, enb_ue->saved.tai.tac);
|
||||
|
||||
s1ap_send_to_nas(enb_ue, S1AP_ProcedureCode_id_initialUEMessage, NAS_PDU);
|
||||
s1ap_send_to_nas(enb_ue,
|
||||
S1AP_ProcedureCode_id_initialUEMessage, NAS_PDU);
|
||||
}
|
||||
|
||||
void s1ap_handle_uplink_nas_transport(
|
||||
|
@ -353,7 +355,8 @@ void s1ap_handle_uplink_nas_transport(
|
|||
ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
|
||||
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
|
||||
|
||||
s1ap_send_to_nas(enb_ue, S1AP_ProcedureCode_id_uplinkNASTransport, NAS_PDU);
|
||||
s1ap_send_to_nas(enb_ue,
|
||||
S1AP_ProcedureCode_id_uplinkNASTransport, NAS_PDU);
|
||||
}
|
||||
|
||||
void s1ap_handle_ue_capability_info_indication(
|
||||
|
@ -503,8 +506,7 @@ void s1ap_handle_initial_context_setup_response(
|
|||
ogs_debug(" ### ULI PRESENT ###");
|
||||
uli_presence = 1;
|
||||
}
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer, uli_presence);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_modify_bearer_request(bearer, uli_presence);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -793,18 +795,14 @@ void s1ap_handle_e_rab_setup_response(
|
|||
ogs_debug(" EBI[%d]", bearer->ebi);
|
||||
|
||||
if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) {
|
||||
int rv;
|
||||
|
||||
mme_bearer_t *linked_bearer = mme_linked_bearer(bearer);
|
||||
ogs_assert(linked_bearer);
|
||||
ogs_debug(" Linked-EBI[%d]", linked_bearer->ebi);
|
||||
|
||||
if (bearer->ebi == linked_bearer->ebi) {
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_modify_bearer_request(bearer, 0);
|
||||
} else {
|
||||
rv = mme_gtp_send_create_bearer_response(bearer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_create_bearer_response(bearer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -813,7 +811,6 @@ void s1ap_handle_e_rab_setup_response(
|
|||
void s1ap_handle_ue_context_release_request(
|
||||
mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
{
|
||||
int rv;
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -864,11 +861,10 @@ void s1ap_handle_ue_context_release_request(
|
|||
if (!enb_ue) {
|
||||
ogs_warn("No ENB UE Context : MME_UE_S1AP_ID[%d]",
|
||||
(int)*MME_UE_S1AP_ID);
|
||||
rv = s1ap_send_error_indication(enb,
|
||||
s1ap_send_error_indication(enb,
|
||||
MME_UE_S1AP_ID, ENB_UE_S1AP_ID,
|
||||
S1AP_Cause_PR_radioNetwork,
|
||||
S1AP_CauseRadioNetwork_unknown_mme_ue_s1ap_id);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -943,11 +939,10 @@ void s1ap_handle_ue_context_release_complete(
|
|||
if (!enb_ue) {
|
||||
ogs_warn("No ENB UE Context : MME_UE_S1AP_ID[%d]",
|
||||
(int)*MME_UE_S1AP_ID);
|
||||
rv = s1ap_send_error_indication(enb,
|
||||
s1ap_send_error_indication(enb,
|
||||
MME_UE_S1AP_ID, NULL,
|
||||
S1AP_Cause_PR_radioNetwork,
|
||||
S1AP_CauseRadioNetwork_unknown_mme_ue_s1ap_id);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -979,9 +974,8 @@ void s1ap_handle_ue_context_release_complete(
|
|||
|
||||
ogs_assert(mme_ue);
|
||||
if (mme_ue_have_indirect_tunnel(mme_ue)) {
|
||||
rv = mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
ogs_warn("Check your eNodeB");
|
||||
ogs_warn(" There is no INDIRECT TUNNEL");
|
||||
|
@ -1092,14 +1086,14 @@ void s1ap_handle_path_switch_request(
|
|||
ogs_error("Cannot find UE from sourceMME-UE-S1AP-ID[%d] and eNB[%s:%d]",
|
||||
(int)*MME_UE_S1AP_ID, OGS_ADDR(enb->addr, buf), enb->enb_id);
|
||||
|
||||
rv = s1ap_build_path_switch_failure(&s1apbuf,
|
||||
s1apbuf = s1ap_build_path_switch_failure(
|
||||
*ENB_UE_S1AP_ID, *MME_UE_S1AP_ID,
|
||||
S1AP_Cause_PR_radioNetwork,
|
||||
S1AP_CauseRadioNetwork_unknown_mme_ue_s1ap_id);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
ogs_expect(OGS_OK ==
|
||||
s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1113,13 +1107,12 @@ void s1ap_handle_path_switch_request(
|
|||
mme_ue->nhcc++;
|
||||
mme_kdf_nh(mme_ue->kasme, mme_ue->nh, mme_ue->nh);
|
||||
} else {
|
||||
rv = s1ap_build_path_switch_failure(&s1apbuf,
|
||||
s1apbuf = s1ap_build_path_switch_failure(
|
||||
*ENB_UE_S1AP_ID, *MME_UE_S1AP_ID,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_authentication_failure);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(enb_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_to_enb_ue(enb_ue, s1apbuf);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1190,8 +1183,7 @@ void s1ap_handle_path_switch_request(
|
|||
GTP_COUNTER_INCREMENT(
|
||||
mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH);
|
||||
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer, 1);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_modify_bearer_request(bearer, 1);
|
||||
}
|
||||
|
||||
/* Switch to enb */
|
||||
|
@ -1201,7 +1193,6 @@ void s1ap_handle_path_switch_request(
|
|||
void s1ap_handle_enb_configuration_transfer(
|
||||
mme_enb_t *enb, ogs_s1ap_message_t *message, ogs_pkbuf_t *pkbuf)
|
||||
{
|
||||
int rv;
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -1279,15 +1270,13 @@ void s1ap_handle_enb_configuration_transfer(
|
|||
return;
|
||||
}
|
||||
|
||||
rv = s1ap_send_mme_configuration_transfer(
|
||||
s1ap_send_mme_configuration_transfer(
|
||||
target_enb, SONConfigurationTransfer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
}
|
||||
|
||||
void s1ap_handle_handover_required(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
{
|
||||
int rv;
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -1385,8 +1374,7 @@ void s1ap_handle_handover_required(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
|||
} else {
|
||||
ogs_assert(Cause);
|
||||
|
||||
rv = s1ap_send_handover_preparation_failure(source_ue, Cause);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_handover_preparation_failure(source_ue, Cause);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -1394,11 +1382,10 @@ void s1ap_handle_handover_required(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
|||
ogs_assert(HandoverType);
|
||||
source_ue->handover_type = *HandoverType;
|
||||
|
||||
rv = s1ap_send_handover_request(mme_ue, target_enb,
|
||||
s1ap_send_handover_request(mme_ue, target_enb,
|
||||
ENB_UE_S1AP_ID, MME_UE_S1AP_ID,
|
||||
HandoverType, Cause,
|
||||
Source_ToTarget_TransparentContainer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void s1ap_handle_handover_request_ack(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
|
@ -1524,18 +1511,15 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, ogs_s1ap_message_t *messag
|
|||
Target_ToSource_TransparentContainer);
|
||||
|
||||
if (mme_ue_have_indirect_tunnel(mme_ue) == 1) {
|
||||
rv = mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
rv = s1ap_send_handover_command(source_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_handover_command(source_ue);
|
||||
}
|
||||
}
|
||||
|
||||
void s1ap_handle_handover_failure(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
{
|
||||
int rv;
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -1590,8 +1574,7 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
|||
ogs_debug(" Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
|
||||
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
|
||||
|
||||
rv = s1ap_send_handover_preparation_failure(source_ue, Cause);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_handover_preparation_failure(source_ue, Cause);
|
||||
|
||||
s1ap_send_ue_context_release_command(
|
||||
target_ue, S1AP_Cause_PR_radioNetwork,
|
||||
|
@ -1601,7 +1584,6 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
|||
|
||||
void s1ap_handle_handover_cancel(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
{
|
||||
int rv;
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -1661,8 +1643,7 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
|||
ogs_debug(" Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
|
||||
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
|
||||
|
||||
rv = s1ap_send_handover_cancel_ack(source_ue);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_handover_cancel_ack(source_ue);
|
||||
|
||||
s1ap_send_ue_context_release_command(
|
||||
target_ue, S1AP_Cause_PR_radioNetwork,
|
||||
|
@ -1678,7 +1659,6 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
|||
|
||||
void s1ap_handle_enb_status_transfer(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
{
|
||||
int rv;
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -1739,14 +1719,12 @@ void s1ap_handle_enb_status_transfer(mme_enb_t *enb, ogs_s1ap_message_t *message
|
|||
ogs_debug(" Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
|
||||
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
|
||||
|
||||
rv = s1ap_send_mme_status_transfer(target_ue,
|
||||
s1ap_send_mme_status_transfer(target_ue,
|
||||
ENB_StatusTransfer_TransparentContainer);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void s1ap_handle_handover_notification(mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
{
|
||||
int rv;
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -1872,8 +1850,7 @@ void s1ap_handle_handover_notification(mme_enb_t *enb, ogs_s1ap_message_t *messa
|
|||
GTP_COUNTER_INCREMENT(
|
||||
mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_HANDOVER_NOTIFY);
|
||||
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer, 1);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
mme_gtp_send_modify_bearer_request(bearer, 1);
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
|
@ -1884,7 +1861,6 @@ void s1ap_handle_handover_notification(mme_enb_t *enb, ogs_s1ap_message_t *messa
|
|||
void s1ap_handle_s1_reset(
|
||||
mme_enb_t *enb, ogs_s1ap_message_t *message)
|
||||
{
|
||||
int rv;
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -1994,8 +1970,7 @@ void s1ap_handle_s1_reset(
|
|||
break;
|
||||
}
|
||||
|
||||
rv = s1ap_send_s1_reset_ack(enb, partOfS1_Interface);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1ap_send_s1_reset_ack(enb, partOfS1_Interface);
|
||||
}
|
||||
|
||||
void s1ap_handle_write_replace_warning_response(
|
||||
|
@ -2045,5 +2020,4 @@ void s1ap_handle_kill_response(
|
|||
|
||||
ogs_debug(" IP[%s] ENB_ID[%d]",
|
||||
OGS_ADDR(enb->addr, buf), enb->enb_id);
|
||||
|
||||
}
|
||||
|
|
|
@ -89,7 +89,7 @@ int s1ap_send_to_enb(mme_enb_t *enb, ogs_pkbuf_t *pkbuf, uint16_t stream_no)
|
|||
enb->sock, enb->addr, NULL, 0, 0);
|
||||
}
|
||||
|
||||
return OGS_OK;;
|
||||
return rv;
|
||||
}
|
||||
|
||||
int s1ap_send_to_enb_ue(enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf)
|
||||
|
@ -151,7 +151,7 @@ int s1ap_send_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf)
|
|||
mme_event_free(e);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return rv;
|
||||
}
|
||||
|
||||
int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
||||
|
@ -185,27 +185,23 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
|||
break;
|
||||
case OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED:
|
||||
security_header_type.integrity_protected = 1;
|
||||
if (!ogs_pkbuf_pull(nasbuf, 6))
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_pull(nasbuf, 6);
|
||||
break;
|
||||
case OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED:
|
||||
security_header_type.integrity_protected = 1;
|
||||
security_header_type.ciphered = 1;
|
||||
if (!ogs_pkbuf_pull(nasbuf, 6))
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_pull(nasbuf, 6);
|
||||
break;
|
||||
case OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_NEW_SECURITY_CONTEXT:
|
||||
security_header_type.integrity_protected = 1;
|
||||
security_header_type.new_security_context = 1;
|
||||
if (!ogs_pkbuf_pull(nasbuf, 6))
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_pull(nasbuf, 6);
|
||||
break;
|
||||
case OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHTERD_WITH_NEW_INTEGRITY_CONTEXT:
|
||||
security_header_type.integrity_protected = 1;
|
||||
security_header_type.ciphered = 1;
|
||||
security_header_type.new_security_context = 1;
|
||||
if (!ogs_pkbuf_pull(nasbuf, 6))
|
||||
return OGS_ERROR;
|
||||
ogs_pkbuf_pull(nasbuf, 6);
|
||||
break;
|
||||
default:
|
||||
ogs_error("Not implemented(securiry header type:0x%x)",
|
||||
|
@ -214,7 +210,9 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
|||
}
|
||||
|
||||
if (enb_ue->mme_ue) {
|
||||
if (nas_security_decode(enb_ue->mme_ue, security_header_type, nasbuf) != OGS_OK) {
|
||||
if (nas_security_decode(enb_ue->mme_ue,
|
||||
security_header_type, nasbuf) != OGS_OK) {
|
||||
ogs_error("nas_security_decode failed()");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -235,49 +233,44 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
|||
ogs_pkbuf_free(e->pkbuf);
|
||||
mme_event_free(e);
|
||||
}
|
||||
return rv;
|
||||
} else if (h->protocol_discriminator == OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM) {
|
||||
mme_ue_t *mme_ue = enb_ue->mme_ue;
|
||||
ogs_assert(mme_ue);
|
||||
s1ap_send_to_esm(mme_ue, nasbuf);
|
||||
return s1ap_send_to_esm(mme_ue, nasbuf);
|
||||
} else {
|
||||
ogs_error("Unknown/Unimplemented NAS Protocol discriminator 0x%02x",
|
||||
h->protocol_discriminator);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
|
||||
void s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, NULL);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, NULL);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue)
|
||||
void s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
rv = s1ap_build_ue_context_modification_request(&s1apbuf, mme_ue);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_ue_context_modification_request(mme_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void s1ap_send_ue_context_release_command(
|
||||
|
@ -300,9 +293,8 @@ void s1ap_send_ue_context_release_command(
|
|||
ogs_debug(" Group[%d] Cause[%d] Action[%d] Delay[%d]",
|
||||
group, (int)cause, action, delay);
|
||||
|
||||
rv = s1ap_build_ue_context_release_command(
|
||||
&s1apbuf, enb_ue, group, cause);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_ue_context_release_command(enb_ue, group, cause);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_delayed_send_to_enb_ue(enb_ue, s1apbuf, delay);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -313,9 +305,8 @@ void s1ap_send_ue_context_release_command(
|
|||
ogs_debug(" Group[%d] Cause[%d] Action[%d] Delay[%d]",
|
||||
group, (int)cause, action, delay);
|
||||
|
||||
rv = s1ap_build_ue_context_release_command(
|
||||
&s1apbuf, enb_ue, group, cause);
|
||||
ogs_assert(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_ue_context_release_command(enb_ue, group, cause);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_delayed_send_to_enb_ue(enb_ue, s1apbuf, 0);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -339,8 +330,8 @@ void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain)
|
|||
if (mme_ue->t3413.pkbuf) {
|
||||
s1apbuf = mme_ue->t3413.pkbuf;
|
||||
} else {
|
||||
rv = s1ap_build_paging(&s1apbuf, mme_ue, cn_domain);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_paging(mme_ue, cn_domain);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
}
|
||||
|
||||
mme_ue->t3413.pkbuf = ogs_pkbuf_copy(s1apbuf);
|
||||
|
@ -356,7 +347,7 @@ void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain)
|
|||
mme_timer_cfg(MME_TIMER_T3413)->duration);
|
||||
}
|
||||
|
||||
int s1ap_send_mme_configuration_transfer(
|
||||
void s1ap_send_mme_configuration_transfer(
|
||||
mme_enb_t *target_enb,
|
||||
S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer)
|
||||
{
|
||||
|
@ -366,49 +357,42 @@ int s1ap_send_mme_configuration_transfer(
|
|||
ogs_assert(target_enb);
|
||||
ogs_assert(SONConfigurationTransfer);
|
||||
|
||||
rv = s1ap_build_mme_configuration_transfer(
|
||||
&s1apbuf, SONConfigurationTransfer);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_mme_configuration_transfer(SONConfigurationTransfer);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb(target_enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int s1ap_send_path_switch_ack(mme_ue_t *mme_ue)
|
||||
void s1ap_send_path_switch_ack(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
rv = s1ap_build_path_switch_ack(&s1apbuf, mme_ue);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_path_switch_ack(mme_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = nas_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int s1ap_send_handover_command(enb_ue_t *source_ue)
|
||||
void s1ap_send_handover_command(enb_ue_t *source_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
||||
ogs_assert(source_ue);
|
||||
|
||||
rv = s1ap_build_handover_command(&s1apbuf, source_ue);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_handover_command(source_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int s1ap_send_handover_preparation_failure(
|
||||
void s1ap_send_handover_preparation_failure(
|
||||
enb_ue_t *source_ue, S1AP_Cause_t *cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -417,33 +401,29 @@ int s1ap_send_handover_preparation_failure(
|
|||
ogs_assert(source_ue);
|
||||
ogs_assert(cause);
|
||||
|
||||
rv = s1ap_build_handover_preparation_failure(&s1apbuf, source_ue, cause);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_handover_preparation_failure(source_ue, cause);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int s1ap_send_handover_cancel_ack(enb_ue_t *source_ue)
|
||||
void s1ap_send_handover_cancel_ack(enb_ue_t *source_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
||||
ogs_assert(source_ue);
|
||||
|
||||
rv = s1ap_build_handover_cancel_ack(&s1apbuf, source_ue);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_handover_cancel_ack(source_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
int s1ap_send_handover_request(
|
||||
void s1ap_send_handover_request(
|
||||
mme_ue_t *mme_ue,
|
||||
mme_enb_t *target_enb,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
|
@ -477,19 +457,17 @@ int s1ap_send_handover_request(
|
|||
|
||||
source_ue_associate_target_ue(source_ue, target_ue);
|
||||
|
||||
rv = s1ap_build_handover_request(&s1apbuf, mme_ue, target_ue,
|
||||
s1apbuf = s1ap_build_handover_request(mme_ue, target_ue,
|
||||
enb_ue_s1ap_id, mme_ue_s1ap_id,
|
||||
handovertype, cause,
|
||||
source_totarget_transparentContainer);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(target_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int s1ap_send_mme_status_transfer(
|
||||
void s1ap_send_mme_status_transfer(
|
||||
enb_ue_t *target_ue,
|
||||
S1AP_ENB_StatusTransfer_TransparentContainer_t
|
||||
*enb_statustransfer_transparentContainer)
|
||||
|
@ -499,17 +477,15 @@ int s1ap_send_mme_status_transfer(
|
|||
|
||||
ogs_assert(target_ue);
|
||||
|
||||
rv = s1ap_build_mme_status_transfer(&s1apbuf, target_ue,
|
||||
s1apbuf = s1ap_build_mme_status_transfer(target_ue,
|
||||
enb_statustransfer_transparentContainer);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(target_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int s1ap_send_error_indication(
|
||||
void s1ap_send_error_indication(
|
||||
mme_enb_t *enb,
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
|
@ -520,17 +496,15 @@ int s1ap_send_error_indication(
|
|||
|
||||
ogs_assert(enb);
|
||||
|
||||
rv = s1ap_build_error_indication(&s1apbuf,
|
||||
s1apbuf = s1ap_build_error_indication(
|
||||
mme_ue_s1ap_id, enb_ue_s1ap_id, group, cause);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int s1ap_send_s1_reset_ack(
|
||||
void s1ap_send_s1_reset_ack(
|
||||
mme_enb_t *enb,
|
||||
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface)
|
||||
{
|
||||
|
@ -539,11 +513,9 @@ int s1ap_send_s1_reset_ack(
|
|||
|
||||
ogs_assert(enb);
|
||||
|
||||
rv = s1ap_build_s1_reset_ack(&s1apbuf, partOfS1_Interface);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_s1_reset_ack(partOfS1_Interface);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -48,25 +48,25 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
|||
S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu);
|
||||
int s1ap_send_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf);
|
||||
|
||||
int s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue);
|
||||
int s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue);
|
||||
void s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue);
|
||||
void s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue);
|
||||
void s1ap_send_ue_context_release_command(
|
||||
enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause,
|
||||
uint8_t action, uint32_t delay);
|
||||
|
||||
void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain);
|
||||
|
||||
int s1ap_send_mme_configuration_transfer(
|
||||
void s1ap_send_mme_configuration_transfer(
|
||||
mme_enb_t *target_enb,
|
||||
S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer);
|
||||
|
||||
int s1ap_send_path_switch_ack(mme_ue_t *mme_ue);
|
||||
void s1ap_send_path_switch_ack(mme_ue_t *mme_ue);
|
||||
|
||||
int s1ap_send_handover_command(enb_ue_t *source_ue);
|
||||
int s1ap_send_handover_preparation_failure(
|
||||
void s1ap_send_handover_command(enb_ue_t *source_ue);
|
||||
void s1ap_send_handover_preparation_failure(
|
||||
enb_ue_t *source_ue, S1AP_Cause_t *cause);
|
||||
|
||||
int s1ap_send_handover_request(
|
||||
void s1ap_send_handover_request(
|
||||
mme_ue_t *mme_ue,
|
||||
mme_enb_t *target_enb,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
|
@ -76,18 +76,18 @@ int s1ap_send_handover_request(
|
|||
S1AP_Source_ToTarget_TransparentContainer_t
|
||||
*source_totarget_transparentContainer);
|
||||
|
||||
int s1ap_send_handover_cancel_ack(enb_ue_t *source_ue);
|
||||
void s1ap_send_handover_cancel_ack(enb_ue_t *source_ue);
|
||||
|
||||
int s1ap_send_mme_status_transfer(
|
||||
void s1ap_send_mme_status_transfer(
|
||||
enb_ue_t *target_ue,
|
||||
S1AP_ENB_StatusTransfer_TransparentContainer_t
|
||||
*enb_statustransfer_transparentContainer);
|
||||
int s1ap_send_error_indication(
|
||||
void s1ap_send_error_indication(
|
||||
mme_enb_t *enb,
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
S1AP_Cause_PR group, long cause);
|
||||
int s1ap_send_s1_reset_ack(
|
||||
void s1ap_send_s1_reset_ack(
|
||||
mme_enb_t *enb,
|
||||
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface);
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@ void sbc_handle_write_replace_warning_request(sbc_pws_data_t *sbc_pws)
|
|||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
mme_enb_t *enb = NULL;
|
||||
int i, j, flag;
|
||||
int rv;
|
||||
|
||||
/* Find enB with matched TAI */
|
||||
ogs_list_for_each(&mme_self()->enb_list, enb) {
|
||||
|
@ -47,11 +46,9 @@ void sbc_handle_write_replace_warning_request(sbc_pws_data_t *sbc_pws)
|
|||
flag = 1;
|
||||
|
||||
if (flag) {
|
||||
s1apbuf = NULL;
|
||||
|
||||
/* Buidl S1AP Write Replace Warning Request message */
|
||||
rv = s1ap_build_write_replace_warning_request(&s1apbuf, sbc_pws);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
s1apbuf = s1ap_build_write_replace_warning_request(sbc_pws);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
/* Send to enb */
|
||||
ogs_expect(s1ap_send_to_enb(
|
||||
|
@ -65,7 +62,6 @@ void sbc_handle_stop_warning_request(sbc_pws_data_t *sbc_pws)
|
|||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
mme_enb_t *enb = NULL;
|
||||
int i, j, flag;
|
||||
int rv;
|
||||
|
||||
/* Find enB with matched TAI */
|
||||
ogs_list_for_each(&mme_self()->enb_list, enb) {
|
||||
|
@ -85,11 +81,9 @@ void sbc_handle_stop_warning_request(sbc_pws_data_t *sbc_pws)
|
|||
flag = 1;
|
||||
|
||||
if (flag) {
|
||||
s1apbuf = NULL;
|
||||
|
||||
/* Buidl S1AP Kill request message */
|
||||
rv = s1ap_build_kill_request(&s1apbuf, sbc_pws);
|
||||
ogs_expect(rv == OGS_OK && s1apbuf);
|
||||
s1apbuf = s1ap_build_kill_request(sbc_pws);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
|
||||
/* Send to enb */
|
||||
ogs_expect(s1ap_send_to_enb(
|
||||
|
|
|
@ -98,7 +98,7 @@ int sgsap_send_to_vlr_with_sid(
|
|||
node->sock, node->addr, NULL, 0, 0);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
return rv;
|
||||
}
|
||||
|
||||
int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
||||
|
@ -122,7 +122,7 @@ int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
|||
return sgsap_send_to_vlr_with_sid(vlr, pkbuf, mme_ue->vlr_ostream_id);
|
||||
}
|
||||
|
||||
int sgsap_send_location_update_request(mme_ue_t *mme_ue)
|
||||
void sgsap_send_location_update_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -132,13 +132,12 @@ int sgsap_send_location_update_request(mme_ue_t *mme_ue)
|
|||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
pkbuf = sgsap_build_location_update_request(mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue)
|
||||
void sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -148,26 +147,24 @@ int sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue)
|
|||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
pkbuf = sgsap_build_tmsi_reallocation_complete(mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int sgsap_send_detach_indication(mme_ue_t *mme_ue)
|
||||
void sgsap_send_detach_indication(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
pkbuf = sgsap_build_detach_indication(mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue)
|
||||
void sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -177,13 +174,12 @@ int sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue)
|
|||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
pkbuf = sgsap_build_mo_csfb_indication(mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode)
|
||||
void sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -195,13 +191,12 @@ int sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode)
|
|||
ogs_debug(" EMM_MODE[%d]", emm_mode);
|
||||
|
||||
pkbuf = sgsap_build_service_request(mme_ue, emm_mode);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int sgsap_send_reset_ack(mme_vlr_t *vlr)
|
||||
void sgsap_send_reset_ack(mme_vlr_t *vlr)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -210,13 +205,12 @@ int sgsap_send_reset_ack(mme_vlr_t *vlr)
|
|||
ogs_debug("[SGSAP] RESET-ACK");
|
||||
|
||||
pkbuf = sgsap_build_reset_ack(vlr);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
rv = sgsap_send_to_vlr_with_sid(vlr, pkbuf, 0);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int sgsap_send_uplink_unitdata(
|
||||
void sgsap_send_uplink_unitdata(
|
||||
mme_ue_t *mme_ue, ogs_nas_message_container_t *nas_message_container)
|
||||
{
|
||||
int rv;
|
||||
|
@ -230,13 +224,12 @@ int sgsap_send_uplink_unitdata(
|
|||
nas_message_container->buffer, nas_message_container->length);
|
||||
|
||||
pkbuf = sgsap_build_uplink_unidata(mme_ue, nas_message_container);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
int sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
|
||||
void sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -247,8 +240,7 @@ int sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
|
|||
ogs_debug(" CAUSE[%d]", sgs_cause);
|
||||
|
||||
pkbuf = sgsap_build_ue_unreachable(mme_ue, sgs_cause);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
|
|
@ -41,15 +41,15 @@ int sgsap_send_to_vlr_with_sid(
|
|||
mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no);
|
||||
int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf);
|
||||
|
||||
int sgsap_send_location_update_request(mme_ue_t *mme_ue);
|
||||
int sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue);
|
||||
int sgsap_send_detach_indication(mme_ue_t *mme_ue);
|
||||
int sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue);
|
||||
int sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode);
|
||||
int sgsap_send_reset_ack(mme_vlr_t *vlr);
|
||||
int sgsap_send_uplink_unitdata(
|
||||
void sgsap_send_location_update_request(mme_ue_t *mme_ue);
|
||||
void sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue);
|
||||
void sgsap_send_detach_indication(mme_ue_t *mme_ue);
|
||||
void sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue);
|
||||
void sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode);
|
||||
void sgsap_send_reset_ack(mme_vlr_t *vlr);
|
||||
void sgsap_send_uplink_unitdata(
|
||||
mme_ue_t *mme_ue, ogs_nas_message_container_t *nas_message_container);
|
||||
int sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause);
|
||||
void sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "pgw-gx-handler.h"
|
||||
#include "pgw-ipfw.h"
|
||||
|
||||
static int bearer_binding(pgw_sess_t *sess, ogs_diam_gx_message_t *gx_message);
|
||||
static void bearer_binding(pgw_sess_t *sess, ogs_diam_gx_message_t *gx_message);
|
||||
|
||||
static void timeout(ogs_gtp_xact_t *xact, void *data)
|
||||
{
|
||||
|
@ -56,18 +56,17 @@ void pgw_gx_handle_cca_initial_request(
|
|||
h.type = OGS_GTP_CREATE_SESSION_RESPONSE_TYPE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
rv = pgw_s5c_build_create_session_response(
|
||||
&pkbuf, h.type, sess, gx_message, req);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = pgw_s5c_build_create_session_response(
|
||||
h.type, sess, gx_message, req);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
rv = bearer_binding(sess, gx_message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
bearer_binding(sess, gx_message);
|
||||
}
|
||||
|
||||
void pgw_gx_handle_cca_termination_request(
|
||||
|
@ -98,27 +97,24 @@ void pgw_gx_handle_cca_termination_request(
|
|||
h.type = OGS_GTP_DELETE_SESSION_RESPONSE_TYPE;
|
||||
h.teid = sgw_s5c_teid;
|
||||
|
||||
rv = pgw_s5c_build_delete_session_response(
|
||||
&pkbuf, h.type, gx_message, req);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = pgw_s5c_build_delete_session_response(
|
||||
h.type, gx_message, req);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void pgw_gx_handle_re_auth_request(
|
||||
pgw_sess_t *sess, ogs_diam_gx_message_t *gx_message)
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv = bearer_binding(sess, gx_message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
bearer_binding(sess, gx_message);
|
||||
}
|
||||
|
||||
static int bearer_binding(pgw_sess_t *sess, ogs_diam_gx_message_t *gx_message)
|
||||
static void bearer_binding(pgw_sess_t *sess, ogs_diam_gx_message_t *gx_message)
|
||||
{
|
||||
int rv;
|
||||
int i, j;
|
||||
|
@ -198,14 +194,14 @@ static int bearer_binding(pgw_sess_t *sess, ogs_diam_gx_message_t *gx_message)
|
|||
pgw_rule_t rule;
|
||||
pgw_pf_t *pf = NULL;
|
||||
|
||||
ogs_assert(flow);
|
||||
ogs_assert(flow->description);
|
||||
ogs_expect_or_return(flow);
|
||||
ogs_expect_or_return(flow->description);
|
||||
|
||||
rv = pgw_compile_packet_filter(&rule, flow->description);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
pf = pgw_pf_add(bearer, pcc_rule->precedence);
|
||||
ogs_assert(pf);
|
||||
ogs_expect_or_return(pf);
|
||||
|
||||
memcpy(&pf->rule, &rule, sizeof(pgw_rule_t));
|
||||
pf->direction = flow->direction;
|
||||
|
@ -217,23 +213,23 @@ static int bearer_binding(pgw_sess_t *sess, ogs_diam_gx_message_t *gx_message)
|
|||
h.type = OGS_GTP_CREATE_BEARER_REQUEST_TYPE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
rv = pgw_s5c_build_create_bearer_request(&pkbuf, h.type, bearer);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = pgw_s5c_build_create_bearer_request(h.type, bearer);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
} else {
|
||||
h.type = OGS_GTP_UPDATE_BEARER_REQUEST_TYPE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
rv = pgw_s5c_build_update_bearer_request(
|
||||
&pkbuf, h.type, bearer, qos_presence, tft_presence);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = pgw_s5c_build_update_bearer_request(
|
||||
h.type, bearer, qos_presence, tft_presence);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
}
|
||||
|
||||
xact = ogs_gtp_xact_local_create(
|
||||
sess->gnode, &h, pkbuf, timeout, sess);
|
||||
ogs_assert(xact);
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else if (pcc_rule->type == OGS_PCC_RULE_TYPE_REMOVE) {
|
||||
bearer = pgw_bearer_find_by_name(sess, pcc_rule->name);
|
||||
ogs_assert(bearer);
|
||||
|
@ -242,22 +238,18 @@ static int bearer_binding(pgw_sess_t *sess, ogs_diam_gx_message_t *gx_message)
|
|||
h.type = OGS_GTP_DELETE_BEARER_REQUEST_TYPE;
|
||||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
rv = pgw_s5c_build_delete_bearer_request(&pkbuf, h.type, bearer);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = pgw_s5c_build_delete_bearer_request(h.type, bearer);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(
|
||||
sess->gnode, &h, pkbuf, timeout, sess);
|
||||
ogs_assert(xact);
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
ogs_error("Invalid Type[%d]", pcc_rule->type);
|
||||
}
|
||||
else
|
||||
ogs_assert_if_reached();
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,8 +24,8 @@
|
|||
|
||||
static int16_t pgw_pco_build(uint8_t *pco_buf, ogs_tlv_pco_t *tlv_pco);
|
||||
|
||||
int pgw_s5c_build_create_session_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, pgw_sess_t *sess,
|
||||
ogs_pkbuf_t *pgw_s5c_build_create_session_response(
|
||||
uint8_t type, pgw_sess_t *sess,
|
||||
ogs_diam_gx_message_t *gx_message,
|
||||
ogs_gtp_create_session_request_t *req)
|
||||
{
|
||||
|
@ -130,19 +130,13 @@ int pgw_s5c_build_create_session_response(
|
|||
rsp->bearer_contexts_created.s5_s8_u_sgw_f_teid.len = len;
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int pgw_s5c_build_delete_session_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type,
|
||||
ogs_diam_gx_message_t *gx_message,
|
||||
ogs_pkbuf_t *pgw_s5c_build_delete_session_response(
|
||||
uint8_t type, ogs_diam_gx_message_t *gx_message,
|
||||
ogs_gtp_delete_session_request_t *req)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ogs_gtp_message_t gtp_message;
|
||||
ogs_gtp_delete_session_response_t *rsp = NULL;
|
||||
|
||||
|
@ -180,10 +174,7 @@ int pgw_s5c_build_delete_session_response(
|
|||
|
||||
/* build */
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
static void encode_traffic_flow_template(
|
||||
|
@ -289,8 +280,8 @@ static void encode_traffic_flow_template(
|
|||
tft->num_of_packet_filter = i;
|
||||
}
|
||||
|
||||
int pgw_s5c_build_create_bearer_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, pgw_bearer_t *bearer)
|
||||
ogs_pkbuf_t *pgw_s5c_build_create_bearer_request(
|
||||
uint8_t type, pgw_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
pgw_sess_t *sess = NULL;
|
||||
|
@ -363,17 +354,13 @@ int pgw_s5c_build_create_bearer_request(
|
|||
&tft, tft_buf, OGS_GTP_MAX_TRAFFIC_FLOW_TEMPLATE);
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int pgw_s5c_build_update_bearer_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, pgw_bearer_t *bearer,
|
||||
ogs_pkbuf_t *pgw_s5c_build_update_bearer_request(
|
||||
uint8_t type, pgw_bearer_t *bearer,
|
||||
int qos_presence, int tft_presence)
|
||||
{
|
||||
int rv;
|
||||
pgw_sess_t *sess = NULL;
|
||||
pgw_bearer_t *linked_bearer = NULL;
|
||||
|
||||
|
@ -430,16 +417,12 @@ int pgw_s5c_build_update_bearer_request(
|
|||
}
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
int pgw_s5c_build_delete_bearer_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, pgw_bearer_t *bearer)
|
||||
ogs_pkbuf_t *pgw_s5c_build_delete_bearer_request(
|
||||
uint8_t type, pgw_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
pgw_sess_t *sess = NULL;
|
||||
pgw_bearer_t *linked_bearer = NULL;
|
||||
|
||||
|
@ -469,10 +452,7 @@ int pgw_s5c_build_delete_bearer_request(
|
|||
}
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = ogs_gtp_build_msg(pkbuf, >p_message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return ogs_gtp_build_msg(>p_message);
|
||||
}
|
||||
|
||||
static int16_t pgw_pco_build(uint8_t *pco_buf, ogs_tlv_pco_t *tlv_pco)
|
||||
|
|
|
@ -26,22 +26,21 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int pgw_s5c_build_create_session_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, pgw_sess_t *sess,
|
||||
ogs_pkbuf_t *pgw_s5c_build_create_session_response(
|
||||
uint8_t type, pgw_sess_t *sess,
|
||||
ogs_diam_gx_message_t *gx_message,
|
||||
ogs_gtp_create_session_request_t *req);
|
||||
int pgw_s5c_build_delete_session_response(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type,
|
||||
ogs_diam_gx_message_t *gx_message,
|
||||
ogs_pkbuf_t *pgw_s5c_build_delete_session_response(
|
||||
uint8_t type, ogs_diam_gx_message_t *gx_message,
|
||||
ogs_gtp_delete_session_request_t *req);
|
||||
|
||||
int pgw_s5c_build_create_bearer_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, pgw_bearer_t *bearer);
|
||||
int pgw_s5c_build_update_bearer_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, pgw_bearer_t *bearer,
|
||||
ogs_pkbuf_t *pgw_s5c_build_create_bearer_request(
|
||||
uint8_t type, pgw_bearer_t *bearer);
|
||||
ogs_pkbuf_t *pgw_s5c_build_update_bearer_request(
|
||||
uint8_t type, pgw_bearer_t *bearer,
|
||||
int qos_presence, int tft_presence);
|
||||
int pgw_s5c_build_delete_bearer_request(
|
||||
ogs_pkbuf_t **pkbuf, uint8_t type, pgw_bearer_t *bearer);
|
||||
ogs_pkbuf_t *pgw_s5c_build_delete_bearer_request(
|
||||
uint8_t type, pgw_bearer_t *bearer);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -239,7 +239,7 @@ void pgw_s5c_handle_create_bearer_response(
|
|||
OGS_SETUP_GTP_NODE(bearer, sgw);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
ogs_debug("[PGW] Create Bearer Response : SGW[0x%x] --> PGW[0x%x]",
|
||||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
@ -268,7 +268,7 @@ void pgw_s5c_handle_update_bearer_response(
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
ogs_debug("[PGW] Update Bearer Response : SGW[0x%x] --> PGW[0x%x]",
|
||||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
@ -302,7 +302,7 @@ void pgw_s5c_handle_delete_bearer_response(
|
|||
ogs_assert(bearer);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
ogs_debug("[PGW] Delete Bearer Response : SGW[0x%x] --> PGW[0x%x]",
|
||||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
|
|
@ -358,7 +358,7 @@ void sgw_gtp_close(void)
|
|||
ogs_pkbuf_pool_destroy(packet_pool);
|
||||
}
|
||||
|
||||
int sgw_gtp_send_end_marker(sgw_tunnel_t *s1u_tunnel)
|
||||
void sgw_gtp_send_end_marker(sgw_tunnel_t *s1u_tunnel)
|
||||
{
|
||||
char buf[OGS_ADDRSTRLEN];
|
||||
int rv;
|
||||
|
@ -390,8 +390,5 @@ int sgw_gtp_send_end_marker(sgw_tunnel_t *s1u_tunnel)
|
|||
h->teid = htonl(s1u_tunnel->remote_teid);
|
||||
|
||||
rv = ogs_gtp_sendto(s1u_tunnel->gnode, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
|
||||
return rv;
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ extern "C" {
|
|||
int sgw_gtp_open(void);
|
||||
void sgw_gtp_close(void);
|
||||
|
||||
int sgw_gtp_send_end_marker(sgw_tunnel_t *s1u_tunnel);
|
||||
void sgw_gtp_send_end_marker(sgw_tunnel_t *s1u_tunnel);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -193,17 +193,17 @@ void sgw_s11_handle_create_session_request(ogs_gtp_xact_t *s11_xact,
|
|||
message->h.type = OGS_GTP_CREATE_SESSION_REQUEST_TYPE;
|
||||
message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
s5c_xact = ogs_gtp_xact_local_create(
|
||||
sess->gnode, &message->h, pkbuf, timeout, sess);
|
||||
ogs_assert(s5c_xact);
|
||||
ogs_expect_or_return(s5c_xact);
|
||||
|
||||
ogs_gtp_xact_associate(s11_xact, s5c_xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s5c_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_modify_bearer_request(ogs_gtp_xact_t *s11_xact,
|
||||
|
@ -349,9 +349,7 @@ void sgw_s11_handle_modify_bearer_request(ogs_gtp_xact_t *s11_xact,
|
|||
ogs_debug("[SGW] SEND End Marker to ENB[%s]: TEID[0x%x]",
|
||||
OGS_ADDR(&s1u_tunnel->gnode->remote_addr, buf),
|
||||
s1u_tunnel->remote_teid);
|
||||
rv = sgw_gtp_send_end_marker(s1u_tunnel);
|
||||
if (rv != OGS_OK)
|
||||
ogs_error("gtp send end marker failed");
|
||||
sgw_gtp_send_end_marker(s1u_tunnel);
|
||||
}
|
||||
|
||||
/* Setup GTP Node */
|
||||
|
@ -363,14 +361,14 @@ void sgw_s11_handle_modify_bearer_request(ogs_gtp_xact_t *s11_xact,
|
|||
message.h.type = OGS_GTP_MODIFY_BEARER_RESPONSE_TYPE;
|
||||
message.h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, &message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(&message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s11_xact, &message.h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_delete_session_request(ogs_gtp_xact_t *s11_xact,
|
||||
|
@ -417,17 +415,17 @@ void sgw_s11_handle_delete_session_request(ogs_gtp_xact_t *s11_xact,
|
|||
message->h.type = OGS_GTP_DELETE_SESSION_REQUEST_TYPE;
|
||||
message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
s5c_xact = ogs_gtp_xact_local_create(
|
||||
sess->gnode, &message->h, pkbuf, timeout, sess);
|
||||
ogs_assert(s5c_xact);
|
||||
ogs_expect_or_return(s5c_xact);
|
||||
|
||||
ogs_gtp_xact_associate(s11_xact, s5c_xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s5c_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_create_bearer_response(ogs_gtp_xact_t *s11_xact,
|
||||
|
@ -467,7 +465,7 @@ void sgw_s11_handle_create_bearer_response(ogs_gtp_xact_t *s11_xact,
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
req = &message->create_bearer_response;
|
||||
|
||||
|
@ -601,14 +599,14 @@ void sgw_s11_handle_create_bearer_response(ogs_gtp_xact_t *s11_xact,
|
|||
message->h.type = OGS_GTP_CREATE_BEARER_RESPONSE_TYPE;
|
||||
message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s5c_xact, &message->h, pkbuf);
|
||||
ogs_assert(s5c_xact);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s5c_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_update_bearer_response(ogs_gtp_xact_t *s11_xact,
|
||||
|
@ -639,7 +637,7 @@ void sgw_s11_handle_update_bearer_response(ogs_gtp_xact_t *s11_xact,
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
req = &message->update_bearer_response;
|
||||
|
||||
|
@ -701,14 +699,14 @@ void sgw_s11_handle_update_bearer_response(ogs_gtp_xact_t *s11_xact,
|
|||
message->h.type = OGS_GTP_UPDATE_BEARER_RESPONSE_TYPE;
|
||||
message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s5c_xact, &message->h, pkbuf);
|
||||
ogs_assert(s5c_xact);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s5c_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_delete_bearer_response(ogs_gtp_xact_t *s11_xact,
|
||||
|
@ -740,7 +738,7 @@ void sgw_s11_handle_delete_bearer_response(ogs_gtp_xact_t *s11_xact,
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
req = &message->delete_bearer_response;
|
||||
|
||||
|
@ -802,14 +800,14 @@ void sgw_s11_handle_delete_bearer_response(ogs_gtp_xact_t *s11_xact,
|
|||
message->h.type = OGS_GTP_DELETE_BEARER_RESPONSE_TYPE;
|
||||
message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s5c_xact, &message->h, pkbuf);
|
||||
ogs_assert(s5c_xact);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s5c_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
sgw_bearer_remove(bearer);
|
||||
}
|
||||
|
@ -881,14 +879,14 @@ void sgw_s11_handle_release_access_bearers_request(ogs_gtp_xact_t *s11_xact,
|
|||
message.h.type = OGS_GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE;
|
||||
message.h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, &message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(&message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s11_xact, &message.h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_lo_dldata_notification(sgw_bearer_t *bearer)
|
||||
|
@ -926,15 +924,15 @@ void sgw_s11_handle_lo_dldata_notification(sgw_bearer_t *bearer)
|
|||
message.h.type = OGS_GTP_DOWNLINK_DATA_NOTIFICATION_TYPE;
|
||||
message.h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, &message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(&message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(
|
||||
sgw_ue->gnode, &message.h, pkbuf, timeout, sgw_ue);
|
||||
ogs_assert(xact);
|
||||
ogs_expect_or_return(xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_downlink_data_notification_ack(
|
||||
|
@ -954,7 +952,7 @@ void sgw_s11_handle_downlink_data_notification_ack(
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]",
|
||||
sgw_ue->mme_s11_teid, sgw_ue->sgw_s11_teid);
|
||||
|
@ -1121,14 +1119,14 @@ void sgw_s11_handle_create_indirect_data_forwarding_tunnel_request(
|
|||
OGS_GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE;
|
||||
message.h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, &message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(&message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s11_xact, &message.h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_delete_indirect_data_forwarding_tunnel_request(
|
||||
|
@ -1203,12 +1201,12 @@ void sgw_s11_handle_delete_indirect_data_forwarding_tunnel_request(
|
|||
OGS_GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE;
|
||||
message.h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, &message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(&message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s11_xact, &message.h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ void sgw_s5c_handle_create_session_response(ogs_gtp_xact_t *s5c_xact,
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(s5c_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
rsp = &message->create_session_response;
|
||||
|
||||
|
@ -202,14 +202,14 @@ void sgw_s5c_handle_create_session_response(ogs_gtp_xact_t *s5c_xact,
|
|||
message->h.type = OGS_GTP_CREATE_SESSION_RESPONSE_TYPE;
|
||||
message->h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s11_xact, &message->h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s5c_handle_delete_session_response(ogs_gtp_xact_t *s5c_xact,
|
||||
|
@ -236,7 +236,7 @@ void sgw_s5c_handle_delete_session_response(ogs_gtp_xact_t *s5c_xact,
|
|||
}
|
||||
|
||||
rv = ogs_gtp_xact_commit(s5c_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
rsp = &message->delete_session_response;
|
||||
|
||||
|
@ -270,14 +270,14 @@ void sgw_s5c_handle_delete_session_response(ogs_gtp_xact_t *s5c_xact,
|
|||
message->h.type = OGS_GTP_DELETE_SESSION_RESPONSE_TYPE;
|
||||
message->h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(s11_xact, &message->h, pkbuf);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s5c_handle_create_bearer_request(ogs_gtp_xact_t *s5c_xact,
|
||||
|
@ -385,17 +385,17 @@ void sgw_s5c_handle_create_bearer_request(ogs_gtp_xact_t *s5c_xact,
|
|||
message->h.type = OGS_GTP_CREATE_BEARER_REQUEST_TYPE;
|
||||
message->h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
s11_xact = ogs_gtp_xact_local_create(
|
||||
sgw_ue->gnode, &message->h, pkbuf, timeout, sess);
|
||||
ogs_assert(s11_xact);
|
||||
ogs_expect_or_return(s11_xact);
|
||||
|
||||
ogs_gtp_xact_associate(s5c_xact, s11_xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
void sgw_s5c_handle_update_bearer_request(ogs_gtp_xact_t *s5c_xact,
|
||||
|
@ -447,17 +447,17 @@ void sgw_s5c_handle_update_bearer_request(ogs_gtp_xact_t *s5c_xact,
|
|||
message->h.type = OGS_GTP_UPDATE_BEARER_REQUEST_TYPE;
|
||||
message->h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
s11_xact = ogs_gtp_xact_local_create(
|
||||
sgw_ue->gnode, &message->h, pkbuf, timeout, sess);
|
||||
ogs_assert(s11_xact);
|
||||
ogs_expect_or_return(s11_xact);
|
||||
|
||||
ogs_gtp_xact_associate(s5c_xact, s11_xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
ogs_debug("[SGW] Update Bearer Request : SGW <-- PGW");
|
||||
}
|
||||
|
@ -508,16 +508,16 @@ void sgw_s5c_handle_delete_bearer_request(ogs_gtp_xact_t *s5c_xact,
|
|||
message->h.type = OGS_GTP_DELETE_BEARER_REQUEST_TYPE;
|
||||
message->h.teid = sgw_ue->mme_s11_teid;
|
||||
|
||||
rv = ogs_gtp_build_msg(&pkbuf, message);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
pkbuf = ogs_gtp_build_msg(message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
|
||||
s11_xact = ogs_gtp_xact_local_create(
|
||||
sgw_ue->gnode, &message->h, pkbuf, timeout, sess);
|
||||
ogs_assert(s11_xact);
|
||||
ogs_expect_or_return(s11_xact);
|
||||
|
||||
ogs_gtp_xact_associate(s5c_xact, s11_xact);
|
||||
|
||||
rv = ogs_gtp_xact_commit(s11_xact);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
|
|
|
@ -289,14 +289,11 @@ int tests1ap_build_setup_req(
|
|||
|
||||
*PagingDRX = S1AP_PagingDRX_v64;
|
||||
|
||||
rv = ogs_s1ap_encode(pkbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
*pkbuf = ogs_s1ap_encode(&pdu);
|
||||
if (*pkbuf == NULL) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
@ -1171,14 +1168,11 @@ int tests1ap_build_initial_context_setup_response(
|
|||
ogs_assert(rv == OGS_OK);
|
||||
ogs_s1ap_uint32_to_OCTET_STRING(teid, &e_rab->gTP_TEID);
|
||||
|
||||
rv = ogs_s1ap_encode(pkbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
*pkbuf = ogs_s1ap_encode(&pdu);
|
||||
if (*pkbuf == NULL) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
@ -1235,14 +1229,11 @@ int tests1ap_build_ue_context_modification_response(
|
|||
*MME_UE_S1AP_ID = mme_ue_s1ap_id;
|
||||
*ENB_UE_S1AP_ID = enb_ue_s1ap_id;
|
||||
|
||||
rv = ogs_s1ap_encode(pkbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
*pkbuf = ogs_s1ap_encode(&pdu);
|
||||
if (*pkbuf == NULL) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
@ -2140,14 +2131,11 @@ int tests1ap_build_e_rab_setup_response(
|
|||
ogs_assert(rv == OGS_OK);
|
||||
ogs_s1ap_uint32_to_OCTET_STRING(teid, &e_rab->gTP_TEID);
|
||||
|
||||
rv = ogs_s1ap_encode(pkbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
*pkbuf = ogs_s1ap_encode(&pdu);
|
||||
if (*pkbuf == NULL) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
@ -2594,14 +2582,11 @@ int tests1ap_build_path_switch_request(
|
|||
UESecurityCapabilities->integrityProtectionAlgorithms.buf[0] =
|
||||
(mme_ue->ue_network_capability.eia << 1);
|
||||
|
||||
rv = ogs_s1ap_encode(pkbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
*pkbuf = ogs_s1ap_encode(&pdu);
|
||||
if (*pkbuf == NULL) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
@ -2847,14 +2832,11 @@ int tests1ap_build_handover_request_ack(
|
|||
OGS_HEX(payload, strlen(payload), hexbuf), 132,
|
||||
Target_ToSource_TransparentContainer);
|
||||
|
||||
rv = ogs_s1ap_encode(pkbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
*pkbuf = ogs_s1ap_encode(&pdu);
|
||||
if (*pkbuf == NULL) {
|
||||
ogs_error("ogs_s1ap_encode() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -1523,7 +1523,7 @@ static void attach_test5(abts_case *tc, void *data)
|
|||
mme_ue_s1ap_id = CALLOC(1, sizeof(S1AP_MME_UE_S1AP_ID_t));
|
||||
ogs_assert(mme_ue_s1ap_id);
|
||||
*mme_ue_s1ap_id = 2;
|
||||
rv = s1ap_build_s1_reset_partial(&sendbuf,
|
||||
sendbuf = s1ap_build_s1_reset_partial(
|
||||
S1AP_Cause_PR_radioNetwork,
|
||||
S1AP_CauseRadioNetwork_release_due_to_eutran_generated_reason,
|
||||
mme_ue_s1ap_id, NULL);
|
||||
|
|
|
@ -238,8 +238,7 @@ static void test1_func(abts_case *tc, void *data)
|
|||
ogs_s1ap_buffer_to_OCTET_STRING(buf, size, UERadioCapability);
|
||||
}
|
||||
|
||||
rv = ogs_s1ap_encode(&s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
s1apbuf = ogs_s1ap_encode(&pdu);
|
||||
ogs_pkbuf_free(s1apbuf);
|
||||
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
|
@ -249,6 +248,7 @@ static int test_build_mme_configuration_transfer(
|
|||
S1AP_SONConfigurationTransfer_t *son_configuration_transfer)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf;
|
||||
|
||||
S1AP_S1AP_PDU_t pdu;
|
||||
S1AP_InitiatingMessage_t *initiatingMessage = NULL;
|
||||
|
@ -288,10 +288,7 @@ static int test_build_mme_configuration_transfer(
|
|||
son_configuration_transfer, SONConfigurationTransfer);
|
||||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
ogs_pkbuf_t *s1apbuf;
|
||||
rv = ogs_s1ap_encode(&s1apbuf, &pdu);
|
||||
ogs_s1ap_free(&pdu);
|
||||
|
||||
s1apbuf = ogs_s1ap_encode(&pdu);
|
||||
ogs_pkbuf_free(s1apbuf);
|
||||
|
||||
return OGS_OK;
|
||||
|
|
|
@ -178,9 +178,9 @@ static void gtp_message_test1(abts_case *tc, void *data)
|
|||
req.charging_characteristics.data = (uint8_t *)"\x54\x00";
|
||||
req.charging_characteristics.len = 2;
|
||||
|
||||
rv = ogs_tlv_build_msg(&pkbuf, &ogs_tlv_desc_create_session_request, &req,
|
||||
pkbuf = ogs_tlv_build_msg(&ogs_tlv_desc_create_session_request, &req,
|
||||
OGS_TLV_MODE_T1_L2_I1);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
ABTS_PTR_NOTNULL(tc, pkbuf);
|
||||
|
||||
ABTS_TRUE(tc, memcmp(pkbuf->data,
|
||||
OGS_HEX(_payload, strlen(_payload), hexbuf), pkbuf->len) == 0);
|
||||
|
|
|
@ -123,8 +123,7 @@ static void ogs_nas_message_test2(abts_case *tc, void *data)
|
|||
attach_accept->eps_network_feature_support.emc_bs = 1;
|
||||
attach_accept->eps_network_feature_support.ims_vops = 1;
|
||||
|
||||
rv = ogs_nas_plain_encode(&pkbuf, &message);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
pkbuf = ogs_nas_plain_encode(&message);
|
||||
ABTS_INT_EQUAL(tc, sizeof(buffer), pkbuf->len);
|
||||
ogs_log_hexdump(OGS_LOG_DEBUG, pkbuf->data, pkbuf->len);
|
||||
ABTS_TRUE(tc, memcmp(OGS_HEX(payload, strlen(payload), buffer),
|
||||
|
@ -171,8 +170,7 @@ static void ogs_nas_message_test4(abts_case *tc, void *data)
|
|||
message.emm.h.message_type = OGS_NAS_ATTACH_REJECT;
|
||||
attach_reject->emm_cause = EMM_CAUSE_NETWORK_FAILURE;
|
||||
|
||||
rv = ogs_nas_plain_encode(&pkbuf, &message);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
pkbuf = ogs_nas_plain_encode(&message);
|
||||
ABTS_INT_EQUAL(tc, sizeof(buffer), pkbuf->len);
|
||||
ABTS_TRUE(tc, memcmp(OGS_HEX(payload, strlen(payload), buffer),
|
||||
pkbuf->data, pkbuf->len) == 0);
|
||||
|
@ -259,8 +257,7 @@ static void ogs_nas_message_test7(abts_case *tc, void *data)
|
|||
identity_response->mobile_identity.imsi.digit14 = 1;
|
||||
identity_response->mobile_identity.imsi.digit15 = 5;
|
||||
|
||||
rv = ogs_nas_plain_encode(&pkbuf, &message);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
pkbuf = ogs_nas_plain_encode(&message);
|
||||
ABTS_INT_EQUAL(tc, sizeof(buffer), pkbuf->len);
|
||||
ABTS_TRUE(tc, memcmp(OGS_HEX(payload, strlen(payload), buffer),
|
||||
pkbuf->data, pkbuf->len) == 0);
|
||||
|
@ -307,8 +304,7 @@ static void ogs_nas_message_test8(abts_case *tc, void *data)
|
|||
ksi_and_sequence_number->sequence_number = 8;
|
||||
service_request->message_authentication_code = 0x640c;
|
||||
|
||||
rv = ogs_nas_plain_encode(&pkbuf, &message);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
pkbuf = ogs_nas_plain_encode(&message);
|
||||
ABTS_INT_EQUAL(tc, sizeof(buffer), pkbuf->len);
|
||||
ABTS_TRUE(tc, memcmp(OGS_HEX(payload, strlen(payload), buffer),
|
||||
pkbuf->data, pkbuf->len) == 0);
|
||||
|
|
|
@ -97,9 +97,8 @@ static void s1ap_message_test4(abts_case *tc, void *data)
|
|||
mme_self()->served_gummei[0].num_of_mme_gid = 1;
|
||||
mme_self()->served_gummei[0].num_of_mme_code = 1;
|
||||
|
||||
rv = s1ap_build_setup_rsp(&pkbuf);
|
||||
pkbuf = s1ap_build_setup_rsp();
|
||||
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
ABTS_PTR_NOTNULL(tc, pkbuf);
|
||||
ABTS_PTR_NOTNULL(tc, pkbuf->data);
|
||||
ABTS_INT_EQUAL(tc, 27, pkbuf->len);
|
||||
|
@ -157,8 +156,7 @@ static void s1ap_message_test6(abts_case *tc, void *data)
|
|||
for (i = 0; i < emmbuf->len; i++)
|
||||
((char *)emmbuf->data)[i] = 0xef;
|
||||
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, &enb_ue, emmbuf);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
s1apbuf = s1ap_build_downlink_nas_transport(&enb_ue, emmbuf);
|
||||
ABTS_TRUE(tc, memcmp(OGS_HEX(_result, strlen(_result), buffer),
|
||||
s1apbuf->data, s1apbuf->len) == 0);
|
||||
ogs_pkbuf_free(s1apbuf);
|
||||
|
|
Loading…
Reference in New Issue