fix the bug not to access mme_ue context in freediameter thread

This commit is contained in:
Sukchan Lee 2017-08-26 00:11:46 +09:00
parent 0ecc05e9d3
commit 8d1a5e2d35
19 changed files with 286 additions and 209 deletions

View File

@ -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);

View File

@ -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");
}
}
}

View File

@ -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
}

View File

@ -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 \

View File

@ -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));

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -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;

View File

@ -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 */

View File

@ -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__ */

35
src/mme/mme_s6a_handler.c Normal file
View File

@ -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));
}

20
src/mme/mme_s6a_handler.h Normal file
View File

@ -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__ */

View File

@ -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));

View File

@ -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));

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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 \