forked from acouzens/open5gs
update it
This commit is contained in:
parent
9d5f0a510b
commit
d53b30449f
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 = >p_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(>p_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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue