forked from acouzens/open5gs
[#231] TAI-LAI configuration changed
This commit is contained in:
parent
a40d1dd2af
commit
78eeb1ad45
|
@ -113,13 +113,13 @@ int emm_build_attach_accept(
|
|||
eps_network_feature_support->ims_vops = 1;
|
||||
|
||||
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
|
||||
ogs_assert(mme_ue->vlr);
|
||||
ogs_assert(mme_ue->csmap);
|
||||
ogs_assert(mme_ue->p_tmsi);
|
||||
|
||||
attach_accept->presencemask |=
|
||||
NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT;
|
||||
lai->nas_plmn_id = mme_ue->vlr->lai.nas_plmn_id;
|
||||
lai->lac = mme_ue->vlr->lai.lac;
|
||||
lai->nas_plmn_id = mme_ue->csmap->lai.nas_plmn_id;
|
||||
lai->lac = mme_ue->csmap->lai.lac;
|
||||
ogs_debug(" LAI[PLMN_ID:%06x,LAC:%d]",
|
||||
plmn_id_hexdump(&lai->nas_plmn_id), lai->lac);
|
||||
|
||||
|
|
|
@ -137,10 +137,10 @@ int esm_handle_information_response(mme_sess_t *sess,
|
|||
if (sess->pdn) {
|
||||
ogs_debug(" APN[%s]", sess->pdn->apn);
|
||||
if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
|
||||
mme_vlr_t *vlr = mme_vlr_find_by_tai(&mme_ue->tai);
|
||||
mme_ue->vlr = vlr;
|
||||
mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai);
|
||||
mme_ue->csmap = csmap;
|
||||
|
||||
if (vlr) {
|
||||
if (csmap) {
|
||||
sgsap_send_location_update_request(mme_ue);
|
||||
} else {
|
||||
CLEAR_MME_UE_TIMER(mme_ue->t3450);
|
||||
|
|
|
@ -1783,35 +1783,6 @@ mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
mme_vlr_t *mme_vlr_find_by_tai(tai_t *tai)
|
||||
{
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_assert(tai);
|
||||
|
||||
ogs_list_for_each(&self.vlr_list, vlr) {
|
||||
nas_tai_t nas_tai;
|
||||
nas_from_plmn_id(&nas_tai.nas_plmn_id, &tai->plmn_id);
|
||||
nas_tai.tac = tai->tac;
|
||||
if (memcmp(&vlr->tai, &nas_tai, sizeof(nas_tai_t)) == 0)
|
||||
return vlr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mme_vlr_t *mme_vlr_find_by_nas_lai(nas_lai_t *lai)
|
||||
{
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_assert(lai);
|
||||
|
||||
ogs_list_for_each(&self.vlr_list, vlr) {
|
||||
if (memcmp(&vlr->lai, lai, sizeof *lai) == 0)
|
||||
return vlr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mme_csmap_t *mme_csmap_add(mme_vlr_t *vlr)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
|
@ -2205,7 +2176,7 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue)
|
|||
ogs_assert_if_reached();
|
||||
|
||||
/* Clear VLR */
|
||||
mme_ue->vlr = NULL;
|
||||
mme_ue->csmap = NULL;
|
||||
mme_ue->vlr_ostream_id = 0;
|
||||
|
||||
/* Add All Timers */
|
||||
|
|
|
@ -187,8 +187,8 @@ typedef struct mme_pgw_s {
|
|||
} mme_pgw_t;
|
||||
|
||||
#define MME_SGSAP_IS_CONNECTED(__mME) \
|
||||
((__mME) && ((__mME)->vlr) && \
|
||||
(OGS_FSM_CHECK(&(__mME)->vlr->sm, sgsap_state_connected)))
|
||||
((__mME) && ((__mME)->csmap) && ((__mME)->csmap->vlr) && \
|
||||
(OGS_FSM_CHECK(&(__mME)->csmap->vlr->sm, sgsap_state_connected)))
|
||||
#define MME_P_TMSI_IS_AVAILABLE(__mME) \
|
||||
(MME_SGSAP_IS_CONNECTED(__mME) && (__mME)->p_tmsi)
|
||||
|
||||
|
@ -199,9 +199,6 @@ typedef struct mme_vlr_s {
|
|||
|
||||
ogs_timer_t *t_conn; /* client timer to connect to server */
|
||||
|
||||
nas_tai_t tai;
|
||||
nas_lai_t lai;
|
||||
|
||||
uint16_t max_num_of_ostreams;/* SCTP Max num of outbound streams */
|
||||
uint16_t ostream_id; /* vlr_ostream_id generator */
|
||||
|
||||
|
@ -506,7 +503,7 @@ struct mme_ue_s {
|
|||
int session_context_will_deleted;
|
||||
|
||||
gtp_node_t *gnode;
|
||||
mme_vlr_t *vlr;
|
||||
mme_csmap_t *csmap;
|
||||
};
|
||||
|
||||
#define MME_HAVE_SGW_S1U_PATH(__sESS) \
|
||||
|
@ -665,10 +662,7 @@ void mme_vlr_remove_all();
|
|||
|
||||
ogs_socknode_t *mme_vlr_new_node(mme_vlr_t *vlr);
|
||||
void mme_vlr_free_node(mme_vlr_t *vlr);
|
||||
|
||||
mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr);
|
||||
mme_vlr_t *mme_vlr_find_by_tai(tai_t *tai);
|
||||
mme_vlr_t *mme_vlr_find_by_nas_lai(nas_lai_t *lai);
|
||||
|
||||
mme_csmap_t *mme_csmap_add(mme_vlr_t *vlr);
|
||||
void mme_csmap_remove(mme_csmap_t *csmap);
|
||||
|
|
|
@ -110,10 +110,10 @@ void mme_s11_handle_create_session_response(
|
|||
ogs_assert(rv == OGS_OK);
|
||||
|
||||
if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup)) {
|
||||
mme_vlr_t *vlr = mme_vlr_find_by_tai(&mme_ue->tai);
|
||||
mme_ue->vlr = vlr;
|
||||
mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai);
|
||||
mme_ue->csmap = csmap;
|
||||
|
||||
if (vlr) {
|
||||
if (csmap) {
|
||||
sgsap_send_location_update_request(mme_ue);
|
||||
} else {
|
||||
CLEAR_MME_UE_TIMER(mme_ue->t3450);
|
||||
|
|
|
@ -523,9 +523,9 @@ int s1ap_build_initial_context_setup_request(
|
|||
|
||||
s1ap_buffer_to_OCTET_STRING(&mme_ue->tai.plmn_id, sizeof(plmn_id_t),
|
||||
&LAI->pLMNidentity);
|
||||
ogs_assert(mme_ue->vlr);
|
||||
ogs_assert(mme_ue->csmap);
|
||||
ogs_assert(mme_ue->p_tmsi);
|
||||
s1ap_uint16_to_OCTET_STRING(mme_ue->vlr->lai.lac, &LAI->lAC);
|
||||
s1ap_uint16_to_OCTET_STRING(mme_ue->csmap->lai.lac, &LAI->lAC);
|
||||
}
|
||||
|
||||
/* Set UeRadioCapability if exists */
|
||||
|
@ -654,9 +654,9 @@ int s1ap_build_ue_context_modification_request(
|
|||
|
||||
s1ap_buffer_to_OCTET_STRING(&mme_ue->tai.plmn_id, sizeof(plmn_id_t),
|
||||
&LAI->pLMNidentity);
|
||||
ogs_assert(mme_ue->vlr);
|
||||
ogs_assert(mme_ue->csmap);
|
||||
ogs_assert(mme_ue->p_tmsi);
|
||||
s1ap_uint16_to_OCTET_STRING(mme_ue->vlr->lai.lac, &LAI->lAC);
|
||||
s1ap_uint16_to_OCTET_STRING(mme_ue->csmap->lai.lac, &LAI->lAC);
|
||||
|
||||
} else {
|
||||
ie = ogs_calloc(1, sizeof(S1AP_UEContextModificationRequestIEs_t));
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
ogs_pkbuf_t *sgsap_build_location_update_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_tlv_t *root = NULL;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -36,7 +37,9 @@ ogs_pkbuf_t *sgsap_build_location_update_request(mme_ue_t *mme_ue)
|
|||
nas_lai_t lai;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
vlr = mme_ue->vlr;
|
||||
csmap = mme_ue->csmap;
|
||||
ogs_assert(csmap);
|
||||
vlr = csmap->vlr;
|
||||
ogs_assert(vlr);
|
||||
|
||||
root = ogs_tlv_add(NULL, SGSAP_IE_IMSI_TYPE, SGSAP_IE_IMSI_LEN, 0,
|
||||
|
@ -50,7 +53,7 @@ ogs_pkbuf_t *sgsap_build_location_update_request(mme_ue_t *mme_ue)
|
|||
eps_update_type = SGSAP_EPS_UPDATE_IMSI_ATTACH;
|
||||
ogs_tlv_add(root, SGSAP_IE_EPS_UPDATE_TYPE, SGSAP_IE_EPS_UPDATE_LEN, 0,
|
||||
&eps_update_type);
|
||||
memcpy(&lai, &vlr->lai, sizeof(nas_lai_t));
|
||||
memcpy(&lai, &csmap->lai, sizeof(nas_lai_t));
|
||||
lai.lac = htons(lai.lac);
|
||||
ogs_tlv_add(root, SGSAP_IE_LAI_TYPE, SGSAP_IE_LAI_LEN, 0, &lai);
|
||||
|
||||
|
@ -67,12 +70,15 @@ ogs_pkbuf_t *sgsap_build_location_update_request(mme_ue_t *mme_ue)
|
|||
}
|
||||
ogs_pkbuf_t *sgsap_build_tmsi_reallocation_complete(mme_ue_t *mme_ue)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_tlv_t *root = NULL;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
vlr = mme_ue->vlr;
|
||||
csmap = mme_ue->csmap;
|
||||
ogs_assert(csmap);
|
||||
vlr = csmap->vlr;
|
||||
ogs_assert(vlr);
|
||||
|
||||
root = ogs_tlv_add(NULL, SGSAP_IE_IMSI_TYPE, SGSAP_IE_IMSI_LEN, 0,
|
||||
|
@ -92,6 +98,7 @@ ogs_pkbuf_t *sgsap_build_tmsi_reallocation_complete(mme_ue_t *mme_ue)
|
|||
|
||||
ogs_pkbuf_t *sgsap_build_detach_indication(mme_ue_t *mme_ue)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_tlv_t *root = NULL;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -103,7 +110,9 @@ ogs_pkbuf_t *sgsap_build_detach_indication(mme_ue_t *mme_ue)
|
|||
uint8_t indication = SGSAP_EPS_DETACH_UE_INITIATED;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
vlr = mme_ue->vlr;
|
||||
csmap = mme_ue->csmap;
|
||||
ogs_assert(csmap);
|
||||
vlr = csmap->vlr;
|
||||
ogs_assert(vlr);
|
||||
|
||||
switch (mme_ue->nas_eps.detach.detach_type) {
|
||||
|
@ -165,12 +174,15 @@ ogs_pkbuf_t *sgsap_build_detach_indication(mme_ue_t *mme_ue)
|
|||
|
||||
ogs_pkbuf_t *sgsap_build_mo_csfb_indication(mme_ue_t *mme_ue)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_tlv_t *root = NULL;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
vlr = mme_ue->vlr;
|
||||
csmap = mme_ue->csmap;
|
||||
ogs_assert(csmap);
|
||||
vlr = csmap->vlr;
|
||||
ogs_assert(vlr);
|
||||
|
||||
root = ogs_tlv_add(NULL, SGSAP_IE_IMSI_TYPE, SGSAP_IE_IMSI_LEN, 0,
|
||||
|
@ -220,12 +232,15 @@ ogs_pkbuf_t *sgsap_build_paging_reject(
|
|||
|
||||
ogs_pkbuf_t *sgsap_build_service_request(mme_ue_t *mme_ue, uint8_t emm_mode)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_tlv_t *root = NULL;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
vlr = mme_ue->vlr;
|
||||
csmap = mme_ue->csmap;
|
||||
ogs_assert(csmap);
|
||||
vlr = csmap->vlr;
|
||||
ogs_assert(vlr);
|
||||
|
||||
root = ogs_tlv_add(NULL, SGSAP_IE_IMSI_TYPE, SGSAP_IE_IMSI_LEN, 0,
|
||||
|
@ -281,15 +296,19 @@ ogs_pkbuf_t *sgsap_build_reset_ack(mme_vlr_t *vlr)
|
|||
ogs_pkbuf_t *sgsap_build_uplink_unidata(
|
||||
mme_ue_t *mme_ue, nas_message_container_t *nas_message_container)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_tlv_t *root = NULL;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
vlr = mme_ue->vlr;
|
||||
ogs_assert(vlr);
|
||||
ogs_assert(nas_message_container);
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
csmap = mme_ue->csmap;
|
||||
ogs_assert(csmap);
|
||||
vlr = csmap->vlr;
|
||||
ogs_assert(vlr);
|
||||
|
||||
root = ogs_tlv_add(NULL, SGSAP_IE_IMSI_TYPE, SGSAP_IE_IMSI_LEN, 0,
|
||||
&mme_ue->nas_mobile_identity_imsi);
|
||||
|
||||
|
@ -310,12 +329,15 @@ ogs_pkbuf_t *sgsap_build_uplink_unidata(
|
|||
|
||||
ogs_pkbuf_t *sgsap_build_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_tlv_t *root = NULL;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
vlr = mme_ue->vlr;
|
||||
csmap = mme_ue->csmap;
|
||||
ogs_assert(csmap);
|
||||
vlr = csmap->vlr;
|
||||
ogs_assert(vlr);
|
||||
|
||||
root = ogs_tlv_add(NULL, SGSAP_IE_IMSI_TYPE, SGSAP_IE_IMSI_LEN, 0,
|
||||
|
|
|
@ -89,11 +89,6 @@ int sgsap_send_to_vlr_with_sid(
|
|||
ogs_assert(sock);
|
||||
|
||||
ogs_debug(" VLR-IP[%s]", OGS_ADDR(node->addr, buf));
|
||||
ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]",
|
||||
plmn_id_hexdump(&vlr->tai.nas_plmn_id), vlr->tai.tac);
|
||||
ogs_debug(" LAI[PLMN_ID:%06x,LAC:%d]",
|
||||
plmn_id_hexdump(&vlr->lai.nas_plmn_id), vlr->lai.lac);
|
||||
|
||||
rv = sgsap_send(sock, pkbuf, node->addr, stream_no);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("sgsap_send() failed");
|
||||
|
@ -108,12 +103,22 @@ int sgsap_send_to_vlr_with_sid(
|
|||
|
||||
int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
||||
{
|
||||
mme_csmap_t *csmap = NULL;
|
||||
mme_vlr_t *vlr = NULL;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
ogs_assert(pkbuf);
|
||||
vlr = mme_ue->vlr;
|
||||
|
||||
ogs_assert(mme_ue);
|
||||
csmap = mme_ue->csmap;
|
||||
ogs_assert(csmap);
|
||||
vlr = csmap->vlr;
|
||||
ogs_assert(vlr);
|
||||
|
||||
ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]",
|
||||
plmn_id_hexdump(&csmap->tai.nas_plmn_id), csmap->tai.tac);
|
||||
ogs_debug(" LAI[PLMN_ID:%06x,LAC:%d]",
|
||||
plmn_id_hexdump(&csmap->lai.nas_plmn_id), csmap->lai.lac);
|
||||
|
||||
return sgsap_send_to_vlr_with_sid(vlr, pkbuf, mme_ue->vlr_ostream_id);
|
||||
}
|
||||
|
||||
|
|
|
@ -3254,13 +3254,13 @@ int testsgsap_location_update_accept(ogs_pkbuf_t **pkbuf, int i)
|
|||
{
|
||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||
"0a01082926240000 111893040509f107 09260e05f49ee88e 64",
|
||||
"",
|
||||
"0a01087942120000 000030040527f412 c9580e05f437ab9c c5",
|
||||
"",
|
||||
|
||||
};
|
||||
uint16_t len[TESTS1AP_MAX_MESSAGE] = {
|
||||
25,
|
||||
0,
|
||||
25,
|
||||
0,
|
||||
};
|
||||
char hexbuf[MAX_SDU_LEN];
|
||||
|
|
|
@ -160,18 +160,16 @@ static void test1_func(abts_case *tc, void *data)
|
|||
rv = testenb_s1ap_send(s1ap, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
|
||||
#if 0
|
||||
/* Receive SGsAP-Location-Update-Request */
|
||||
recvbuf = testvlr_sgsap_read(sgsap);
|
||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||
ogs_pkbuf_free(recvbuf);
|
||||
|
||||
/* Send SGsAP-Location-Update-Accept */
|
||||
rv = testsgsap_location_update_accept(&sendbuf, 0);
|
||||
rv = testsgsap_location_update_accept(&sendbuf, 1);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
rv = testvlr_sgsap_send(sgsap, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||
#endif
|
||||
|
||||
/* Receive Initial Context Setup Request +
|
||||
* Attach Accept +
|
||||
|
|
|
@ -52,7 +52,7 @@ mme:
|
|||
plmn_id:
|
||||
mcc: 724
|
||||
mnc: 21
|
||||
lac: 2342
|
||||
lac: 51544
|
||||
gummei:
|
||||
plmn_id:
|
||||
mcc: 901
|
||||
|
|
Loading…
Reference in New Issue