update it

This commit is contained in:
Sukchan Lee 2017-04-11 20:44:38 +09:00
parent 9d5f0a510b
commit d53b30449f
8 changed files with 90 additions and 52 deletions

View File

@ -57,6 +57,16 @@ CORE_DECLARE(c_uint16_t) plmn_id_mnc_len(plmn_id_t *plmn_id);
CORE_DECLARE(void *) plmn_id_build(plmn_id_t *plmn_id,
c_uint16_t mcc, c_uint16_t mnc, c_uint16_t mnc_len);
typedef struct _tai_t {
plmn_id_t plmn_id;
c_uint16_t tac;
} __attribute__ ((packed)) tai_t;
typedef struct _e_cgi_t {
plmn_id_t plmn_id;
c_uint32_t cell_id; /* 28 bit */
} __attribute__ ((packed)) e_cgi_t;
/**********************************
* PDN Structure */
typedef c_uint32_t pdn_id_t;

View File

@ -146,13 +146,13 @@ c_int16_t gtp_parse_uli(gtp_uli_t *uli, tlv_octet_t *octet)
uli->tai.tac = ntohs(uli->tai.tac);
size += sizeof(uli->tai);
}
if (uli->flags.ecgi)
if (uli->flags.e_cgi)
{
d_assert(size + sizeof(uli->ecgi) <= octet->len,
d_assert(size + sizeof(uli->e_cgi) <= octet->len,
return -1, "decode error");
memcpy(&uli->ecgi, octet->data + size, sizeof(uli->ecgi));
uli->ecgi.eci = ntohl(uli->ecgi.eci);
size += sizeof(uli->ecgi);
memcpy(&uli->e_cgi, octet->data + size, sizeof(uli->e_cgi));
uli->e_cgi.cell_id = ntohl(uli->e_cgi.cell_id);
size += sizeof(uli->e_cgi);
}
if (uli->flags.lai)
{
@ -221,13 +221,13 @@ c_int16_t gtp_build_uli(
memcpy(octet->data + size, &target.tai, sizeof(target.tai));
size += sizeof(target.tai);
}
if (target.flags.ecgi)
if (target.flags.e_cgi)
{
d_assert(size + sizeof(target.ecgi) <= data_len,
d_assert(size + sizeof(target.e_cgi) <= data_len,
return -1, "encode error");
target.ecgi.eci = htonl(target.ecgi.eci);
memcpy(octet->data + size, &target.ecgi, sizeof(target.ecgi));
size += sizeof(target.ecgi);
target.e_cgi.cell_id = htonl(target.e_cgi.cell_id);
memcpy(octet->data + size, &target.e_cgi, sizeof(target.e_cgi));
size += sizeof(target.e_cgi);
}
if (target.flags.lai)
{

View File

@ -166,16 +166,6 @@ typedef struct _gtp_uli_rai_t {
c_uint16_t rac;
} __attribute__ ((packed)) gtp_uli_rai_t;
typedef struct _gtp_uli_tai_t {
plmn_id_t plmn_id;
c_uint16_t tac;
} __attribute__ ((packed)) gtp_uli_tai_t;
typedef struct _gtp_uli_ecgi_t {
plmn_id_t plmn_id;
c_uint32_t eci; /* 28 bit */
} __attribute__ ((packed)) gtp_uli_ecgi_t;
typedef struct _gtp_uli_lai_t {
plmn_id_t plmn_id;
c_uint16_t lac;
@ -185,7 +175,7 @@ typedef struct _gtp_uli_t {
struct {
ED7(c_uint8_t spare:2;,
c_uint8_t lai:1;,
c_uint8_t ecgi:1;,
c_uint8_t e_cgi:1;,
c_uint8_t tai:1;,
c_uint8_t rai:1;,
c_uint8_t sai:1;,
@ -194,8 +184,8 @@ typedef struct _gtp_uli_t {
gtp_uli_cgi_t cgi;
gtp_uli_sai_t sai;
gtp_uli_rai_t rai;
gtp_uli_tai_t tai;
gtp_uli_ecgi_t ecgi;
tai_t tai;
e_cgi_t e_cgi;
gtp_uli_lai_t lai;
} gtp_uli_t;

View File

@ -25,8 +25,13 @@ void esm_handle_pdn_connectivity_request(mme_esm_t *esm,
void esm_handle_information_response(mme_esm_t *esm,
nas_esm_information_response_t *esm_information_response)
{
pkbuf_t *pkbuf;
pkbuf_t *pkbuf = NULL;
status_t rv;
mme_s11_build_create_session_req(&pkbuf, esm);
mme_s11_send_to_sgw(esm->sgw, GTP_CREATE_SESSION_REQUEST_TYPE, 0, pkbuf);
rv = mme_s11_build_create_session_req(&pkbuf, esm);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = mme_s11_send_to_sgw(esm->sgw,
GTP_CREATE_SESSION_REQUEST_TYPE, 0, pkbuf);
d_assert(rv == CORE_OK, return, "S11 send error");
}

View File

@ -112,6 +112,8 @@ typedef struct _mme_ue_t {
int imei_len;
/* UE Info */
tai_t tai;
e_cgi_t e_cgi;
plmn_id_t visited_plmn_id;
/* Security Context */

View File

@ -11,12 +11,13 @@
status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm)
{
status_t rv;
mme_ue_t *ue = NULL;
mme_sgw_t *sgw = NULL;
gtp_message_t gtp_message;
gtp_create_session_request_t *req = &gtp_message.create_session_request;
gtp_uli_t uli;
char uli_buf[GTP_MAX_ULI_LEN];
plmn_id_t serving_network;
gtp_f_teid_t s11, s5;
gtp_paa_t paa;
gtp_ambr_t ambr;
@ -26,34 +27,43 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm)
char bearer_qos_buf[GTP_BEARER_QOS_LEN];
gtp_ue_timezone_t ue_timezone;
d_assert(esm, return CORE_ERROR, "Null param");
ue = esm->ue;
d_assert(ue, return CORE_ERROR, "Null param");
sgw = esm->sgw;
d_assert(sgw, return CORE_ERROR, "Null param");
memset(&gtp_message, 0, sizeof(gtp_message_t));
d_assert(ue->imsi_len, return CORE_ERROR, "Null param");
req->imsi.presence = 1;
req->imsi.data = (c_uint8_t *)"\x55\x15\x30\x11\x34\x00\x10\xf4";
req->imsi.len = 8;
req->imsi.data = ue->imsi;
req->imsi.len = ue->imsi_len;
/* Not used */
req->msisdn.presence = 1;
req->msisdn.data = (c_uint8_t *)"\x94\x71\x52\x76\x00\x41";
req->msisdn.len = 6;
req->msisdn.data = ue->imsi;
req->msisdn.len = ue->imsi_len;
/* Not used */
req->me_identity.presence = 1;
req->me_identity.data = (c_uint8_t *)"\x53\x61\x20\x00\x91\x78\x84\x00";
req->me_identity.len = 8;
req->me_identity.data = ue->imsi;
req->me_identity.len = ue->imsi_len;
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.ecgi = 1;
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
plmn_id_build(&uli.tai.plmn_id, 555, 10, 2);
uli.tai.tac = 4130;
plmn_id_build(&uli.ecgi.plmn_id, 555, 10, 2);
uli.ecgi.eci = 105729;
memcpy(&uli.tai.plmn_id, &ue->tai.plmn_id, sizeof(uli.tai.plmn_id));
uli.tai.tac = ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &ue->e_cgi.plmn_id, sizeof(uli.tai.plmn_id));
uli.e_cgi.cell_id = ue->e_cgi.cell_id;
req->user_location_information.presence = 1;
gtp_build_uli(&req->user_location_information, &uli,
uli_buf, GTP_MAX_ULI_LEN);
req->serving_network.presence = 1;
req->serving_network.data = plmn_id_build(&serving_network, 555, 10, 2);
req->serving_network.len = sizeof(serving_network);
req->serving_network.data = &ue->visited_plmn_id;
req->serving_network.len = sizeof(ue->visited_plmn_id);
req->rat_type.presence = 1;
req->rat_type.u8 = GTP_RAT_TYPE_EUTRAN;
@ -61,12 +71,8 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm)
memset(&s11, 0, sizeof(gtp_f_teid_t));
s11.ipv4 = 1;
s11.interface_type = GTP_F_TEID_S11_MME_GTP_C;
#if 0
s11.teid = htonl(0x80000084);
#else
s11.teid = htonl(1);
#endif
s11.ipv4_addr = inet_addr("10.50.54.10");
s11.teid = htonl(esm->teid);
s11.ipv4_addr = mme_self()->s11_addr;
req->sender_f_teid_for_control_plane.presence = 1;
req->sender_f_teid_for_control_plane.data = &s11;
req->sender_f_teid_for_control_plane.len = GTP_F_TEID_IPV4_LEN;
@ -74,7 +80,6 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm)
memset(&s5, 0, sizeof(gtp_f_teid_t));
s5.ipv4 = 1;
s5.interface_type = GTP_F_TEID_S5_S8_PGW_GTP_C;
s5.ipv4_addr = inet_addr("10.50.54.37");
req->pgw_s5_s8_address_for_control_plane_or_pmip.presence = 1;
req->pgw_s5_s8_address_for_control_plane_or_pmip.data = &s5;
req->pgw_s5_s8_address_for_control_plane_or_pmip.len = GTP_F_TEID_IPV4_LEN;

View File

@ -62,12 +62,31 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
mme_ue_t *ue = NULL;
S1ap_InitialUEMessage_IEs_t *ies = NULL;
S1ap_TAI_t *tai = NULL;
S1ap_PLMNidentity_t *pLMNidentity = NULL;
S1ap_TAC_t *tAC = NULL;
S1ap_EUTRAN_CGI_t *eutran_cgi = NULL;
S1ap_CellIdentity_t *cell_ID = NULL;
d_assert(enb, return, "Null param");
ies = &message->s1ap_InitialUEMessage_IEs;
d_assert(ies, return, "Null param");
tai = &ies->tai;
d_assert(tai, return,);
pLMNidentity = &tai->pLMNidentity;
d_assert(pLMNidentity && pLMNidentity->size == sizeof(plmn_id_t), return,);
tAC = &tai->tAC;
d_assert(tAC && tAC->size == sizeof(c_uint16_t), return,);
eutran_cgi = &ies->eutran_cgi;
d_assert(eutran_cgi, return,);
pLMNidentity = &eutran_cgi->pLMNidentity;
d_assert(pLMNidentity && pLMNidentity->size == sizeof(plmn_id_t), return,);
cell_ID = &eutran_cgi->cell_ID;
d_assert(cell_ID, return,);
ue = mme_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
if (!ue)
{
@ -83,6 +102,13 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
enb->enb_id, ue->enb_ue_s1ap_id);
}
memcpy(&ue->tai.plmn_id, pLMNidentity->buf, sizeof(ue->tai.plmn_id));
memcpy(&ue->tai.tac, tAC->buf, sizeof(ue->tai.tac));
ue->tai.tac = ntohs(ue->tai.tac);
memcpy(&ue->e_cgi.plmn_id, pLMNidentity->buf, sizeof(ue->e_cgi.plmn_id));
memcpy(&ue->e_cgi.cell_id, cell_ID->buf, sizeof(ue->e_cgi.cell_id));
ue->e_cgi.cell_id = (ntohl(ue->e_cgi.cell_id) >> 4);
d_assert(enb->s1ap_sock, mme_ue_remove(ue); return,);
d_info("[S1AP] InitialUEMessage : UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]",
ue->enb_ue_s1ap_id,

View File

@ -57,12 +57,12 @@ static void gtp_message_test1(abts_case *tc, void *data)
req.me_identity.len = 8;
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.ecgi = 1;
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
plmn_id_build(&uli.tai.plmn_id, 555, 10, 2);
uli.tai.tac = 4130;
plmn_id_build(&uli.ecgi.plmn_id, 555, 10, 2);
uli.ecgi.eci = 105729;
plmn_id_build(&uli.e_cgi.plmn_id, 555, 10, 2);
uli.e_cgi.cell_id = 105729;
req.user_location_information.presence = 1;
size = gtp_build_uli(&req.user_location_information, &uli,
ulibuf, GTP_MAX_ULI_LEN);
@ -199,8 +199,8 @@ static void gtp_message_test1(abts_case *tc, void *data)
size = gtp_parse_uli(&uli, &req.user_location_information);
ABTS_INT_EQUAL(tc, 13, size);
ABTS_INT_EQUAL(tc, 0, uli.flags.lai);
ABTS_INT_EQUAL(tc, 1, uli.flags.ecgi);
ABTS_INT_EQUAL(tc, 105729, uli.ecgi.eci);
ABTS_INT_EQUAL(tc, 1, uli.flags.e_cgi);
ABTS_INT_EQUAL(tc, 105729, uli.e_cgi.cell_id);
ABTS_INT_EQUAL(tc, 1, uli.flags.tai);
ABTS_INT_EQUAL(tc, 4130, uli.tai.tac);
ABTS_INT_EQUAL(tc, 0, uli.flags.rai);