fix the bug not to access mme_ue context in freediameter thread
This commit is contained in:
parent
0ecc05e9d3
commit
8d1a5e2d35
|
@ -169,10 +169,11 @@ typedef struct _pdn_t {
|
|||
#define S6A_PDN_TYPE_IPV4_AND_IPV6 2
|
||||
#define S6A_PDN_TYPE_IPV4_OR_IPV6 3
|
||||
c_int8_t pdn_type;
|
||||
paa_t paa;
|
||||
|
||||
qos_t qos;
|
||||
bitrate_t ambr; /* APN-AMBR */
|
||||
|
||||
paa_t paa;
|
||||
} pdn_t;
|
||||
|
||||
CORE_DECLARE(c_int16_t) apn_build(c_int8_t *dst, c_int8_t *src, c_int16_t len);
|
||||
|
|
|
@ -5,43 +5,29 @@
|
|||
|
||||
#include "gx_message.h"
|
||||
|
||||
void gx_message_free(gx_message_t *gx_message)
|
||||
void gx_cca_message_free(gx_cca_message_t *cca_message)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
d_assert(gx_message, return, "Null param");
|
||||
d_assert(cca_message, return, "Null param");
|
||||
|
||||
switch(gx_message->cmd_code)
|
||||
for (i = 0; i < cca_message->num_of_pcc_rule; i++)
|
||||
{
|
||||
case GX_CMD_CODE_CREDIT_CONTROL:
|
||||
pcc_rule_t *pcc_rule = &cca_message->pcc_rule[i];
|
||||
|
||||
if (pcc_rule->name)
|
||||
core_free(pcc_rule->name);
|
||||
else
|
||||
d_assert(0,, "Null param");
|
||||
|
||||
for (j = 0; j < pcc_rule->num_of_flow; j++)
|
||||
{
|
||||
gx_cca_message_t *cca_message = &gx_message->cca_message;
|
||||
flow_t *flow = &pcc_rule->flow[j];
|
||||
|
||||
for (i = 0; i < cca_message->num_of_pcc_rule; i++)
|
||||
{
|
||||
pcc_rule_t *pcc_rule = &cca_message->pcc_rule[i];
|
||||
|
||||
if (pcc_rule->name)
|
||||
core_free(pcc_rule->name);
|
||||
else
|
||||
d_assert(0,, "Null param");
|
||||
|
||||
for (j = 0; j < pcc_rule->num_of_flow; j++)
|
||||
{
|
||||
flow_t *flow = &pcc_rule->flow[j];
|
||||
|
||||
if (flow->description)
|
||||
core_free(flow->description);
|
||||
else
|
||||
d_assert(0,, "Null param");
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
break;
|
||||
if (flow->description)
|
||||
core_free(flow->description);
|
||||
else
|
||||
d_assert(0,, "Null param");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,7 +13,6 @@ typedef struct _gx_cca_message_t {
|
|||
#define GX_CC_REQUEST_TYPE_TERMINATION_REQUEST 3
|
||||
#define GX_CC_REQUEST_TYPE_EVENT_REQUEST 4
|
||||
c_uint32_t cc_request_type;
|
||||
c_uint32_t result_code;
|
||||
|
||||
pdn_t pdn;
|
||||
pcc_rule_t pcc_rule[MAX_NUM_OF_PCC_RULE];
|
||||
|
@ -24,10 +23,12 @@ typedef struct _gx_message_t {
|
|||
#define GX_CMD_CODE_CREDIT_CONTROL 272
|
||||
c_uint16_t cmd_code;
|
||||
|
||||
c_uint32_t result_code;
|
||||
|
||||
gx_cca_message_t cca_message;
|
||||
} gx_message_t;
|
||||
|
||||
CORE_DECLARE(void) gx_message_free(gx_message_t *gx_message);
|
||||
CORE_DECLARE(void) gx_cca_message_free(gx_cca_message_t *cca_message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ libmme_la_SOURCES = \
|
|||
mme_kdf.h kasumi.h snow_3g.h zuc.h \
|
||||
mme_event.h mme_context.h \
|
||||
s1ap_build.h s1ap_handler.h s1ap_conv.h s1ap_path.h \
|
||||
mme_fd_path.h \
|
||||
mme_fd_path.h mme_s6a_handler.h \
|
||||
nas_conv.h nas_security.h nas_path.h \
|
||||
emm_handler.h emm_build.h \
|
||||
esm_handler.h esm_build.h \
|
||||
|
@ -15,7 +15,7 @@ libmme_la_SOURCES = \
|
|||
mme_kdf.c kasumi.c snow_3g.c zuc.c \
|
||||
mme_init.c mme_event.c mme_context.c \
|
||||
s1ap_sm.c s1ap_build.c s1ap_handler.c s1ap_conv.c s1ap_path.c \
|
||||
mme_fd_path.c \
|
||||
mme_fd_path.c mme_s6a_handler.c \
|
||||
nas_conv.c nas_security.c nas_path.c \
|
||||
emm_sm.c emm_handler.c emm_build.c \
|
||||
esm_sm.c esm_handler.c esm_build.c \
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include "nas_message.h"
|
||||
#include "fd_lib.h"
|
||||
#include "s6a_message.h"
|
||||
|
||||
#include "mme_event.h"
|
||||
#include "mme_kdf.h"
|
||||
|
@ -229,72 +230,6 @@ void emm_state_operational(fsm_t *s, event_t *e)
|
|||
|
||||
break;
|
||||
}
|
||||
case MME_EVT_EMM_UE_FROM_S6A:
|
||||
{
|
||||
index_t index = event_get_param1(e);
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
d_assert(index, return, "Null param");
|
||||
mme_ue = mme_ue_find(index);
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
|
||||
switch(event_get_param2(e))
|
||||
{
|
||||
case S6A_CMD_AUTHENTICATION_INFORMATION:
|
||||
{
|
||||
c_uint32_t result_code = event_get_param3(e);
|
||||
if (result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
emm_handle_attach_reject(mme_ue);
|
||||
return;
|
||||
}
|
||||
|
||||
emm_handle_authentication_request(mme_ue);
|
||||
break;
|
||||
}
|
||||
case S6A_CMD_UPDATE_LOCATION:
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
c_uint32_t result_code = event_get_param3(e);
|
||||
if (result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
d_error("Not impleneted");
|
||||
return;
|
||||
}
|
||||
|
||||
sess = mme_sess_find_by_last_esm_message(mme_ue);
|
||||
d_assert(sess, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
|
||||
if (MME_SESSION_HAVE_APN(sess))
|
||||
{
|
||||
if (MME_SESSION_IS_VALID(sess))
|
||||
{
|
||||
emm_handle_attach_accept(sess);
|
||||
}
|
||||
else
|
||||
{
|
||||
mme_s11_handle_create_session_request(sess);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
esm_handle_information_request(sess);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
d_error("Invalid type(%d)", event_get_param2(e));
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
d_error("Unknown event %s", mme_event_get_name(e));
|
||||
|
|
|
@ -1683,42 +1683,32 @@ mme_bearer_t* mme_bearer_next(mme_bearer_t *bearer)
|
|||
return list_next(bearer);
|
||||
}
|
||||
|
||||
pdn_t* mme_pdn_add(mme_ue_t *mme_ue, c_int8_t *apn)
|
||||
{
|
||||
pdn_t *pdn = NULL;
|
||||
|
||||
d_assert(mme_ue, return NULL, "Null param");
|
||||
d_assert(apn, return NULL, "Null param");
|
||||
|
||||
pdn = &mme_ue->pdn[mme_ue->num_of_pdn];
|
||||
d_assert(pdn, return NULL, "PDN context allocation failed");
|
||||
|
||||
memset(pdn, 0, sizeof(pdn_t));
|
||||
strcpy(pdn->apn, apn);
|
||||
|
||||
mme_ue->num_of_pdn++;
|
||||
|
||||
return pdn;
|
||||
}
|
||||
|
||||
status_t mme_pdn_remove_all(mme_ue_t *mme_ue)
|
||||
{
|
||||
s6a_subscription_data_t *subscription_data = NULL;
|
||||
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
mme_ue->num_of_pdn = 0;
|
||||
subscription_data = &mme_ue->subscription_data;
|
||||
d_assert(subscription_data, return CORE_ERROR, "Null param");
|
||||
|
||||
subscription_data->num_of_pdn = 0;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
pdn_t* mme_pdn_find_by_apn(mme_ue_t *mme_ue, c_int8_t *apn)
|
||||
{
|
||||
s6a_subscription_data_t *subscription_data = NULL;
|
||||
pdn_t *pdn = NULL;
|
||||
int i = 0;
|
||||
|
||||
d_assert(mme_ue, return NULL, "Null param");
|
||||
subscription_data = &mme_ue->subscription_data;
|
||||
d_assert(subscription_data, return NULL, "Null param");
|
||||
|
||||
for (i = 0; i < mme_ue->num_of_pdn; i++)
|
||||
for (i = 0; i < subscription_data->num_of_pdn; i++)
|
||||
{
|
||||
pdn = &mme_ue->pdn[i];
|
||||
pdn = &subscription_data->pdn[i];
|
||||
if (strcmp(pdn->apn, apn) == 0)
|
||||
return pdn;
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "types.h"
|
||||
#include "nas_message.h"
|
||||
#include "gtp_xact.h"
|
||||
#include "s6a_message.h"
|
||||
|
||||
#include "mme_sm.h"
|
||||
|
||||
|
@ -204,11 +205,7 @@ struct _mme_ue_t {
|
|||
c_uint8_t selected_int_algorithm;
|
||||
|
||||
/* HSS Info */
|
||||
c_uint32_t ula_flags;
|
||||
bitrate_t ambr; /* UE-AMBR */
|
||||
c_uint32_t subscribed_rau_tau_timer; /* unit: seconds */
|
||||
pdn_t pdn[MAX_NUM_OF_PDN]; /* APN Configruration */
|
||||
int num_of_pdn;
|
||||
s6a_subscription_data_t subscription_data;
|
||||
|
||||
/* ESM Info */
|
||||
c_uint8_t ebi; /* EPS Bearer ID generator */
|
||||
|
|
|
@ -25,8 +25,6 @@ char* mme_event_get_name(event_t *e)
|
|||
|
||||
case MME_EVT_EMM_UE_MSG:
|
||||
return "MME_EVT_EMM_UE_MSG";
|
||||
case MME_EVT_EMM_UE_FROM_S6A:
|
||||
return "MME_EVT_EMM_UE_FROM_S6A";
|
||||
case MME_EVT_EMM_UE_T3413:
|
||||
return "MME_EVT_EMM_UE_T3413";
|
||||
|
||||
|
@ -38,6 +36,9 @@ char* mme_event_get_name(event_t *e)
|
|||
case MME_EVT_S11_TRANSACTION_T3:
|
||||
return "MME_EVT_S11_TRANSACTION_T3";
|
||||
|
||||
case MME_EVT_S6A_MESSAGE:
|
||||
return "MME_EVT_S6A_MESSAGE";
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -8,9 +8,6 @@
|
|||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#define S6A_CMD_UPDATE_LOCATION 316
|
||||
#define S6A_CMD_AUTHENTICATION_INFORMATION 318
|
||||
|
||||
/* forward declaration */
|
||||
typedef enum {
|
||||
MME_EVT_BASE = FSM_USER_SIG,
|
||||
|
@ -20,7 +17,6 @@ typedef enum {
|
|||
MME_EVT_S1AP_ENB_LO_CONNREFUSED,
|
||||
|
||||
MME_EVT_EMM_UE_MSG,
|
||||
MME_EVT_EMM_UE_FROM_S6A,
|
||||
MME_EVT_EMM_UE_T3413,
|
||||
|
||||
MME_EVT_ESM_BEARER_MSG,
|
||||
|
@ -28,6 +24,8 @@ typedef enum {
|
|||
MME_EVT_S11_UE_MSG,
|
||||
MME_EVT_S11_TRANSACTION_T3,
|
||||
|
||||
MME_EVT_S6A_MESSAGE,
|
||||
|
||||
MME_EVT_TOP,
|
||||
|
||||
} event_e;
|
||||
|
|
|
@ -138,11 +138,15 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||
struct avp_hdr *hdr;
|
||||
unsigned long dur;
|
||||
int error = 0;
|
||||
c_uint32_t result_code = 0;
|
||||
int new;
|
||||
|
||||
event_t e;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
pkbuf_t *s6abuf = NULL;
|
||||
s6a_message_t *s6a_message = NULL;
|
||||
s6a_aia_message_t *aia_message = NULL;
|
||||
c_uint16_t s6abuf_len = 0;
|
||||
e_utran_vector_t *e_utran_vector = NULL;
|
||||
|
||||
CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &ts), return );
|
||||
|
||||
|
@ -157,15 +161,29 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||
mme_ue = mi->mme_ue;
|
||||
d_assert(mme_ue, return, );
|
||||
|
||||
d_trace(3, "[S6A] Authentication-Information-Answer : UE[%s] <-- HSS\n",
|
||||
mme_ue->imsi_bcd);
|
||||
s6abuf_len = sizeof(s6a_message_t);
|
||||
d_assert(s6abuf_len < 8192, return, "Not supported size:%d", s6abuf_len);
|
||||
s6abuf = pkbuf_alloc(0, s6abuf_len);
|
||||
d_assert(s6abuf, return, "Null param");
|
||||
s6a_message = s6abuf->payload;
|
||||
d_assert(s6a_message, return, "Null param");
|
||||
|
||||
d_trace(3, "[S6A] Authentication-Information-Answer : UE <-- HSS\n");
|
||||
|
||||
/* Set Authentication-Information Command */
|
||||
memset(s6a_message, 0, s6abuf_len);
|
||||
s6a_message->cmd_code = S6A_CMD_CODE_AUTHENTICATION_INFORMATION;
|
||||
aia_message = &s6a_message->aia_message;
|
||||
d_assert(aia_message, return, "Null param");
|
||||
e_utran_vector = &aia_message->e_utran_vector;
|
||||
d_assert(e_utran_vector, return, "Null param");
|
||||
|
||||
/* Value of Result Code */
|
||||
CHECK_FCT_DO( fd_msg_search_avp(*msg, fd_result_code, &avp), return );
|
||||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp, &hdr), return);
|
||||
result_code = hdr->avp_value->i32;
|
||||
s6a_message->result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Result Code: %d\n", hdr->avp_value->i32);
|
||||
}
|
||||
else
|
||||
|
@ -179,8 +197,9 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||
if (avpch)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avpch, &hdr), return);
|
||||
result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Experimental Result Code: %d\n", result_code);
|
||||
s6a_message->result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Experimental Result Code: %d\n",
|
||||
s6a_message->result_code);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -218,9 +237,9 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||
error++;
|
||||
}
|
||||
|
||||
if (result_code != ER_DIAMETER_SUCCESS)
|
||||
if (s6a_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
d_warn("ERROR DIAMETER Result Code(%d)", result_code);
|
||||
d_warn("ERROR DIAMETER Result Code(%d)", s6a_message->result_code);
|
||||
error++;
|
||||
goto out;
|
||||
}
|
||||
|
@ -248,8 +267,9 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp_xres, &hdr), return );
|
||||
memcpy(mme_ue->xres, hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
mme_ue->xres_len = hdr->avp_value->os.len;
|
||||
memcpy(e_utran_vector->xres,
|
||||
hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
e_utran_vector->xres_len = hdr->avp_value->os.len;
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
@ -259,7 +279,8 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp_kasme, &hdr), return );
|
||||
memcpy(mme_ue->kasme, hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
memcpy(e_utran_vector->kasme,
|
||||
hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
@ -270,7 +291,8 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp_rand, &hdr), return );
|
||||
memcpy(mme_ue->rand, hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
memcpy(e_utran_vector->rand,
|
||||
hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
@ -280,16 +302,16 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp_autn, &hdr), return );
|
||||
memcpy(mme_ue->autn, hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
memcpy(e_utran_vector->autn,
|
||||
hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
||||
out:
|
||||
event_set(&e, MME_EVT_EMM_UE_FROM_S6A);
|
||||
event_set(&e, MME_EVT_S6A_MESSAGE);
|
||||
event_set_param1(&e, (c_uintptr_t)mme_ue->index);
|
||||
event_set_param2(&e, (c_uintptr_t)S6A_CMD_AUTHENTICATION_INFORMATION);
|
||||
event_set_param3(&e, (c_uintptr_t)result_code);
|
||||
event_set_param2(&e, (c_uintptr_t)s6abuf);
|
||||
mme_event_send(&e);
|
||||
|
||||
/* Free the message */
|
||||
|
@ -450,12 +472,15 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
struct avp_hdr *hdr;
|
||||
unsigned long dur;
|
||||
int error = 0;
|
||||
c_uint32_t result_code = 0;
|
||||
int new;
|
||||
|
||||
event_t e;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
pdn_t *pdn = NULL;
|
||||
pkbuf_t *s6abuf = NULL;
|
||||
s6a_message_t *s6a_message = NULL;
|
||||
s6a_ula_message_t *ula_message = NULL;
|
||||
s6a_subscription_data_t *subscription_data = NULL;
|
||||
c_uint16_t s6abuf_len = 0;
|
||||
|
||||
CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &ts), return );
|
||||
|
||||
|
@ -470,15 +495,29 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
mme_ue = mi->mme_ue;
|
||||
d_assert(mme_ue, return, );
|
||||
|
||||
d_trace(3, "[S6A] Update-Location-Answer : UE[%s] <-- HSS\n",
|
||||
mme_ue->imsi_bcd);
|
||||
s6abuf_len = sizeof(s6a_message_t);
|
||||
d_assert(s6abuf_len < 8192, return, "Not supported size:%d", s6abuf_len);
|
||||
s6abuf = pkbuf_alloc(0, s6abuf_len);
|
||||
d_assert(s6abuf, return, "Null param");
|
||||
s6a_message = s6abuf->payload;
|
||||
d_assert(s6a_message, return, "Null param");
|
||||
|
||||
d_trace(3, "[S6A] Update-Location-Answer : UE <-- HSS\n");
|
||||
|
||||
/* Set Authentication-Information Command */
|
||||
memset(s6a_message, 0, s6abuf_len);
|
||||
s6a_message->cmd_code = S6A_CMD_CODE_UPDATE_LOCATION;
|
||||
ula_message = &s6a_message->ula_message;
|
||||
d_assert(ula_message, return, "Null param");
|
||||
subscription_data = &ula_message->subscription_data;
|
||||
d_assert(subscription_data, return, "Null param");
|
||||
|
||||
/* Value of Result Code */
|
||||
CHECK_FCT_DO( fd_msg_search_avp(*msg, fd_result_code, &avp), return );
|
||||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp, &hdr), return);
|
||||
result_code = hdr->avp_value->i32;
|
||||
s6a_message->result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Result Code: %d\n", hdr->avp_value->i32);
|
||||
}
|
||||
else
|
||||
|
@ -492,8 +531,9 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
if (avpch)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avpch, &hdr), return);
|
||||
result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Experimental Result Code: %d\n", result_code);
|
||||
s6a_message->result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Experimental Result Code: %d\n",
|
||||
s6a_message->result_code);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -535,7 +575,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp, &hdr), return );
|
||||
mme_ue->ula_flags = hdr->avp_value->i32;
|
||||
ula_message->ula_flags = hdr->avp_value->i32;
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
@ -553,7 +593,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
if (avpch2)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avpch2, &hdr), return );
|
||||
mme_ue->ambr.uplink = hdr->avp_value->u32;
|
||||
subscription_data->ambr.uplink = hdr->avp_value->u32;
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
@ -563,7 +603,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
if (avpch2)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avpch2, &hdr), return );
|
||||
mme_ue->ambr.downlink = hdr->avp_value->u32;
|
||||
subscription_data->ambr.downlink = hdr->avp_value->u32;
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
@ -588,27 +628,22 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
break;
|
||||
case S6A_AVP_CODE_APN_CONFIGURATION:
|
||||
{
|
||||
c_int8_t apn[MAX_APN_LEN];
|
||||
pdn_t *pdn = &subscription_data->pdn[
|
||||
subscription_data->num_of_pdn];
|
||||
d_assert(pdn, return, );
|
||||
CHECK_FCT_DO( fd_avp_search_avp(
|
||||
avpch2, s6a_service_selection, &avpch3), return );
|
||||
if (avpch3)
|
||||
{
|
||||
CHECK_FCT_DO(
|
||||
fd_msg_avp_hdr(avpch3, &hdr), return );
|
||||
core_cpystrn(apn, (char*)hdr->avp_value->os.data,
|
||||
core_cpystrn(pdn->apn,
|
||||
(char*)hdr->avp_value->os.data,
|
||||
c_min(hdr->avp_value->os.len, MAX_APN_LEN)+1);
|
||||
|
||||
pdn = mme_pdn_find_by_apn(mme_ue, apn);
|
||||
if (!pdn)
|
||||
pdn = mme_pdn_add(mme_ue, apn);
|
||||
else
|
||||
d_warn("Duplicate APN:[%s]", apn);
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
||||
d_assert(pdn, return, );
|
||||
|
||||
CHECK_FCT_DO( fd_avp_search_avp(avpch2,
|
||||
s6a_context_identifier, &avpch3), return );
|
||||
if (avpch3)
|
||||
|
@ -723,6 +758,8 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
else
|
||||
error++;
|
||||
}
|
||||
|
||||
subscription_data->num_of_pdn++;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -746,15 +783,14 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp, &hdr), return );
|
||||
mme_ue->subscribed_rau_tau_timer = hdr->avp_value->i32;
|
||||
subscription_data->subscribed_rau_tau_timer = hdr->avp_value->i32;
|
||||
}
|
||||
else
|
||||
error++;
|
||||
|
||||
event_set(&e, MME_EVT_EMM_UE_FROM_S6A);
|
||||
event_set(&e, MME_EVT_S6A_MESSAGE);
|
||||
event_set_param1(&e, (c_uintptr_t)mme_ue->index);
|
||||
event_set_param2(&e, (c_uintptr_t)S6A_CMD_UPDATE_LOCATION);
|
||||
event_set_param3(&e, (c_uintptr_t)result_code);
|
||||
event_set_param2(&e, (c_uintptr_t)s6abuf);
|
||||
mme_event_send(&e);
|
||||
|
||||
/* Free the message */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef __MME_HANDLER_H__
|
||||
#define __MME_HANDLER_H__
|
||||
#ifndef __MME_S11_HANDLER_H__
|
||||
#define __MME_S11_HANDLER_H__
|
||||
|
||||
#include "gtp_tlv.h"
|
||||
|
||||
|
@ -26,4 +26,4 @@ CORE_DECLARE(void) mme_s11_handle_downlink_data_notification(
|
|||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __MME_HANDLER_H__ */
|
||||
#endif /* __MME_S11_HANDLER_H__ */
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
#define TRACE_MODULE _mme_s6a_handler
|
||||
|
||||
#include "core_debug.h"
|
||||
|
||||
#include "mme_s6a_handler.h"
|
||||
#include "s6a_message.h"
|
||||
|
||||
void mme_s6a_handle_aia(mme_ue_t *mme_ue, s6a_aia_message_t *aia_message)
|
||||
{
|
||||
e_utran_vector_t *e_utran_vector = NULL;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
d_assert(aia_message, return, "Null param");
|
||||
e_utran_vector = &aia_message->e_utran_vector;
|
||||
d_assert(e_utran_vector, return, "Null param");
|
||||
|
||||
mme_ue->xres_len = e_utran_vector->xres_len;
|
||||
memcpy(mme_ue->xres, e_utran_vector->xres, mme_ue->xres_len);
|
||||
memcpy(mme_ue->autn, e_utran_vector->autn, AUTN_LEN);
|
||||
memcpy(mme_ue->rand, e_utran_vector->rand, RAND_LEN);
|
||||
memcpy(mme_ue->kasme, e_utran_vector->kasme, SHA256_DIGEST_SIZE);
|
||||
}
|
||||
|
||||
void mme_s6a_handle_ula(mme_ue_t *mme_ue, s6a_ula_message_t *ula_message)
|
||||
{
|
||||
s6a_subscription_data_t *subscription_data = NULL;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
d_assert(ula_message, return, "Null param");
|
||||
subscription_data = &ula_message->subscription_data;
|
||||
d_assert(subscription_data, return, "Null param");
|
||||
|
||||
memcpy(&mme_ue->subscription_data,
|
||||
subscription_data, sizeof(s6a_subscription_data_t));
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
#ifndef __MME_S6A_HANDLER_H__
|
||||
#define __MME_S6A_HANDLER_H__
|
||||
|
||||
#include "s6a_message.h"
|
||||
#include "mme_context.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
CORE_DECLARE(void) mme_s6a_handle_aia(
|
||||
mme_ue_t *mme_ue, s6a_aia_message_t *aia_message);
|
||||
CORE_DECLARE(void) mme_s6a_handle_ula(
|
||||
mme_ue_t *mme_ue, s6a_ula_message_t *ula_message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __MME_S6A_HANDLER_H__ */
|
|
@ -14,6 +14,9 @@
|
|||
#include "mme_s11_path.h"
|
||||
#include "mme_s11_handler.h"
|
||||
#include "emm_handler.h"
|
||||
#include "esm_handler.h"
|
||||
#include "fd_lib.h"
|
||||
#include "mme_s6a_handler.h"
|
||||
|
||||
void mme_state_initial(fsm_t *s, event_t *e)
|
||||
{
|
||||
|
@ -215,7 +218,6 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
|
||||
break;
|
||||
}
|
||||
case MME_EVT_EMM_UE_FROM_S6A:
|
||||
case MME_EVT_EMM_UE_T3413:
|
||||
{
|
||||
index_t index = event_get_param1(e);
|
||||
|
@ -379,6 +381,80 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
gtp_xact_timeout(event_get_param1(e));
|
||||
break;
|
||||
}
|
||||
case MME_EVT_S6A_MESSAGE:
|
||||
{
|
||||
index_t index = event_get_param1(e);
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
pkbuf_t *s6abuf = (pkbuf_t *)event_get_param2(e);
|
||||
s6a_message_t *s6a_message = NULL;
|
||||
|
||||
d_assert(index, return, "Null param");
|
||||
mme_ue = mme_ue_find(index);
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
|
||||
d_assert(s6abuf, return, "Null param");
|
||||
s6a_message = s6abuf->payload;
|
||||
d_assert(s6a_message, return, "Null param");
|
||||
|
||||
switch(s6a_message->cmd_code)
|
||||
{
|
||||
case S6A_CMD_CODE_AUTHENTICATION_INFORMATION:
|
||||
{
|
||||
if (s6a_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
emm_handle_attach_reject(mme_ue);
|
||||
break;
|
||||
}
|
||||
|
||||
mme_s6a_handle_aia(mme_ue, &s6a_message->aia_message);
|
||||
emm_handle_authentication_request(mme_ue);
|
||||
break;
|
||||
}
|
||||
case S6A_CMD_CODE_UPDATE_LOCATION:
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
if (s6a_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
d_error("Not impleneted");
|
||||
break;
|
||||
}
|
||||
|
||||
mme_s6a_handle_ula(mme_ue, &s6a_message->ula_message);
|
||||
|
||||
sess = mme_sess_find_by_last_esm_message(mme_ue);
|
||||
d_assert(sess, break, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, break, "Null param");
|
||||
|
||||
if (MME_SESSION_HAVE_APN(sess))
|
||||
{
|
||||
if (MME_SESSION_IS_VALID(sess))
|
||||
{
|
||||
emm_handle_attach_accept(sess);
|
||||
}
|
||||
else
|
||||
{
|
||||
mme_s11_handle_create_session_request(sess);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
esm_handle_information_request(sess);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
d_error("Invalid type(%d)", event_get_param2(e));
|
||||
break;
|
||||
}
|
||||
}
|
||||
pkbuf_free(s6abuf);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
d_error("No handler for event %s", mme_event_get_name(e));
|
||||
|
|
|
@ -2,13 +2,14 @@
|
|||
|
||||
#include "core_debug.h"
|
||||
|
||||
#include "s6a_message.h"
|
||||
|
||||
#include "mme_context.h"
|
||||
|
||||
#include "mme_kdf.h"
|
||||
#include "s1ap_build.h"
|
||||
#include "s1ap_conv.h"
|
||||
|
||||
|
||||
status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
|
||||
{
|
||||
int erval;
|
||||
|
@ -163,6 +164,7 @@ status_t s1ap_build_initial_context_setup_request(
|
|||
mme_ue_t *mme_ue = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
s6a_subscription_data_t *subscription_data = NULL;
|
||||
pdn_t *pdn = NULL;
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
|
@ -172,6 +174,8 @@ status_t s1ap_build_initial_context_setup_request(
|
|||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return CORE_ERROR, "Null param");
|
||||
subscription_data = &mme_ue->subscription_data;
|
||||
d_assert(subscription_data, return CORE_ERROR, "Null param");
|
||||
pdn = sess->pdn;
|
||||
d_assert(pdn, return CORE_ERROR, "Null param");
|
||||
|
||||
|
@ -182,10 +186,10 @@ status_t s1ap_build_initial_context_setup_request(
|
|||
|
||||
asn_uint642INTEGER(
|
||||
&ies->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL,
|
||||
mme_ue->ambr.uplink);
|
||||
subscription_data->ambr.uplink);
|
||||
asn_uint642INTEGER(
|
||||
&ies->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL,
|
||||
mme_ue->ambr.downlink);
|
||||
subscription_data->ambr.downlink);
|
||||
|
||||
e_rab = (S1ap_E_RABToBeSetupItemCtxtSUReq_t *)
|
||||
core_calloc(1, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t));
|
||||
|
|
|
@ -35,8 +35,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
union avp_value val;
|
||||
|
||||
status_t rv;
|
||||
gx_message_t gx_message;
|
||||
gx_cca_message_t *cca_message = NULL;
|
||||
gx_cca_message_t cca_message;
|
||||
c_int8_t imsi_bcd[MAX_IMSI_BCD_LEN+1];
|
||||
c_int8_t apn[MAX_APN_LEN+1];
|
||||
int i, j;
|
||||
|
@ -47,9 +46,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
d_assert(msg, return EINVAL,);
|
||||
|
||||
/* Initialize Message */
|
||||
memset(&gx_message, 0, sizeof(gx_message_t));
|
||||
gx_message.cmd_code = GX_CMD_CODE_CREDIT_CONTROL;
|
||||
cca_message = &gx_message.cca_message;
|
||||
memset(&cca_message, 0, sizeof(gx_cca_message_t));
|
||||
|
||||
/* Create answer header */
|
||||
qry = *msg;
|
||||
|
@ -99,7 +96,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
core_cpystrn(apn, (char*)hdr->avp_value->os.data,
|
||||
c_min(hdr->avp_value->os.len, MAX_IMSI_BCD_LEN)+1);
|
||||
|
||||
rv = pcrf_db_pdn_data(imsi_bcd, apn, cca_message);
|
||||
rv = pcrf_db_pdn_data(imsi_bcd, apn, &cca_message);
|
||||
if (rv != CORE_OK)
|
||||
{
|
||||
d_error("Cannot get data for IMSI(%s)+APN(%s)'\n", imsi_bcd, apn);
|
||||
|
@ -110,9 +107,9 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
/* Set Charging-Rule-Install */
|
||||
CHECK_FCT( fd_msg_avp_new(gx_charging_rule_install, 0, &avp) );
|
||||
|
||||
for (i = 0; i < cca_message->num_of_pcc_rule; i++)
|
||||
for (i = 0; i < cca_message.num_of_pcc_rule; i++)
|
||||
{
|
||||
pcc_rule_t *pcc_rule = &cca_message->pcc_rule[i];
|
||||
pcc_rule_t *pcc_rule = &cca_message.pcc_rule[i];
|
||||
|
||||
CHECK_FCT( fd_msg_avp_new(gx_charging_rule_definition, 0, &avpch1) );
|
||||
|
||||
|
@ -222,24 +219,24 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
CHECK_FCT( fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp) );
|
||||
|
||||
/* Set QoS-Information */
|
||||
if (cca_message->pdn.ambr.downlink || cca_message->pdn.ambr.uplink)
|
||||
if (cca_message.pdn.ambr.downlink || cca_message.pdn.ambr.uplink)
|
||||
{
|
||||
CHECK_FCT( fd_msg_avp_new(gx_qos_information, 0, &avp) );
|
||||
|
||||
if (cca_message->pdn.ambr.uplink)
|
||||
if (cca_message.pdn.ambr.uplink)
|
||||
{
|
||||
CHECK_FCT( fd_msg_avp_new(gx_apn_aggregate_max_bitrate_ul, 0,
|
||||
&avpch1) );
|
||||
val.u32 = cca_message->pdn.ambr.uplink;
|
||||
val.u32 = cca_message.pdn.ambr.uplink;
|
||||
CHECK_FCT( fd_msg_avp_setvalue (avpch1, &val) );
|
||||
CHECK_FCT( fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1) );
|
||||
}
|
||||
|
||||
if (cca_message->pdn.ambr.downlink)
|
||||
if (cca_message.pdn.ambr.downlink)
|
||||
{
|
||||
CHECK_FCT( fd_msg_avp_new(gx_apn_aggregate_max_bitrate_dl, 0,
|
||||
&avpch1) );
|
||||
val.u32 = cca_message->pdn.ambr.downlink;
|
||||
val.u32 = cca_message.pdn.ambr.downlink;
|
||||
CHECK_FCT( fd_msg_avp_setvalue (avpch1, &val) );
|
||||
CHECK_FCT( fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1) );
|
||||
}
|
||||
|
@ -251,24 +248,24 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
CHECK_FCT( fd_msg_avp_new(gx_default_eps_bearer_qos, 0, &avp) );
|
||||
|
||||
CHECK_FCT( fd_msg_avp_new(gx_qos_class_identifier, 0, &avpch1) );
|
||||
val.u32 = cca_message->pdn.qos.qci;
|
||||
val.u32 = cca_message.pdn.qos.qci;
|
||||
CHECK_FCT( fd_msg_avp_setvalue (avpch1, &val) );
|
||||
CHECK_FCT( fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1) );
|
||||
|
||||
CHECK_FCT( fd_msg_avp_new(gx_allocation_retention_priority, 0, &avpch1) );
|
||||
|
||||
CHECK_FCT( fd_msg_avp_new(gx_priority_level, 0, &avpch2) );
|
||||
val.u32 = cca_message->pdn.qos.arp.priority_level;
|
||||
val.u32 = cca_message.pdn.qos.arp.priority_level;
|
||||
CHECK_FCT( fd_msg_avp_setvalue (avpch2, &val) );
|
||||
CHECK_FCT( fd_msg_avp_add (avpch1, MSG_BRW_LAST_CHILD, avpch2) );
|
||||
|
||||
CHECK_FCT( fd_msg_avp_new(gx_pre_emption_capability, 0, &avpch2) );
|
||||
val.u32 = cca_message->pdn.qos.arp.pre_emption_capability;
|
||||
val.u32 = cca_message.pdn.qos.arp.pre_emption_capability;
|
||||
CHECK_FCT( fd_msg_avp_setvalue (avpch2, &val) );
|
||||
CHECK_FCT( fd_msg_avp_add (avpch1, MSG_BRW_LAST_CHILD, avpch2) );
|
||||
|
||||
CHECK_FCT( fd_msg_avp_new(gx_pre_emption_vulnerability, 0, &avpch2) );
|
||||
val.u32 = cca_message->pdn.qos.arp.pre_emption_vulnerability;
|
||||
val.u32 = cca_message.pdn.qos.arp.pre_emption_vulnerability;
|
||||
CHECK_FCT( fd_msg_avp_setvalue (avpch2, &val) );
|
||||
CHECK_FCT( fd_msg_avp_add (avpch1, MSG_BRW_LAST_CHILD, avpch2) );
|
||||
|
||||
|
@ -287,7 +284,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
fd_logger_self()->stats.nb_echoed++;
|
||||
CHECK_POSIX_DO( pthread_mutex_unlock(&fd_logger_self()->stats_lock), );
|
||||
|
||||
gx_message_free(&gx_message);
|
||||
gx_cca_message_free(&cca_message);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -296,7 +293,7 @@ out:
|
|||
|
||||
CHECK_FCT( fd_msg_send(msg, NULL, NULL) );
|
||||
|
||||
gx_message_free(&gx_message);
|
||||
gx_cca_message_free(&cca_message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -335,8 +335,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
|
|||
gx_message = gxbuf->payload;
|
||||
d_assert(gx_message, return, "Null param");
|
||||
|
||||
d_trace(3, "[Gx] Credit-Control-Answer : PGW[%d] <-- PCRF\n",
|
||||
sess->pgw_s5c_teid);
|
||||
d_trace(3, "[Gx] Credit-Control-Answer : PGW <-- PCRF\n");
|
||||
|
||||
/* Set Credit Control Command */
|
||||
memset(gx_message, 0, gxbuf_len);
|
||||
|
@ -348,7 +347,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
|
|||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp, &hdr), return);
|
||||
cca_message->result_code = hdr->avp_value->i32;
|
||||
gx_message->result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Result Code: %d\n", hdr->avp_value->i32);
|
||||
}
|
||||
else
|
||||
|
@ -362,9 +361,9 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
|
|||
if (avpch1)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avpch1, &hdr), return);
|
||||
cca_message->result_code = hdr->avp_value->i32;
|
||||
gx_message->result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Experimental Result Code: %d\n",
|
||||
cca_message->result_code);
|
||||
gx_message->result_code);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -402,9 +401,9 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
|
|||
error++;
|
||||
}
|
||||
|
||||
if (cca_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
if (gx_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
d_warn("ERROR DIAMETER Result Code(%d)", cca_message->result_code);
|
||||
d_warn("ERROR DIAMETER Result Code(%d)", gx_message->result_code);
|
||||
error++;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -159,9 +159,9 @@ void pgw_state_operational(fsm_t *s, event_t *e)
|
|||
case GX_CMD_CODE_CREDIT_CONTROL:
|
||||
{
|
||||
gx_cca_message_t *cca_message = &gx_message->cca_message;
|
||||
if (cca_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
if (gx_message->result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
d_error("Not impleneted(%d)", cca_message->result_code);
|
||||
d_error("Not impleneted(%d)", gx_message->result_code);
|
||||
break;
|
||||
}
|
||||
switch(cca_message->cc_request_type)
|
||||
|
@ -186,6 +186,7 @@ void pgw_state_operational(fsm_t *s, event_t *e)
|
|||
break;
|
||||
}
|
||||
}
|
||||
gx_cca_message_free(cca_message);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -195,7 +196,6 @@ void pgw_state_operational(fsm_t *s, event_t *e)
|
|||
}
|
||||
}
|
||||
|
||||
gx_message_free(gx_message);
|
||||
pkbuf_free(gxbuf);
|
||||
pkbuf_free(gtpbuf);
|
||||
break;
|
||||
|
|
|
@ -17,6 +17,7 @@ AM_CPPFLAGS = \
|
|||
-I$(top_srcdir)/lib/s1ap/asn1c \
|
||||
-I$(top_srcdir)/lib/s1ap \
|
||||
-I$(top_srcdir)/lib/nas \
|
||||
-I$(top_srcdir)/lib/fd/s6a \
|
||||
-I$(top_srcdir)/lib/fd \
|
||||
-I$(top_srcdir)/lib/gtp \
|
||||
-I$(top_srcdir)/src/mme \
|
||||
|
|
Loading…
Reference in New Issue