Multiple TAI List done

This commit is contained in:
Sukchan Lee 2017-12-11 16:55:11 +09:00
parent 5551ecf6cd
commit cb4893c36b
6 changed files with 80 additions and 67 deletions

View File

@ -17,8 +17,6 @@ status_t emm_build_attach_accept(
nas_eps_attach_result_t *eps_attach_result =
&attach_accept->eps_attach_result;
nas_gprs_timer_t *t3412_value = &attach_accept->t3412_value;
tai0_list_t tai0_list;
tai2_list_t tai2_list;
int served_tai_index = 0;
nas_eps_mobile_identity_t *guti = &attach_accept->guti;
nas_gprs_timer_t *t3402_value = &attach_accept->t3402_value;
@ -43,21 +41,12 @@ status_t emm_build_attach_accept(
t3412_value->value = 9;
served_tai_index = mme_find_served_tai(&mme_ue->tai);
if (served_tai_index < 0)
{
memset(&tai0_list, 0, sizeof(tai0_list_t));
memset(&tai2_list, 0, sizeof(tai2_list_t));
tai2_list.type = TAI2_TYPE;
tai2_list.num = 1;
memcpy(&tai2_list.tai[0], &mme_ue->tai, sizeof(tai_t));
nas_tai_list_build(&attach_accept->tai_list, &tai0_list, &tai2_list);
}
else
{
nas_tai_list_build(&attach_accept->tai_list,
&mme_self()->served_tai[served_tai_index].list0,
&mme_self()->served_tai[served_tai_index].list2);
}
d_assert(served_tai_index >= 0 &&
served_tai_index < MAX_NUM_OF_SERVED_TAI, return CORE_ERROR,
"Cannot find Served TAI. Check 'mme.tai' configuration");
nas_tai_list_build(&attach_accept->tai_list,
&mme_self()->served_tai[served_tai_index].list0,
&mme_self()->served_tai[served_tai_index].list2);
attach_accept->esm_message_container.buffer = esmbuf->payload;
attach_accept->esm_message_container.length = esmbuf->len;
@ -295,8 +284,7 @@ status_t emm_build_tau_accept(pkbuf_t **emmbuf, mme_ue_t *mme_ue)
nas_message_t message;
nas_tracking_area_update_accept_t *tau_accept =
&message.emm.tracking_area_update_accept;
tai0_list_t tai0_list;
tai2_list_t tai2_list;
int served_tai_index = 0;
memset(&message, 0, sizeof(message));
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
@ -316,12 +304,13 @@ status_t emm_build_tau_accept(pkbuf_t **emmbuf, mme_ue_t *mme_ue)
tau_accept->presencemask |=
NAS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_PRESENT;
memset(&tai0_list, 0, sizeof(tai0_list_t));
memset(&tai2_list, 0, sizeof(tai2_list_t));
tai2_list.type = TAI2_TYPE;
tai2_list.num = 1;
memcpy(&tai2_list.tai[0], &mme_ue->tai, sizeof(tai_t));
nas_tai_list_build(&tau_accept->tai_list, &tai0_list, &tai2_list);
served_tai_index = mme_find_served_tai(&mme_ue->tai);
d_assert(served_tai_index >= 0 &&
served_tai_index < MAX_NUM_OF_SERVED_TAI, return CORE_ERROR,
"Cannot find Served TAI. Check 'mme.tai' configuration");
nas_tai_list_build(&tau_accept->tai_list,
&mme_self()->served_tai[served_tai_index].list0,
&mme_self()->served_tai[served_tai_index].list2);
/* Set EPS bearer context status */
tau_accept->presencemask |=

View File

@ -129,8 +129,8 @@ typedef struct _mme_enb_t {
sock_id sock; /* eNB S1AP Socket */
c_sockaddr_t *addr; /* eNB S1AP Address */
c_uint8_t num_of_tai;
tai_t tai[MAX_NUM_OF_TAI * MAX_NUM_OF_BPLMN];
c_uint8_t num_of_supported_ta_list;
tai_t supported_ta_list[MAX_NUM_OF_TAI * MAX_NUM_OF_BPLMN];
list_t enb_ue_list;

View File

@ -23,8 +23,7 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, s1ap_message_t *message)
S1ap_S1SetupRequestIEs_t *ies = NULL;
pkbuf_t *s1apbuf = NULL;
c_uint32_t enb_id;
int i,j;
int num_of_tai = 0;
int i, j;
d_assert(enb, return, "Null param");
d_assert(enb->sock, return, "Null param");
@ -36,6 +35,7 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, s1ap_message_t *message)
s1ap_ENB_ID_to_uint32(&ies->global_ENB_ID.eNB_ID, &enb_id);
/* Parse Supported TA */
enb->num_of_supported_ta_list = 0;
for (i = 0; i < ies->supportedTAs.list.count; i++)
{
S1ap_SupportedTAs_Item_t *tai = NULL;
@ -50,18 +50,20 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, s1ap_message_t *message)
pLMNidentity =
(S1ap_PLMNidentity_t *)tai->broadcastPLMNs.list.array[j];
memcpy(&enb->tai[num_of_tai].tac, tAC->buf, sizeof(c_uint16_t));
enb->tai[num_of_tai].tac = ntohs(enb->tai[num_of_tai].tac);
memcpy(&enb->supported_ta_list[enb->num_of_supported_ta_list].tac,
tAC->buf, sizeof(c_uint16_t));
enb->supported_ta_list[enb->num_of_supported_ta_list].tac =
ntohs(enb->supported_ta_list
[enb->num_of_supported_ta_list].tac);
memcpy(&enb->tai[num_of_tai].plmn_id, pLMNidentity->buf,
sizeof(plmn_id_t));
num_of_tai++;
memcpy(&enb->supported_ta_list
[enb->num_of_supported_ta_list].plmn_id,
pLMNidentity->buf, sizeof(plmn_id_t));
enb->num_of_supported_ta_list++;
}
}
enb->num_of_tai = num_of_tai;
if (enb->num_of_tai == 0)
if (enb->num_of_supported_ta_list == 0)
{
d_error("No supported TA exist in s1stup_req messages");
}
@ -99,20 +101,6 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
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,);
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
if (!enb_ue)
{
@ -154,10 +142,24 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
}
}
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,);
memcpy(&enb_ue->nas.tai.plmn_id, pLMNidentity->buf,
sizeof(enb_ue->nas.tai.plmn_id));
memcpy(&enb_ue->nas.tai.tac, tAC->buf, sizeof(enb_ue->nas.tai.tac));
enb_ue->nas.tai.tac = ntohs(enb_ue->nas.tai.tac);
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,);
memcpy(&enb_ue->nas.e_cgi.plmn_id, pLMNidentity->buf,
sizeof(enb_ue->nas.e_cgi.plmn_id));
memcpy(&enb_ue->nas.e_cgi.cell_id, cell_ID->buf,
@ -520,9 +522,10 @@ void s1ap_handle_paging(mme_ue_t *mme_ue)
for (hi = mme_enb_first(); hi; hi = mme_enb_next(hi))
{
enb = mme_enb_this(hi);
for (i = 0; i < enb->num_of_tai; i++)
for (i = 0; i < enb->num_of_supported_ta_list; i++)
{
if (!memcmp(&enb->tai[i], &mme_ue->tai, sizeof(tai_t)))
if (!memcmp(&enb->supported_ta_list[i],
&mme_ue->tai, sizeof(tai_t)))
{
if (mme_ue->last_paging_msg)
s1apbuf = mme_ue->last_paging_msg;

View File

@ -141,11 +141,29 @@ mme:
# - plmn_id:
# mcc: 001
# mnc: 01
# tac: 12345
# tac: [1, 2, 3]
# tai:
# - plmn_id:
# mcc: 002
# mnc: 02
# tac: 12346
# tac: 4
# - plmn_id:
# mcc: 003
# mnc: 03
# tac: 5
# tai:
# - plmn_id:
# mcc: 004
# mnc: 04
# tac: [6, 7]
# - plmn_id:
# mcc: 005
# mnc: 05
# tac: 8
# - plmn_id:
# mcc: 006
# mnc: 06
# tac: [9, 10]
#
tai:
plmn_id:

View File

@ -164,6 +164,7 @@ static void attach_test1(abts_case *tc, void *data)
context_self()->db_name, "subscribers");
ABTS_PTR_NOTNULL(tc, collection);
/********** Insert Subscriber in Database */
doc = bson_new_from_json((const uint8_t *)json, -1, &error);;
ABTS_PTR_NOTNULL(tc, doc);
ABTS_TRUE(tc, mongoc_collection_insert(collection,
@ -528,6 +529,7 @@ static void attach_test2(abts_case *tc, void *data)
context_self()->db_name, "subscribers");
ABTS_PTR_NOTNULL(tc, collection);
/********** Insert Subscriber in Database */
ABTS_TRUE(tc, mongoc_collection_insert(collection,
MONGOC_INSERT_NONE, doc, NULL, &error));
bson_destroy(doc);
@ -808,6 +810,7 @@ static void attach_test3(abts_case *tc, void *data)
context_self()->db_name, "subscribers");
ABTS_PTR_NOTNULL(tc, collection);
/********** Insert Subscriber in Database */
ABTS_TRUE(tc, mongoc_collection_insert(collection,
MONGOC_INSERT_NONE, doc, NULL, &error));
bson_destroy(doc);

View File

@ -265,6 +265,7 @@ status_t tests1ap_build_setup_req(
pkbuf_t **pkbuf, S1ap_ENB_ID_PR present, c_uint32_t enb_id)
{
int erval = -1;
int tac = 12345;
s1ap_message_t message;
S1ap_S1SetupRequestIEs_t *ies;
@ -281,12 +282,11 @@ status_t tests1ap_build_setup_req(
supportedTA = (S1ap_SupportedTAs_Item_t *)
core_calloc(1, sizeof(S1ap_SupportedTAs_Item_t));
#if 0 /* FIXTAI */
s1ap_uint16_to_OCTET_STRING(
mme_self()->served_tai[0].tac, &supportedTA->tAC);
#else
s1ap_uint16_to_OCTET_STRING(12345, &supportedTA->tAC);
#endif
if (mme_self()->served_tai[0].list2.tai[0].tac)
tac = mme_self()->served_tai[0].list2.tai[0].tac;
else
tac = mme_self()->served_tai[0].list0.tai[0].tac[0];
s1ap_uint16_to_OCTET_STRING(tac, &supportedTA->tAC);
plmnIdentity = (S1ap_PLMNidentity_t *)
core_calloc(1, sizeof(S1ap_PLMNidentity_t));
s1ap_buffer_to_OCTET_STRING(&mme_self()->served_gummei[0].plmn_id[0],
@ -319,14 +319,14 @@ status_t tests1ap_build_initial_ue_msg(pkbuf_t **pkbuf, int i)
char *payload[TESTS1AP_MAX_MESSAGE] = {
"000c405800000500 0800020001001a00 302f177ca0b38802 0741020809101010"
"3254869104e060c0 4000050221d011d1 5c0a003103e5e034 9011035758a65d01"
"00004300060000f1 105ba00064400800 00f1101079baf000 86400130",
"00004300060000f1 1030390064400800 00f1101079baf000 86400130",
"000c40809c00"
"0005000800030002 00001a0073721711 a73a12070741020b f600f11000020100"
"00000105e060c040 0100210221d011d1 271a808021100100 0010810600000000"
"830600000000000d 00000a005255f501 10225c0a003103e5 c03e1355f501aaaa"
"11035758a6200b60 1404ef65233b8878 d290400804026004 00021f025d0107e0"
"004300060055f501 1022006440080055 f5010019d0100086 400130",
"004300060000f110 3039006440080055 f5010019d0100086 400130",
"000c40809c00"
"0005000800030001 00001a007372178c 3e3cff070741020b f600f11000020100"
@ -343,16 +343,16 @@ status_t tests1ap_build_initial_ue_msg(pkbuf_t **pkbuf, int i)
"000c405300000500 080003001100001a 002a2917acba67c4 8207410108091010"
"103254866205f0f0 000000000e023cd0 11d1270780000a00 000d00c100430006"
"0000f1102b670064 40080000f1109d67 aa500086400130",
"0000f11030390064 40080000f1109d67 aa500086400130",
"000c405300000500 080003002100001a 002a2917bcba67c4 8207410108091010"
"103254866205f0f0 000000000e023cd0 11d1270780000a00 000d00c100430006"
"0000f1102b670064 40080000f1109d67 aa500086400130",
"0000f11030390064 40080000f1109d67 aa500086400130",
"000c"
"404c000005000800 020002001a002423 0741710809101010 3254767905f0f000"
"0000000e0201d011 d1270780000a0000 0d00c10043000600 00f1102b67006440"
"0000000e0201d011 d1270780000a0000 0d00c10043000600 00f1103039006440"
"080000f11054f640 100086400130",
"",
"",
@ -361,7 +361,7 @@ status_t tests1ap_build_initial_ue_msg(pkbuf_t **pkbuf, int i)
"000c"
"4068000005000800 020001001a00403f 0741720809101010 3254861002e06000"
"210207d011d1271a 8080211001000010 8106000000008306 00000000000d0000"
"0a005c0a00901103 4f18a6f15d010000 4300060000f1105b a0006440080000f1"
"0a005c0a00901103 4f18a6f15d010000 4300060000f11030 39006440080000f1"
"1004615380008640 0130",
"000c"