develop-nr merge
This commit is contained in:
+329
-355
@@ -57,9 +57,9 @@
|
||||
extern unsigned char NB_eNB_INST;
|
||||
extern RAN_CONTEXT_t RC;
|
||||
|
||||
extern struct rrc_eNB_ue_context_s*
|
||||
extern struct rrc_eNB_ue_context_s *
|
||||
rrc_eNB_get_ue_context(
|
||||
eNB_RRC_INST* rrc_instance_pP,
|
||||
eNB_RRC_INST *rrc_instance_pP,
|
||||
rnti_t rntiP);
|
||||
|
||||
#if defined(GTP_DUMP_SOCKET) && GTP_DUMP_SOCKET > 0
|
||||
@@ -112,24 +112,22 @@ static void gtpv1u_eNB_write_dump_socket(uint8_t *buffer_pP, uint32_t buffer_len
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
static int gtpv1u_eNB_get_msgsource(struct rrc_eNB_ue_context_s *ue_context_p, teid_t teid)
|
||||
{
|
||||
static int gtpv1u_eNB_get_msgsource(struct rrc_eNB_ue_context_s *ue_context_p, teid_t teid) {
|
||||
int erab_index = 0;
|
||||
|
||||
/* source enb */
|
||||
if(ue_context_p->ue_context.handover_info != NULL && ue_context_p->ue_context.handover_info->state == HO_COMPLETE)
|
||||
{
|
||||
return GTPV1U_MSG_FROM_SPGW;
|
||||
if(ue_context_p->ue_context.handover_info != NULL && ue_context_p->ue_context.handover_info->state == HO_COMPLETE) {
|
||||
return GTPV1U_MSG_FROM_SPGW;
|
||||
}
|
||||
|
||||
/* target enb */
|
||||
for (erab_index = 0; erab_index < ue_context_p->ue_context.nb_x2u_e_rabs; erab_index++) {
|
||||
if(ue_context_p->ue_context.enb_gtp_x2u_teid[erab_index] == teid){
|
||||
return GTPV1U_MSG_FROM_SOURCE_ENB;
|
||||
if(ue_context_p->ue_context.enb_gtp_x2u_teid[erab_index] == teid) {
|
||||
return GTPV1U_MSG_FROM_SOURCE_ENB;
|
||||
}
|
||||
}
|
||||
|
||||
return GTPV1U_MSG_FROM_SPGW;
|
||||
|
||||
return GTPV1U_MSG_FROM_SPGW;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -225,10 +223,9 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req(
|
||||
case NW_GTPV1U_ULP_API_RECV_TPDU: {
|
||||
uint8_t buffer[4096];
|
||||
uint32_t buffer_len;
|
||||
struct rrc_eNB_ue_context_s *ue_context_p;
|
||||
struct rrc_eNB_ue_context_s *ue_context_p;
|
||||
uint16_t msgType = NW_GTP_GPDU;
|
||||
NwGtpv1uMsgT *pMsg = NULL;
|
||||
|
||||
NwGtpv1uMsgT *pMsg = NULL;
|
||||
/* Nw-gptv1u stack has processed a PDU. we can schedule it to PDCP
|
||||
* for transmission.
|
||||
*/
|
||||
@@ -276,158 +273,152 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req(
|
||||
0,0,
|
||||
(gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4,
|
||||
buffer_len);
|
||||
ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.module_id], ctxt.rnti);
|
||||
|
||||
ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.module_id], ctxt.rnti);
|
||||
if((ue_context_p != NULL) &&
|
||||
(ue_context_p->ue_context.handover_info != NULL) &&
|
||||
(ue_context_p->ue_context.handover_info->state < HO_FORWARDING_COMPLETE)) {
|
||||
|
||||
if(msgType == NW_GTP_END_MARKER){
|
||||
/* in the source enb, UE in RRC_HO_EXECUTION mode */
|
||||
if (ue_context_p->ue_context.Status == RRC_HO_EXECUTION && ue_context_p->ue_context.handover_info->state == HO_COMPLETE) {
|
||||
/* set handover state */
|
||||
//ue_context_p->ue_context.handover_info->state = HO_END_MARKER;
|
||||
|
||||
MessageDef *msg;
|
||||
// Configure end marker
|
||||
msg = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_END_MARKER_REQ);
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).buffer = itti_malloc(TASK_GTPV1_U, TASK_GTPV1_U, GTPU_HEADER_OVERHEAD_MAX + buffer_len);
|
||||
memcpy(>PV1U_ENB_END_MARKER_REQ(msg).buffer[GTPU_HEADER_OVERHEAD_MAX], buffer, buffer_len);
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).length = buffer_len;
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).rnti = ctxt.rnti;
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).rab_id = gtpv1u_teid_data_p->eps_bearer_id;
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).offset = GTPU_HEADER_OVERHEAD_MAX;
|
||||
LOG_I(GTPU, "Send End Marker to GTPV1-U at frame %d and subframe %d \n", ctxt.frame,ctxt.subframe);
|
||||
itti_send_msg_to_task(TASK_GTPV1_U, ENB_MODULE_ID_TO_INSTANCE(ctxt.module_id), msg);
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
}
|
||||
|
||||
if (ue_context_p->ue_context.Status == RRC_HO_EXECUTION || ue_context_p->ue_context.Status == RRC_RECONFIGURED) {
|
||||
|
||||
int msgsrc = gtpv1u_eNB_get_msgsource(ue_context_p, teid);
|
||||
|
||||
LOG_D(GTPU,"UE INFO.ueStatus %d, handover state %d, forwarding state %d, from %s. message type %s\n",
|
||||
ue_context_p->ue_context.Status,
|
||||
ue_context_p->ue_context.handover_info->state,
|
||||
ue_context_p->ue_context.handover_info->forwarding_state,
|
||||
msgsrc == GTPV1U_MSG_FROM_SOURCE_ENB?"Source eNB":"EPC",
|
||||
msgsrc != GTPV1U_MSG_FROM_SOURCE_ENB? "UDP DATA" :
|
||||
msgType == NW_GTP_END_MARKER?"END MARKER":"DATA FORWARDING");
|
||||
|
||||
/* target enb */
|
||||
if(msgType == NW_GTP_END_MARKER){
|
||||
LOG_I(GTPU, "target end receive END MARKER\n");
|
||||
ue_context_p->ue_context.handover_info->state = HO_END_MARKER;
|
||||
gtpv1u_enb_delete_tunnel_req_t delete_tunnel_req;
|
||||
memset(&delete_tunnel_req, 0 , sizeof(delete_tunnel_req));
|
||||
delete_tunnel_req.rnti = ctxt.rnti;
|
||||
gtpv1u_delete_x2u_tunnel(ctxt.module_id, &delete_tunnel_req, GTPV1U_TARGET_ENB);
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
|
||||
/* form source eNB message */
|
||||
if(msgsrc == GTPV1U_MSG_FROM_SOURCE_ENB)
|
||||
{
|
||||
LOG_I(GTPU, "Received a message data forwarding length %d\n", buffer_len);
|
||||
|
||||
#if defined(LOG_GTPU) && LOG_GTPU > 0
|
||||
LOG_T(GTPU, "forwarding data info:\n", buffer_len);
|
||||
|
||||
for(int i=1;i<=buffer_len; i++){
|
||||
LOG_T(GTPU, "%02x ", buffer[i-1]);
|
||||
if(i%20 == 0)LOG_T(GTPU, "\n");
|
||||
}
|
||||
LOG_T(GTPU, "\n");
|
||||
#endif
|
||||
|
||||
result = gtpv_data_req(
|
||||
&ctxt,
|
||||
(gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4,
|
||||
0, // mui
|
||||
SDU_CONFIRM_NO, // confirm
|
||||
buffer_len,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_DATA,
|
||||
TASK_DATA_FORWARDING
|
||||
);
|
||||
|
||||
if ( result == FALSE ) {
|
||||
LOG_W(GTPU, "DATA FORWARDING message save failed\n");
|
||||
return NW_GTPV1U_FAILURE;
|
||||
}
|
||||
ue_context_p->ue_context.handover_info->forwarding_state = FORWARDING_NO_EMPTY;
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
/* from epc message */
|
||||
else
|
||||
{
|
||||
/* in the source enb, UE in RRC_HO_EXECUTION mode */
|
||||
if (ue_context_p->ue_context.handover_info->state == HO_COMPLETE) {
|
||||
MessageDef *msg;
|
||||
// Configure target
|
||||
msg = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_DATA_FORWARDING_REQ);
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).buffer = itti_malloc(TASK_GTPV1_U, TASK_GTPV1_U, GTPU_HEADER_OVERHEAD_MAX + buffer_len);
|
||||
memcpy(>PV1U_ENB_DATA_FORWARDING_REQ(msg).buffer[GTPU_HEADER_OVERHEAD_MAX], buffer, buffer_len);
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).length = buffer_len;
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).rnti = ctxt.rnti;
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).rab_id = gtpv1u_teid_data_p->eps_bearer_id;
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).offset = GTPU_HEADER_OVERHEAD_MAX;
|
||||
|
||||
#if defined(LOG_GTPU) && LOG_GTPU > 0
|
||||
|
||||
LOG_T(GTPU, "Send data forwarding sdu_buffer to target enb. len %d info\n", buffer);
|
||||
for(int i=1; i<=buffer_len; i++){
|
||||
LOG_T(GTPU, "%02x ", buffer[i-1]);
|
||||
if(i%20 == 0)LOG_T(GTPU, "\n");
|
||||
if((ue_context_p != NULL) &&
|
||||
(ue_context_p->ue_context.handover_info != NULL) &&
|
||||
(ue_context_p->ue_context.handover_info->state < HO_FORWARDING_COMPLETE)) {
|
||||
if(msgType == NW_GTP_END_MARKER) {
|
||||
/* in the source enb, UE in RRC_HO_EXECUTION mode */
|
||||
if (ue_context_p->ue_context.Status == RRC_HO_EXECUTION && ue_context_p->ue_context.handover_info->state == HO_COMPLETE) {
|
||||
/* set handover state */
|
||||
//ue_context_p->ue_context.handover_info->state = HO_END_MARKER;
|
||||
MessageDef *msg;
|
||||
// Configure end marker
|
||||
msg = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_END_MARKER_REQ);
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).buffer = itti_malloc(TASK_GTPV1_U, TASK_GTPV1_U, GTPU_HEADER_OVERHEAD_MAX + buffer_len);
|
||||
memcpy(>PV1U_ENB_END_MARKER_REQ(msg).buffer[GTPU_HEADER_OVERHEAD_MAX], buffer, buffer_len);
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).length = buffer_len;
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).rnti = ctxt.rnti;
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).rab_id = gtpv1u_teid_data_p->eps_bearer_id;
|
||||
GTPV1U_ENB_END_MARKER_REQ(msg).offset = GTPU_HEADER_OVERHEAD_MAX;
|
||||
LOG_I(GTPU, "Send End Marker to GTPV1-U at frame %d and subframe %d \n", ctxt.frame,ctxt.subframe);
|
||||
itti_send_msg_to_task(TASK_GTPV1_U, ENB_MODULE_ID_TO_INSTANCE(ctxt.module_id), msg);
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
}
|
||||
LOG_T(GTPU, "\n");
|
||||
#endif
|
||||
|
||||
LOG_I(GTPU, "Send data forwarding to GTPV1-U at frame %d and subframe %d \n", ctxt.frame,ctxt.subframe);
|
||||
itti_send_msg_to_task(TASK_GTPV1_U, ENB_MODULE_ID_TO_INSTANCE(ctxt.module_id), msg);
|
||||
return NW_GTPV1U_OK;
|
||||
if (ue_context_p->ue_context.Status == RRC_HO_EXECUTION || ue_context_p->ue_context.Status == RRC_RECONFIGURED) {
|
||||
int msgsrc = gtpv1u_eNB_get_msgsource(ue_context_p, teid);
|
||||
LOG_D(GTPU,"UE INFO.ueStatus %d, handover state %d, forwarding state %d, from %s. message type %s\n",
|
||||
ue_context_p->ue_context.Status,
|
||||
ue_context_p->ue_context.handover_info->state,
|
||||
ue_context_p->ue_context.handover_info->forwarding_state,
|
||||
msgsrc == GTPV1U_MSG_FROM_SOURCE_ENB?"Source eNB":"EPC",
|
||||
msgsrc != GTPV1U_MSG_FROM_SOURCE_ENB? "UDP DATA" :
|
||||
msgType == NW_GTP_END_MARKER?"END MARKER":"DATA FORWARDING");
|
||||
|
||||
/* target enb */
|
||||
if(msgType == NW_GTP_END_MARKER) {
|
||||
LOG_I(GTPU, "target end receive END MARKER\n");
|
||||
ue_context_p->ue_context.handover_info->state = HO_END_MARKER;
|
||||
gtpv1u_enb_delete_tunnel_req_t delete_tunnel_req;
|
||||
memset(&delete_tunnel_req, 0, sizeof(delete_tunnel_req));
|
||||
delete_tunnel_req.rnti = ctxt.rnti;
|
||||
gtpv1u_delete_x2u_tunnel(ctxt.module_id, &delete_tunnel_req, GTPV1U_TARGET_ENB);
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
|
||||
/* form source eNB message */
|
||||
if(msgsrc == GTPV1U_MSG_FROM_SOURCE_ENB) {
|
||||
LOG_I(GTPU, "Received a message data forwarding length %d\n", buffer_len);
|
||||
#if defined(LOG_GTPU) && LOG_GTPU > 0
|
||||
LOG_T(GTPU, "forwarding data info:\n", buffer_len);
|
||||
|
||||
for(int i=1; i<=buffer_len; i++) {
|
||||
LOG_T(GTPU, "%02x ", buffer[i-1]);
|
||||
|
||||
if(i%20 == 0)LOG_T(GTPU, "\n");
|
||||
}
|
||||
|
||||
LOG_T(GTPU, "\n");
|
||||
#endif
|
||||
result = gtpv_data_req(
|
||||
&ctxt,
|
||||
(gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4,
|
||||
0, // mui
|
||||
SDU_CONFIRM_NO, // confirm
|
||||
buffer_len,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_DATA,
|
||||
TASK_DATA_FORWARDING
|
||||
);
|
||||
|
||||
if ( result == FALSE ) {
|
||||
LOG_W(GTPU, "DATA FORWARDING message save failed\n");
|
||||
return NW_GTPV1U_FAILURE;
|
||||
}
|
||||
|
||||
ue_context_p->ue_context.handover_info->forwarding_state = FORWARDING_NO_EMPTY;
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
/* from epc message */
|
||||
else {
|
||||
/* in the source enb, UE in RRC_HO_EXECUTION mode */
|
||||
if (ue_context_p->ue_context.handover_info->state == HO_COMPLETE) {
|
||||
MessageDef *msg;
|
||||
// Configure target
|
||||
msg = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_DATA_FORWARDING_REQ);
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).buffer = itti_malloc(TASK_GTPV1_U, TASK_GTPV1_U, GTPU_HEADER_OVERHEAD_MAX + buffer_len);
|
||||
memcpy(>PV1U_ENB_DATA_FORWARDING_REQ(msg).buffer[GTPU_HEADER_OVERHEAD_MAX], buffer, buffer_len);
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).length = buffer_len;
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).rnti = ctxt.rnti;
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).rab_id = gtpv1u_teid_data_p->eps_bearer_id;
|
||||
GTPV1U_ENB_DATA_FORWARDING_REQ(msg).offset = GTPU_HEADER_OVERHEAD_MAX;
|
||||
#if defined(LOG_GTPU) && LOG_GTPU > 0
|
||||
LOG_T(GTPU, "Send data forwarding sdu_buffer to target enb. len %d info\n", buffer);
|
||||
|
||||
for(int i=1; i<=buffer_len; i++) {
|
||||
LOG_T(GTPU, "%02x ", buffer[i-1]);
|
||||
|
||||
if(i%20 == 0)LOG_T(GTPU, "\n");
|
||||
}
|
||||
|
||||
LOG_T(GTPU, "\n");
|
||||
#endif
|
||||
LOG_I(GTPU, "Send data forwarding to GTPV1-U at frame %d and subframe %d \n", ctxt.frame,ctxt.subframe);
|
||||
itti_send_msg_to_task(TASK_GTPV1_U, ENB_MODULE_ID_TO_INSTANCE(ctxt.module_id), msg);
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
|
||||
/* target eNB. x2ho forwarding is processing. spgw message save to TASK_END_MARKER */
|
||||
if(ue_context_p->ue_context.handover_info->state != HO_COMPLETE &&
|
||||
ue_context_p->ue_context.handover_info->state != HO_END_MARKER ) {
|
||||
LOG_I(GTPU, "x2ho forwarding is processing. Received a spgw message. length %d\n", buffer_len);
|
||||
#if defined(LOG_GTPU) && LOG_GTPU > 0
|
||||
LOG_T(GTPU, "spgw data info:\n", buffer_len);
|
||||
|
||||
for(int i=1; i<=buffer_len; i++) {
|
||||
LOG_T(GTPU, "%02x ", buffer[i-1]);
|
||||
|
||||
if(i%20 == 0)LOG_T(GTPU, "\n");
|
||||
}
|
||||
|
||||
LOG_T(GTPU, "\n");
|
||||
#endif
|
||||
result = gtpv_data_req(
|
||||
&ctxt,
|
||||
(gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4,
|
||||
0, // mui
|
||||
SDU_CONFIRM_NO, // confirm
|
||||
buffer_len,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_DATA,
|
||||
TASK_END_MARKER
|
||||
);
|
||||
|
||||
if ( result == FALSE ) {
|
||||
LOG_W(GTPU, "DATA FORWARDING message save failed\n");
|
||||
return NW_GTPV1U_FAILURE;
|
||||
}
|
||||
|
||||
ue_context_p->ue_context.handover_info->endmark_state = ENDMARK_NO_EMPTY;
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* target eNB. x2ho forwarding is processing. spgw message save to TASK_END_MARKER */
|
||||
if(ue_context_p->ue_context.handover_info->state != HO_COMPLETE &&
|
||||
ue_context_p->ue_context.handover_info->state != HO_END_MARKER )
|
||||
{
|
||||
LOG_I(GTPU, "x2ho forwarding is processing. Received a spgw message. length %d\n", buffer_len);
|
||||
#if defined(LOG_GTPU) && LOG_GTPU > 0
|
||||
LOG_T(GTPU, "spgw data info:\n", buffer_len);
|
||||
for(int i=1;i<=buffer_len; i++){
|
||||
LOG_T(GTPU, "%02x ", buffer[i-1]);
|
||||
if(i%20 == 0)LOG_T(GTPU, "\n");
|
||||
}
|
||||
LOG_T(GTPU, "\n");
|
||||
#endif
|
||||
|
||||
result = gtpv_data_req(
|
||||
&ctxt,
|
||||
(gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4,
|
||||
0, // mui
|
||||
SDU_CONFIRM_NO, // confirm
|
||||
buffer_len,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_DATA,
|
||||
TASK_END_MARKER
|
||||
);
|
||||
|
||||
if ( result == FALSE ) {
|
||||
LOG_W(GTPU, "DATA FORWARDING message save failed\n");
|
||||
return NW_GTPV1U_FAILURE;
|
||||
}
|
||||
|
||||
ue_context_p->ue_context.handover_info->endmark_state = ENDMARK_NO_EMPTY;
|
||||
return NW_GTPV1U_OK;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
result = pdcp_data_req(
|
||||
&ctxt,
|
||||
SRB_FLAG_NO,
|
||||
@@ -436,10 +427,7 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req(
|
||||
SDU_CONFIRM_NO, // confirm
|
||||
buffer_len,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_DATA
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
,NULL, NULL
|
||||
#endif
|
||||
PDCP_TRANSMISSION_MODE_DATA,NULL, NULL
|
||||
);
|
||||
|
||||
if ( result == FALSE ) {
|
||||
@@ -671,7 +659,7 @@ gtpv1u_new_data_req(
|
||||
ue.ue_id = ue_rntiP;
|
||||
AssertFatal(enb_module_idP >=0, "Bad parameter enb module id %u\n", enb_module_idP);
|
||||
AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET)< GTPV1U_MAX_BEARERS_ID, "Bad parameter rab id %u\n", rab_idP);
|
||||
AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET) >= 0 , "Bad parameter rab id %u\n", rab_idP);
|
||||
AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET) >= 0, "Bad parameter rab id %u\n", rab_idP);
|
||||
gtpv1u_data_p = RC.gtpv1u_data_g;
|
||||
/* Check that UE context is present in ue map. */
|
||||
hash_rc = hashtable_get(gtpv1u_data_p->ue_mapping, (uint64_t)ue_rntiP, (void **)&ue_inst_p);
|
||||
@@ -739,10 +727,9 @@ gtpv1u_new_data_req(
|
||||
int
|
||||
gtpv1u_create_x2u_tunnel(
|
||||
const instance_t instanceP,
|
||||
const gtpv1u_enb_create_x2u_tunnel_req_t * const create_tunnel_req_pP,
|
||||
gtpv1u_enb_create_x2u_tunnel_resp_t * const create_tunnel_resp_pP
|
||||
)
|
||||
{
|
||||
const gtpv1u_enb_create_x2u_tunnel_req_t *const create_tunnel_req_pP,
|
||||
gtpv1u_enb_create_x2u_tunnel_resp_t *const create_tunnel_resp_pP
|
||||
) {
|
||||
/* Create a new nw-gtpv1-u stack req using API */
|
||||
NwGtpv1uUlpApiT stack_req;
|
||||
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
||||
@@ -752,16 +739,14 @@ gtpv1u_create_x2u_tunnel(
|
||||
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
|
||||
int i;
|
||||
ebi_t eps_bearer_id = 0;
|
||||
|
||||
MSC_LOG_RX_MESSAGE(
|
||||
MSC_GTPU_ENB,
|
||||
MSC_RRC_ENB,
|
||||
NULL,0,
|
||||
MSC_AS_TIME_FMT" CREATE_X2U_TUNNEL_REQ RNTI %"PRIx16" inst %u ntuns %u ebid %u enb-x2u teid %u",
|
||||
0,0,create_tunnel_req_pP->rnti, instanceP,
|
||||
create_tunnel_req_pP->num_tunnels, create_tunnel_req_pP->eps_bearer_id[0],
|
||||
create_tunnel_req_pP->tenb_X2u_teid[0]);
|
||||
|
||||
MSC_GTPU_ENB,
|
||||
MSC_RRC_ENB,
|
||||
NULL,0,
|
||||
MSC_AS_TIME_FMT" CREATE_X2U_TUNNEL_REQ RNTI %"PRIx16" inst %u ntuns %u ebid %u enb-x2u teid %u",
|
||||
0,0,create_tunnel_req_pP->rnti, instanceP,
|
||||
create_tunnel_req_pP->num_tunnels, create_tunnel_req_pP->eps_bearer_id[0],
|
||||
create_tunnel_req_pP->tenb_X2u_teid[0]);
|
||||
create_tunnel_resp_pP->rnti = create_tunnel_req_pP->rnti;
|
||||
create_tunnel_resp_pP->status = 0;
|
||||
create_tunnel_resp_pP->num_tunnels = 0;
|
||||
@@ -771,7 +756,6 @@ gtpv1u_create_x2u_tunnel(
|
||||
LOG_D(GTPU, "Rx GTPV1U_ENB_CREATE_X2U_TUNNEL_REQ ue rnti %x eps bearer id %u\n",
|
||||
create_tunnel_req_pP->rnti, eps_bearer_id);
|
||||
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
||||
|
||||
stack_req.apiType = NW_GTPV1U_ULP_API_CREATE_TUNNEL_ENDPOINT;
|
||||
|
||||
do {
|
||||
@@ -780,30 +764,26 @@ gtpv1u_create_x2u_tunnel(
|
||||
stack_req.apiInfo.createTunnelEndPointInfo.teid = x2u_teid;
|
||||
stack_req.apiInfo.createTunnelEndPointInfo.hUlpSession = 0;
|
||||
stack_req.apiInfo.createTunnelEndPointInfo.hStackSession = 0;
|
||||
|
||||
rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req);
|
||||
LOG_D(GTPU, ".\n");
|
||||
} while (rc != NW_GTPV1U_OK);
|
||||
|
||||
memcpy(&create_tunnel_resp_pP->enb_addr.buffer,
|
||||
&RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up,
|
||||
sizeof (in_addr_t));
|
||||
|
||||
LOG_D(GTPU, "gtpv1u_create_x2u_tunnel() end addr %d.%d.%d.%d\n",
|
||||
create_tunnel_resp_pP->enb_addr.buffer[0],
|
||||
create_tunnel_resp_pP->enb_addr.buffer[1],
|
||||
create_tunnel_resp_pP->enb_addr.buffer[2],
|
||||
create_tunnel_resp_pP->enb_addr.buffer[3]);
|
||||
|
||||
memcpy(&create_tunnel_resp_pP->enb_addr.buffer,
|
||||
&RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up,
|
||||
sizeof (in_addr_t));
|
||||
LOG_D(GTPU, "gtpv1u_create_x2u_tunnel() end addr %d.%d.%d.%d\n",
|
||||
create_tunnel_resp_pP->enb_addr.buffer[0],
|
||||
create_tunnel_resp_pP->enb_addr.buffer[1],
|
||||
create_tunnel_resp_pP->enb_addr.buffer[2],
|
||||
create_tunnel_resp_pP->enb_addr.buffer[3]);
|
||||
create_tunnel_resp_pP->enb_addr.length = sizeof (in_addr_t);
|
||||
create_tunnel_resp_pP->eps_bearer_id[i] = eps_bearer_id;
|
||||
create_tunnel_resp_pP->num_tunnels += 1;
|
||||
|
||||
//-----------------------
|
||||
// GTPV1U->PDCP mapping
|
||||
//-----------------------
|
||||
create_tunnel_resp_pP->enb_X2u_teid[i] = x2u_teid;
|
||||
hash_rc = hashtable_get(RC.gtpv1u_data_g->teid_mapping, x2u_teid, (void**)>pv1u_teid_data_p);
|
||||
hash_rc = hashtable_get(RC.gtpv1u_data_g->teid_mapping, x2u_teid, (void **)>pv1u_teid_data_p);
|
||||
|
||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
||||
gtpv1u_teid_data_p = calloc (1, sizeof(gtpv1u_teid_data_t));
|
||||
@@ -817,14 +797,14 @@ gtpv1u_create_x2u_tunnel(
|
||||
create_tunnel_resp_pP->status = 0xFF;
|
||||
}
|
||||
}
|
||||
MSC_LOG_TX_MESSAGE(
|
||||
MSC_GTPU_ENB,
|
||||
MSC_RRC_ENB,
|
||||
NULL,0,
|
||||
"0 GTPV1U_ENB_CREATE_TUNNEL_RESP rnti %x teid %x",
|
||||
create_tunnel_resp_pP->rnti,
|
||||
x2u_teid);
|
||||
|
||||
MSC_LOG_TX_MESSAGE(
|
||||
MSC_GTPU_ENB,
|
||||
MSC_RRC_ENB,
|
||||
NULL,0,
|
||||
"0 GTPV1U_ENB_CREATE_TUNNEL_RESP rnti %x teid %x",
|
||||
create_tunnel_resp_pP->rnti,
|
||||
x2u_teid);
|
||||
LOG_D(GTPU, "Tx GTPV1U_ENB_CREATE_TUNNEL_RESP ue rnti %x status %d\n",
|
||||
create_tunnel_req_pP->rnti,
|
||||
create_tunnel_resp_pP->status);
|
||||
@@ -834,38 +814,37 @@ gtpv1u_create_x2u_tunnel(
|
||||
//-----------------------------------------------------------------------------
|
||||
int gtpv1u_delete_x2u_tunnel(
|
||||
const instance_t instanceP,
|
||||
const gtpv1u_enb_delete_tunnel_req_t * const req_pP,
|
||||
int enbflag)
|
||||
{
|
||||
const gtpv1u_enb_delete_tunnel_req_t *const req_pP,
|
||||
int enbflag) {
|
||||
gtpv1u_ue_data_t *gtpv1u_ue_data_p = NULL;
|
||||
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
|
||||
int erab_index = 0;
|
||||
ebi_t eps_bearer_id = 0;
|
||||
struct rrc_eNB_ue_context_s *ue_context_p = NULL;
|
||||
|
||||
ue_context_p = rrc_eNB_get_ue_context(RC.rrc[instanceP], req_pP->rnti);
|
||||
if(ue_context_p != NULL){
|
||||
|
||||
if(ue_context_p != NULL) {
|
||||
/* in the source enb */
|
||||
if(enbflag == GTPV1U_SOURCE_ENB){
|
||||
hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, req_pP->rnti, (void**)>pv1u_ue_data_p);
|
||||
if(enbflag == GTPV1U_SOURCE_ENB) {
|
||||
hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, req_pP->rnti, (void **)>pv1u_ue_data_p);
|
||||
|
||||
if (hash_rc == HASH_TABLE_OK) {
|
||||
for (erab_index = 0; erab_index < ue_context_p->ue_context.nb_x2u_e_rabs; erab_index++) {
|
||||
eps_bearer_id = ue_context_p->ue_context.enb_gtp_x2u_ebi[erab_index];
|
||||
LOG_I(GTPU, "gtpv1u_delete_x2u_tunnel user rnti %x teNB X2U teid %u eps bearer id %u\n",
|
||||
req_pP->rnti,
|
||||
gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_teNB,
|
||||
ue_context_p->ue_context.enb_gtp_x2u_ebi[erab_index]);
|
||||
|
||||
req_pP->rnti,
|
||||
gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_teNB,
|
||||
ue_context_p->ue_context.enb_gtp_x2u_ebi[erab_index]);
|
||||
gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_teNB = 0;
|
||||
gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].tenb_ip_addr = 0;
|
||||
//gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].tenb_ip6_addr = 0;
|
||||
}
|
||||
|
||||
ue_context_p->ue_context.nb_x2u_e_rabs = 0;
|
||||
}
|
||||
}
|
||||
/* in the target enb */
|
||||
else{
|
||||
else {
|
||||
for (erab_index = 0; erab_index < ue_context_p->ue_context.nb_x2u_e_rabs; erab_index++) {
|
||||
//-----------------------
|
||||
// GTPV1U->PDCP mapping
|
||||
@@ -877,9 +856,11 @@ int gtpv1u_delete_x2u_tunnel(
|
||||
LOG_D(GTPU, "Removed user rnti %x , enb X2U teid %u not found\n", req_pP->rnti, ue_context_p->ue_context.enb_gtp_x2u_teid[erab_index]);
|
||||
}
|
||||
}
|
||||
|
||||
ue_context_p->ue_context.nb_x2u_e_rabs = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -907,8 +888,6 @@ gtpv1u_create_s1u_tunnel(
|
||||
int addrs_length_in_bytes= 0;
|
||||
int loop_counter = 0;
|
||||
int ret = 0;
|
||||
|
||||
|
||||
MSC_LOG_RX_MESSAGE(
|
||||
MSC_GTPU_ENB,
|
||||
MSC_RRC_ENB,
|
||||
@@ -940,6 +919,7 @@ gtpv1u_create_s1u_tunnel(
|
||||
LOG_D(GTPU, ".\n");
|
||||
loop_counter++;
|
||||
} while (rc != NW_GTPV1U_OK && loop_counter < 10);
|
||||
|
||||
if ( rc != NW_GTPV1U_OK && loop_counter == 10 ) {
|
||||
LOG_E(GTPU,"NwGtpv1uCreateTunnelEndPoint failed 10 times,start next loop\n");
|
||||
ret = -1;
|
||||
@@ -1058,13 +1038,14 @@ int gtpv1u_update_s1u_tunnel(
|
||||
memcpy(gtpv1u_ue_data_new_p,gtpv1u_ue_data_p,sizeof(gtpv1u_ue_data_t));
|
||||
gtpv1u_ue_data_new_p->ue_id = create_tunnel_req_pP->rnti;
|
||||
hash_rc = hashtable_insert(RC.gtpv1u_data_g->ue_mapping, create_tunnel_req_pP->rnti, gtpv1u_ue_data_new_p);
|
||||
|
||||
//AssertFatal(hash_rc == HASH_TABLE_OK, "Error inserting ue_mapping in GTPV1U hashtable");
|
||||
if ( hash_rc != HASH_TABLE_OK ) {
|
||||
LOG_E(GTPU,"Failed to insert ue_mapping(rnti=%x) in GTPV1U hashtable\n",create_tunnel_req_pP->rnti);
|
||||
return -1;
|
||||
} else {
|
||||
LOG_I(GTPU, "inserting ue_mapping(rnti=%x) in GTPV1U hashtable\n",
|
||||
create_tunnel_req_pP->rnti);
|
||||
LOG_I(GTPU, "inserting ue_mapping(rnti=%x) in GTPV1U hashtable\n",
|
||||
create_tunnel_req_pP->rnti);
|
||||
}
|
||||
|
||||
hash_rc = hashtable_remove(RC.gtpv1u_data_g->ue_mapping, prior_rnti);
|
||||
@@ -1234,6 +1215,7 @@ int gtpv1u_eNB_init(void) {
|
||||
*/
|
||||
ulp.ulpReqCallback = gtpv1u_eNB_process_stack_req;
|
||||
memset((void *)&(ulp.hUlp), 0, sizeof(NwGtpv1uUlpHandleT));
|
||||
|
||||
if ((rc = nwGtpv1uSetUlpEntity(RC.gtpv1u_data_g->gtpv1u_stack, &ulp)) != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uSetUlpEntity: %x", rc);
|
||||
return -1;
|
||||
@@ -1244,6 +1226,7 @@ int gtpv1u_eNB_init(void) {
|
||||
*/
|
||||
udp.udpDataReqCallback = gtpv1u_eNB_send_udp_msg;
|
||||
memset((void *)&(udp.hUdp), 0, sizeof(NwGtpv1uUdpHandleT));
|
||||
|
||||
if ((rc = nwGtpv1uSetUdpEntity(RC.gtpv1u_data_g->gtpv1u_stack, &udp)) != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uSetUdpEntity: %x", rc);
|
||||
return -1;
|
||||
@@ -1251,6 +1234,7 @@ int gtpv1u_eNB_init(void) {
|
||||
|
||||
log.logReqCallback = gtpv1u_eNB_log_request;
|
||||
memset((void *)&(log.logMgrHandle), 0, sizeof(NwGtpv1uLogMgrHandleT));
|
||||
|
||||
if ((rc = nwGtpv1uSetLogMgrEntity(RC.gtpv1u_data_g->gtpv1u_stack, &log)) != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uSetLogMgrEntity: %x", rc);
|
||||
return -1;
|
||||
@@ -1395,169 +1379,159 @@ void *gtpv1u_eNB_process_itti_msg(void *notUsed) {
|
||||
break;
|
||||
|
||||
case GTPV1U_ENB_DATA_FORWARDING_REQ: {
|
||||
gtpv1u_enb_data_forwarding_req_t *data_req_p = NULL;
|
||||
NwGtpv1uUlpApiT stack_req;
|
||||
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
||||
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
|
||||
gtpv1u_ue_data_t *gtpv1u_ue_data_p = NULL;
|
||||
teid_t enb_s1u_teid = 0;
|
||||
teid_t tenb_x2u_teid = 0;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_PROCESS_TUNNEL_DATA_REQ, VCD_FUNCTION_IN);
|
||||
data_req_p = >PV1U_ENB_DATA_FORWARDING_REQ(received_message_p);
|
||||
//ipv4_send_data(ipv4_data_p->sd, data_ind_p->buffer, data_ind_p->length);
|
||||
|
||||
gtpv1u_enb_data_forwarding_req_t *data_req_p = NULL;
|
||||
NwGtpv1uUlpApiT stack_req;
|
||||
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
||||
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
|
||||
gtpv1u_ue_data_t *gtpv1u_ue_data_p = NULL;
|
||||
teid_t enb_s1u_teid = 0;
|
||||
teid_t tenb_x2u_teid = 0;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_PROCESS_TUNNEL_DATA_REQ, VCD_FUNCTION_IN);
|
||||
data_req_p = >PV1U_ENB_DATA_FORWARDING_REQ(received_message_p);
|
||||
//ipv4_send_data(ipv4_data_p->sd, data_ind_p->buffer, data_ind_p->length);
|
||||
#if defined(GTP_DUMP_SOCKET) && GTP_DUMP_SOCKET > 0
|
||||
gtpv1u_eNB_write_dump_socket(&data_req_p->buffer[data_req_p->offset],data_req_p->length);
|
||||
gtpv1u_eNB_write_dump_socket(&data_req_p->buffer[data_req_p->offset],data_req_p->length);
|
||||
#endif
|
||||
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
||||
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
||||
hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, (uint64_t)data_req_p->rnti, (void **)>pv1u_ue_data_p);
|
||||
|
||||
hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, (uint64_t)data_req_p->rnti, (void**)>pv1u_ue_data_p);
|
||||
|
||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: while getting ue rnti %x in hashtable ue_mapping\n", data_req_p->rnti);
|
||||
} else {
|
||||
if ((data_req_p->rab_id >= GTPV1U_BEARER_OFFSET) && (data_req_p->rab_id <= max_val_LTE_DRB_Identity)) {
|
||||
enb_s1u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_eNB;
|
||||
tenb_x2u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_teNB; // target enb teid
|
||||
stack_req.apiType = NW_GTPV1U_ULP_API_SEND_TPDU;
|
||||
stack_req.apiInfo.sendtoInfo.teid = tenb_x2u_teid;
|
||||
stack_req.apiInfo.sendtoInfo.ipAddr = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].tenb_ip_addr;// target enb ip
|
||||
|
||||
rc = nwGtpv1uGpduMsgNew(
|
||||
RC.gtpv1u_data_g->gtpv1u_stack,
|
||||
tenb_x2u_teid,
|
||||
NW_FALSE,
|
||||
RC.gtpv1u_data_g->seq_num++,
|
||||
data_req_p->buffer,
|
||||
data_req_p->length,
|
||||
data_req_p->offset,
|
||||
&(stack_req.apiInfo.sendtoInfo.hMsg));
|
||||
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uGpduMsgNew failed: 0x%x\n", rc);
|
||||
MSC_LOG_EVENT(MSC_GTPU_ENB,"0 Failed send G-PDU ltid %u rtid %u size %u",
|
||||
enb_s1u_teid,tenb_x2u_teid,data_req_p->length);
|
||||
(void)enb_s1u_teid; /* avoid gcc warning "set but not used" */
|
||||
} else {
|
||||
rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req);
|
||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: while getting ue rnti %x in hashtable ue_mapping\n", data_req_p->rnti);
|
||||
} else {
|
||||
if ((data_req_p->rab_id >= GTPV1U_BEARER_OFFSET) && (data_req_p->rab_id <= max_val_LTE_DRB_Identity)) {
|
||||
enb_s1u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_eNB;
|
||||
tenb_x2u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_teNB; // target enb teid
|
||||
stack_req.apiType = NW_GTPV1U_ULP_API_SEND_TPDU;
|
||||
stack_req.apiInfo.sendtoInfo.teid = tenb_x2u_teid;
|
||||
stack_req.apiInfo.sendtoInfo.ipAddr = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].tenb_ip_addr;// target enb ip
|
||||
rc = nwGtpv1uGpduMsgNew(
|
||||
RC.gtpv1u_data_g->gtpv1u_stack,
|
||||
tenb_x2u_teid,
|
||||
NW_FALSE,
|
||||
RC.gtpv1u_data_g->seq_num++,
|
||||
data_req_p->buffer,
|
||||
data_req_p->length,
|
||||
data_req_p->offset,
|
||||
&(stack_req.apiInfo.sendtoInfo.hMsg));
|
||||
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: 0x%x\n", rc);
|
||||
LOG_E(GTPU, "nwGtpv1uGpduMsgNew failed: 0x%x\n", rc);
|
||||
MSC_LOG_EVENT(MSC_GTPU_ENB,"0 Failed send G-PDU ltid %u rtid %u size %u",
|
||||
enb_s1u_teid,tenb_x2u_teid,data_req_p->length);
|
||||
enb_s1u_teid,tenb_x2u_teid,data_req_p->length);
|
||||
(void)enb_s1u_teid; /* avoid gcc warning "set but not used" */
|
||||
} else {
|
||||
MSC_LOG_TX_MESSAGE(
|
||||
MSC_GTPU_ENB,
|
||||
MSC_GTPU_SGW,
|
||||
NULL,
|
||||
0,
|
||||
MSC_AS_TIME_FMT" G-PDU ltid %u rtid %u size %u",
|
||||
0,0,
|
||||
enb_s1u_teid,
|
||||
tenb_x2u_teid,
|
||||
data_req_p->length);
|
||||
rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req);
|
||||
|
||||
}
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: 0x%x\n", rc);
|
||||
MSC_LOG_EVENT(MSC_GTPU_ENB,"0 Failed send G-PDU ltid %u rtid %u size %u",
|
||||
enb_s1u_teid,tenb_x2u_teid,data_req_p->length);
|
||||
} else {
|
||||
MSC_LOG_TX_MESSAGE(
|
||||
MSC_GTPU_ENB,
|
||||
MSC_GTPU_SGW,
|
||||
NULL,
|
||||
0,
|
||||
MSC_AS_TIME_FMT" G-PDU ltid %u rtid %u size %u",
|
||||
0,0,
|
||||
enb_s1u_teid,
|
||||
tenb_x2u_teid,
|
||||
data_req_p->length);
|
||||
}
|
||||
|
||||
rc = nwGtpv1uMsgDelete(RC.gtpv1u_data_g->gtpv1u_stack,
|
||||
stack_req.apiInfo.sendtoInfo.hMsg);
|
||||
rc = nwGtpv1uMsgDelete(RC.gtpv1u_data_g->gtpv1u_stack,
|
||||
stack_req.apiInfo.sendtoInfo.hMsg);
|
||||
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uMsgDelete failed: 0x%x\n", rc);
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uMsgDelete failed: 0x%x\n", rc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_PROCESS_TUNNEL_DATA_REQ, VCD_FUNCTION_OUT);
|
||||
/* Buffer still needed, do not free it */
|
||||
//itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), data_req_p->buffer)
|
||||
}
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_PROCESS_TUNNEL_DATA_REQ, VCD_FUNCTION_OUT);
|
||||
/* Buffer still needed, do not free it */
|
||||
//itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), data_req_p->buffer)
|
||||
}
|
||||
break;
|
||||
|
||||
case GTPV1U_ENB_END_MARKER_REQ:{
|
||||
gtpv1u_enb_end_marker_req_t *data_req_p = NULL;
|
||||
NwGtpv1uUlpApiT stack_req;
|
||||
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
||||
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
|
||||
gtpv1u_ue_data_t *gtpv1u_ue_data_p = NULL;
|
||||
teid_t enb_s1u_teid = 0;
|
||||
teid_t tenb_x2u_teid = 0;
|
||||
NwGtpv1uMsgT *pMsg = NULL;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_PROCESS_TUNNEL_DATA_REQ, VCD_FUNCTION_IN);
|
||||
data_req_p = >PV1U_ENB_END_MARKER_REQ(received_message_p);
|
||||
//ipv4_send_data(ipv4_data_p->sd, data_ind_p->buffer, data_ind_p->length);
|
||||
break;
|
||||
|
||||
case GTPV1U_ENB_END_MARKER_REQ: {
|
||||
gtpv1u_enb_end_marker_req_t *data_req_p = NULL;
|
||||
NwGtpv1uUlpApiT stack_req;
|
||||
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
||||
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
|
||||
gtpv1u_ue_data_t *gtpv1u_ue_data_p = NULL;
|
||||
teid_t enb_s1u_teid = 0;
|
||||
teid_t tenb_x2u_teid = 0;
|
||||
NwGtpv1uMsgT *pMsg = NULL;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_PROCESS_TUNNEL_DATA_REQ, VCD_FUNCTION_IN);
|
||||
data_req_p = >PV1U_ENB_END_MARKER_REQ(received_message_p);
|
||||
//ipv4_send_data(ipv4_data_p->sd, data_ind_p->buffer, data_ind_p->length);
|
||||
#if defined(GTP_DUMP_SOCKET) && GTP_DUMP_SOCKET > 0
|
||||
gtpv1u_eNB_write_dump_socket(&data_req_p->buffer[data_req_p->offset],data_req_p->length);
|
||||
gtpv1u_eNB_write_dump_socket(&data_req_p->buffer[data_req_p->offset],data_req_p->length);
|
||||
#endif
|
||||
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
||||
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
||||
hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, (uint64_t)data_req_p->rnti, (void **)>pv1u_ue_data_p);
|
||||
|
||||
hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, (uint64_t)data_req_p->rnti, (void**)>pv1u_ue_data_p);
|
||||
|
||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: while getting ue rnti %x in hashtable ue_mapping\n", data_req_p->rnti);
|
||||
} else {
|
||||
if ((data_req_p->rab_id >= GTPV1U_BEARER_OFFSET) && (data_req_p->rab_id <= max_val_LTE_DRB_Identity)) {
|
||||
enb_s1u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_eNB;
|
||||
tenb_x2u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_teNB; // target enb teid
|
||||
stack_req.apiType = NW_GTPV1U_ULP_API_SEND_TPDU;
|
||||
stack_req.apiInfo.sendtoInfo.teid = tenb_x2u_teid;
|
||||
stack_req.apiInfo.sendtoInfo.ipAddr = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].tenb_ip_addr;// target enb ip
|
||||
|
||||
rc = nwGtpv1uGpduMsgNew(
|
||||
RC.gtpv1u_data_g->gtpv1u_stack,
|
||||
tenb_x2u_teid,
|
||||
NW_FALSE,
|
||||
RC.gtpv1u_data_g->seq_num++,
|
||||
data_req_p->buffer,
|
||||
data_req_p->length,
|
||||
data_req_p->offset,
|
||||
&(stack_req.apiInfo.sendtoInfo.hMsg));
|
||||
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uGpduMsgNew failed: 0x%x\n", rc);
|
||||
MSC_LOG_EVENT(MSC_GTPU_ENB,"0 Failed send G-PDU ltid %u rtid %u size %u",
|
||||
enb_s1u_teid,tenb_x2u_teid,data_req_p->length);
|
||||
(void)enb_s1u_teid; /* avoid gcc warning "set but not used" */
|
||||
} else {
|
||||
pMsg = (NwGtpv1uMsgT *) stack_req.apiInfo.sendtoInfo.hMsg;
|
||||
pMsg->msgType = NW_GTP_END_MARKER;
|
||||
rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req);
|
||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: while getting ue rnti %x in hashtable ue_mapping\n", data_req_p->rnti);
|
||||
} else {
|
||||
if ((data_req_p->rab_id >= GTPV1U_BEARER_OFFSET) && (data_req_p->rab_id <= max_val_LTE_DRB_Identity)) {
|
||||
enb_s1u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_eNB;
|
||||
tenb_x2u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_teNB; // target enb teid
|
||||
stack_req.apiType = NW_GTPV1U_ULP_API_SEND_TPDU;
|
||||
stack_req.apiInfo.sendtoInfo.teid = tenb_x2u_teid;
|
||||
stack_req.apiInfo.sendtoInfo.ipAddr = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].tenb_ip_addr;// target enb ip
|
||||
rc = nwGtpv1uGpduMsgNew(
|
||||
RC.gtpv1u_data_g->gtpv1u_stack,
|
||||
tenb_x2u_teid,
|
||||
NW_FALSE,
|
||||
RC.gtpv1u_data_g->seq_num++,
|
||||
data_req_p->buffer,
|
||||
data_req_p->length,
|
||||
data_req_p->offset,
|
||||
&(stack_req.apiInfo.sendtoInfo.hMsg));
|
||||
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: 0x%x\n", rc);
|
||||
LOG_E(GTPU, "nwGtpv1uGpduMsgNew failed: 0x%x\n", rc);
|
||||
MSC_LOG_EVENT(MSC_GTPU_ENB,"0 Failed send G-PDU ltid %u rtid %u size %u",
|
||||
enb_s1u_teid,tenb_x2u_teid,data_req_p->length);
|
||||
enb_s1u_teid,tenb_x2u_teid,data_req_p->length);
|
||||
(void)enb_s1u_teid; /* avoid gcc warning "set but not used" */
|
||||
} else {
|
||||
MSC_LOG_TX_MESSAGE(
|
||||
MSC_GTPU_ENB,
|
||||
MSC_GTPU_SGW,
|
||||
NULL,
|
||||
0,
|
||||
MSC_AS_TIME_FMT" G-PDU ltid %u rtid %u size %u",
|
||||
0,0,
|
||||
enb_s1u_teid,
|
||||
tenb_x2u_teid,
|
||||
data_req_p->length);
|
||||
pMsg = (NwGtpv1uMsgT *) stack_req.apiInfo.sendtoInfo.hMsg;
|
||||
pMsg->msgType = NW_GTP_END_MARKER;
|
||||
rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req);
|
||||
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: 0x%x\n", rc);
|
||||
MSC_LOG_EVENT(MSC_GTPU_ENB,"0 Failed send G-PDU ltid %u rtid %u size %u",
|
||||
enb_s1u_teid,tenb_x2u_teid,data_req_p->length);
|
||||
} else {
|
||||
MSC_LOG_TX_MESSAGE(
|
||||
MSC_GTPU_ENB,
|
||||
MSC_GTPU_SGW,
|
||||
NULL,
|
||||
0,
|
||||
MSC_AS_TIME_FMT" G-PDU ltid %u rtid %u size %u",
|
||||
0,0,
|
||||
enb_s1u_teid,
|
||||
tenb_x2u_teid,
|
||||
data_req_p->length);
|
||||
}
|
||||
|
||||
rc = nwGtpv1uMsgDelete(RC.gtpv1u_data_g->gtpv1u_stack,
|
||||
stack_req.apiInfo.sendtoInfo.hMsg);
|
||||
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uMsgDelete failed: 0x%x\n", rc);
|
||||
}
|
||||
|
||||
gtpv1u_enb_delete_tunnel_req_t delete_tunnel_req;
|
||||
memset(&delete_tunnel_req, 0, sizeof(delete_tunnel_req));
|
||||
delete_tunnel_req.rnti = data_req_p->rnti;
|
||||
gtpv1u_delete_x2u_tunnel(instance, &delete_tunnel_req, GTPV1U_SOURCE_ENB);
|
||||
}
|
||||
|
||||
rc = nwGtpv1uMsgDelete(RC.gtpv1u_data_g->gtpv1u_stack,
|
||||
stack_req.apiInfo.sendtoInfo.hMsg);
|
||||
|
||||
if (rc != NW_GTPV1U_OK) {
|
||||
LOG_E(GTPU, "nwGtpv1uMsgDelete failed: 0x%x\n", rc);
|
||||
}
|
||||
|
||||
gtpv1u_enb_delete_tunnel_req_t delete_tunnel_req;
|
||||
memset(&delete_tunnel_req, 0 , sizeof(delete_tunnel_req));
|
||||
delete_tunnel_req.rnti = data_req_p->rnti;
|
||||
gtpv1u_delete_x2u_tunnel(instance, &delete_tunnel_req, GTPV1U_SOURCE_ENB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_PROCESS_TUNNEL_DATA_REQ, VCD_FUNCTION_OUT);
|
||||
|
||||
@@ -492,39 +492,6 @@ static int s1ap_eNB_generate_s1_setup_request(
|
||||
ie->value.choice.PagingDRX = instance_p->default_drx;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_S1SetupRequestIEs_t *)calloc(1, sizeof(S1AP_S1SetupRequestIEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_CSG_IdList;
|
||||
ie->criticality = S1AP_Criticality_reject;
|
||||
ie->value.present = S1AP_S1SetupRequestIEs__value_PR_CSG_IdList;
|
||||
// ie->value.choice.CSG_IdList = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(13, 0, 0))
|
||||
|
||||
if (0) {
|
||||
ie = (S1AP_S1SetupRequestIEs_t *)calloc(1, sizeof(S1AP_S1SetupRequestIEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_UE_RetentionInformation;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_S1SetupRequestIEs__value_PR_UE_RetentionInformation;
|
||||
// ie->value.choice.UE_RetentionInformation = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_S1SetupRequestIEs_t *)calloc(1, sizeof(S1AP_S1SetupRequestIEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_NB_IoT_DefaultPagingDRX;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_S1SetupRequestIEs__value_PR_NB_IoT_DefaultPagingDRX;
|
||||
// ie->value.choice.NB_IoT_DefaultPagingDRX = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(14, 0, 0)) */
|
||||
|
||||
if (s1ap_eNB_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||
S1AP_ERROR("Failed to encode S1 setup request\n");
|
||||
|
||||
@@ -104,46 +104,6 @@ int s1ap_ue_context_release_complete(instance_t instance,
|
||||
ie->value.choice.ENB_UE_S1AP_ID = ue_release_complete_p->eNB_ue_s1ap_id;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_UEContextReleaseComplete_IEs_t *)calloc(1, sizeof(S1AP_UEContextReleaseComplete_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_UEContextReleaseComplete_IEs__value_PR_CriticalityDiagnostics;
|
||||
// ie->value.choice.CriticalityDiagnostics = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* release 12, optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(12, 0, 0))
|
||||
if (0) {
|
||||
ie = (S1AP_UEContextReleaseComplete_IEs_t *)calloc(1, sizeof(S1AP_UEContextReleaseComplete_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_UserLocationInformation;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_UEContextReleaseComplete_IEs__value_PR_UserLocationInformation;
|
||||
// ie->value.choice.UserLocationInformation = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* release 13, optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(13, 0, 0))
|
||||
if (0) {
|
||||
ie = (S1AP_UEContextReleaseComplete_IEs_t *)calloc(1, sizeof(S1AP_UEContextReleaseComplete_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_InformationOnRecommendedCellsAndENBsForPaging;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_UEContextReleaseComplete_IEs__value_PR_InformationOnRecommendedCellsAndENBsForPaging;
|
||||
// ie->value.choice.InformationOnRecommendedCellsAndENBsForPaging = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
|
||||
ie = (S1AP_UEContextReleaseComplete_IEs_t *)calloc(1, sizeof(S1AP_UEContextReleaseComplete_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_CellIdentifierAndCELevelForCECapableUEs;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_UEContextReleaseComplete_IEs__value_PR_CellIdentifierAndCELevelForCECapableUEs;
|
||||
// ie->value.choice.CellIdentifierAndCELevelForCECapableUEs = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(13, 0, 0)) */
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(12, 0, 0)) */
|
||||
|
||||
if (s1ap_eNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
/* Encode procedure has failed... */
|
||||
@@ -278,17 +238,7 @@ int s1ap_ue_context_release_req(instance_t instance,
|
||||
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
|
||||
/* optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||
if (0) {
|
||||
ie = (S1AP_UEContextReleaseRequest_IEs_t *)calloc(1, sizeof(S1AP_UEContextReleaseRequest_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_GWContextReleaseIndication;
|
||||
ie->criticality = S1AP_Criticality_reject;
|
||||
ie->value.present = S1AP_UEContextReleaseRequest_IEs__value_PR_GWContextReleaseIndication;
|
||||
ie->value.choice.GWContextReleaseIndication = TRUE;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(10, 0, 0)) */
|
||||
|
||||
|
||||
if (s1ap_eNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
/* Encode procedure has failed... */
|
||||
|
||||
@@ -149,13 +149,11 @@ s1ap_message_decoded_callback messages_callback[][3] = {
|
||||
{ 0, 0, 0 }, /* eNBConfigurationTransfer */
|
||||
{ 0, 0, 0 }, /* MMEConfigurationTransfer */
|
||||
{ 0, 0, 0 }, /* CellTrafficTrace */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
{ 0, 0, 0 }, /* Kill */
|
||||
{ 0, 0, 0 }, /* DownlinkUEAssociatedLPPaTransport */
|
||||
{ 0, 0, 0 }, /* UplinkUEAssociatedLPPaTransport */
|
||||
{ 0, 0, 0 }, /* DownlinkNonUEAssociatedLPPaTransport */
|
||||
{ 0, 0, 0 }, /* UplinkNonUEAssociatedLPPaTransport */
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(9, 0, 0)) */
|
||||
};
|
||||
char *s1ap_direction2String(int s1ap_dir) {
|
||||
static char *s1ap_direction_String[] = {
|
||||
@@ -592,12 +590,9 @@ int s1ap_eNB_handle_error_indication(uint32_t assoc_id,
|
||||
case S1AP_CauseRadioNetwork_not_supported_QCI_value:
|
||||
S1AP_WARN("Received S1 Error indication S1AP_CauseRadioNetwork_not_supported_QCI_value\n");
|
||||
break;
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
|
||||
case S1AP_CauseRadioNetwork_invalid_CSG_Id:
|
||||
S1AP_WARN("Received S1 Error indication S1AP_CauseRadioNetwork_invals1ap_id_CSG_Id\n");
|
||||
break;
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(9, 0, 0)) */
|
||||
|
||||
default:
|
||||
S1AP_WARN("Received S1 Error indication cause radio network case not handled\n");
|
||||
@@ -638,12 +633,9 @@ int s1ap_eNB_handle_error_indication(uint32_t assoc_id,
|
||||
case S1AP_CauseNas_unspecified:
|
||||
S1AP_WARN("Received S1 Error indication S1AP_CauseNas_unspecified\n");
|
||||
break;
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
|
||||
case S1AP_CauseNas_csg_subscription_expiry:
|
||||
S1AP_WARN("Received S1 Error indication S1AP_CauseNas_csg_subscription_expiry\n");
|
||||
break;
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(9, 0, 0)) */
|
||||
|
||||
default:
|
||||
S1AP_WARN("Received S1 Error indication cause nas case not handled\n");
|
||||
|
||||
@@ -262,15 +262,6 @@ int s1ap_eNB_handle_nas_first_req(
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_CSG_Id;
|
||||
ie->criticality = S1AP_Criticality_reject;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_CSG_Id;
|
||||
// ie->value.choice.CSG_Id = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (s1ap_nas_first_req_p->ue_identity.presenceMask & UE_IDENTITIES_gummei) {
|
||||
@@ -291,141 +282,7 @@ int s1ap_eNB_handle_nas_first_req(
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_CellAccessMode;
|
||||
ie->criticality = S1AP_Criticality_reject;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_CellAccessMode;
|
||||
// ie->value.choice.CellAccessMode = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_GW_TransportLayerAddress;
|
||||
ie->criticality = S1AP_Criticality_reject;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_TransportLayerAddress;
|
||||
// ie->value.choice.TransportLayerAddress =;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_RelayNode_Indicator;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_RelayNode_Indicator;
|
||||
// ie->value.choice.RelayNode_Indicator =;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(11, 0, 0))
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_GUMMEIType;
|
||||
ie->criticality = S1AP_Criticality_reject;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_GUMMEIType;
|
||||
// ie->value.choice.GUMMEIType =;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */ /* release 11 */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_Tunnel_Information_for_BBF;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_TunnelInformation;
|
||||
// ie->value.choice.TunnelInformation =;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_SIPTO_L_GW_TransportLayerAddress;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_TransportLayerAddress;
|
||||
// ie->value.choice.TransportLayerAddress = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_LHN_ID;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_LHN_ID;
|
||||
// ie->value.choice.LHN_ID = ue_release_req_p->eNB_ue_s1ap_id;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(13, 0, 0))
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_MME_Group_ID;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_MME_Group_ID;
|
||||
// ie->value.choice.MME_Group_ID =;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_UE_Usage_Type;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_UE_Usage_Type;
|
||||
// ie->value.choice.UE_Usage_Type =;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_CE_mode_B_SupportIndicator;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_CE_mode_B_SupportIndicator;
|
||||
// ie->value.choice.CE_mode_B_SupportIndicator = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_DCN_ID;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_DCN_ID;
|
||||
// ie->value.choice.DCN_ID = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_InitialUEMessage_IEs_t *)calloc(1, sizeof(S1AP_InitialUEMessage_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_Coverage_Level;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_InitialUEMessage_IEs__value_PR_Coverage_Level;
|
||||
// ie->value.choice.Coverage_Level = ue_release_req_p->eNB_ue_s1ap_id;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(14, 0, 0)) */
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(13, 0, 0)) */
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(11, 0, 0)) */
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(10, 0, 0)) */
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(9, 0, 0)) */
|
||||
|
||||
if (s1ap_eNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
/* Failed to encode message */
|
||||
@@ -659,41 +516,7 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_
|
||||
TAC_TO_ASN1(s1ap_eNB_instance_p->tac, &ie->value.choice.TAI.tAC);
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
/* optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||
|
||||
if (0) {
|
||||
ie = (S1AP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(S1AP_UplinkNASTransport_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_GW_TransportLayerAddress;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_UplinkNASTransport_IEs__value_PR_TransportLayerAddress;
|
||||
// ie->value.choice.TransportLayerAddress = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
|
||||
if (0) {
|
||||
ie = (S1AP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(S1AP_UplinkNASTransport_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_SIPTO_L_GW_TransportLayerAddress;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_UplinkNASTransport_IEs__value_PR_TransportLayerAddress;
|
||||
// ie->value.choice.TransportLayerAddress = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(S1AP_UplinkNASTransport_IEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_LHN_ID;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_UplinkNASTransport_IEs__value_PR_LHN_ID;
|
||||
// ie->value.choice.LHN_ID =;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(14, 0, 0)) */
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(10, 0, 0)) */
|
||||
|
||||
if (s1ap_eNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
S1AP_ERROR("Failed to encode uplink NAS transport\n");
|
||||
@@ -1049,18 +872,6 @@ int s1ap_eNB_ue_capabilities(instance_t instance,
|
||||
ie->value.choice.UERadioCapability.size = ue_cap_info_ind_p->ue_radio_cap.length;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
/* optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(12, 0, 0))
|
||||
|
||||
if (0) {
|
||||
ie = (S1AP_UECapabilityInfoIndicationIEs_t *)calloc(1, sizeof(S1AP_UECapabilityInfoIndicationIEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_UERadioCapabilityForPaging;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_UECapabilityInfoIndicationIEs__value_PR_UERadioCapabilityForPaging;
|
||||
// ie->value.choice.UERadioCapabilityForPaging = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(14, 0, 0)) */
|
||||
|
||||
if (s1ap_eNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
/* Encode procedure has failed... */
|
||||
@@ -1547,30 +1358,7 @@ int s1ap_eNB_e_rab_release_resp(instance_t instance,
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (0) {
|
||||
ie = (S1AP_E_RABReleaseResponseIEs_t *)calloc(1, sizeof(S1AP_E_RABReleaseResponseIEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_E_RABReleaseResponseIEs__value_PR_CriticalityDiagnostics;
|
||||
// ie->value.choice.CriticalityDiagnostics = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
#if (S1AP_VERSION >= MAKE_VERSION(12, 0, 0))
|
||||
|
||||
if(0) {
|
||||
ie = (S1AP_E_RABReleaseResponseIEs_t *)calloc(1, sizeof(S1AP_E_RABReleaseResponseIEs_t));
|
||||
ie->id = S1AP_ProtocolIE_ID_id_UserLocationInformation;
|
||||
ie->criticality = S1AP_Criticality_ignore;
|
||||
ie->value.present = S1AP_E_RABReleaseResponseIEs__value_PR_UserLocationInformation;
|
||||
// ie->value.choice.UserLocationInformation = ;
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
#endif /* #if (S1AP_VERSION >= MAKE_VERSION(14, 0, 0)) */
|
||||
fprintf(stderr, "start encode\n");
|
||||
|
||||
if (s1ap_eNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
S1AP_ERROR("Failed to encode release response\n");
|
||||
|
||||
Reference in New Issue
Block a user