NwGtpv1uRcT nwMiniUlpProcessStackReqCallback (NwGtpv1uUlpHandleT hUlp, NwGtpv1uUlpApiT *pUlpApi) { NwMiniUlpEntityT* thiz; NW_ASSERT(pUlpApi != NULL); thiz = (NwMiniUlpEntityT*) hUlp; switch(pUlpApi->apiType) { case NW_GTPV1U_ULP_API_RECV_TPDU: { struct sockaddr_in peerAddr; NwS32T bytesSent; NwU8T dataBuf[4096]; NwU32T dataSize; NwU32T peerIpAddr = (inet_addr(thiz->peerIpStr)); NW_ASSERT( NW_GTPV1U_OK == nwGtpv1uMsgGetTpdu(pUlpApi->apiInfo.recvMsgInfo.hMsg, dataBuf, &dataSize) ); NW_LOG(NW_LOG_LEVEL_DEBG, "Received TPDU from gtpv1u stack %u!", pUlpApi->apiInfo.recvMsgInfo.teid); peerAddr.sin_family = AF_INET; peerAddr.sin_port = htons(pUlpApi->apiInfo.recvMsgInfo.teid); peerAddr.sin_addr.s_addr = (peerIpAddr); memset(peerAddr.sin_zero, '\0', sizeof (peerAddr.sin_zero)); bytesSent = sendto (thiz->hSocket, dataBuf, dataSize, 0, (struct sockaddr *) &peerAddr, sizeof(peerAddr)); if(bytesSent < 0) { NW_LOG(NW_LOG_LEVEL_ERRO, "%s", strerror(errno)); NW_ASSERT(0); } else { NW_LOG(NW_LOG_LEVEL_DEBG, "Sent %u bytes to peer %u.%u.%u.%u", dataSize, (peerIpAddr & 0x000000ff), (peerIpAddr & 0x0000ff00) >> 8, (peerIpAddr & 0x00ff0000) >> 16, (peerIpAddr & 0xff000000) >> 24); } NW_ASSERT(nwGtpv1uMsgDelete(thiz->hGtpv1uStack, (pUlpApi->apiInfo.recvMsgInfo.hMsg)) == NW_GTPV1U_OK); } break; default: NW_LOG(NW_LOG_LEVEL_WARN, "Received undefined UlpApi from gtpv1u stack!"); } return NW_GTPV1U_OK; }
/* Callback called when a gtpv1u message arrived on UDP interface */ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( NwGtpv1uUlpHandleT hUlp, NwGtpv1uUlpApiT *pUlpApi) { boolean_t result = FALSE; teid_t teid = 0; hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS; gtpv1u_teid_data_t *gtpv1u_teid_data_p = NULL; protocol_ctxt_t ctxt; switch(pUlpApi->apiType) { /* Here there are two type of messages handled: * - T-PDU * - END-MARKER */ case NW_GTPV1U_ULP_API_RECV_TPDU: { uint8_t buffer[4096]; uint32_t buffer_len; /* Nw-gptv1u stack has processed a PDU. we can schedule it to PDCP * for transmission. */ teid = pUlpApi->apiInfo.recvMsgInfo.teid; if (NW_GTPV1U_OK != nwGtpv1uMsgGetTpdu(pUlpApi->apiInfo.recvMsgInfo.hMsg, buffer, &buffer_len)) { LOG_E(GTPU, "Error while retrieving T-PDU"); } itti_free(TASK_UDP, ((NwGtpv1uMsgT*)pUlpApi->apiInfo.recvMsgInfo.hMsg)->msgBuf); #if defined(GTP_DUMP_SOCKET) && GTP_DUMP_SOCKET > 0 gtpv1u_eNB_write_dump_socket(buffer,buffer_len); #endif //----------------------- // GTPV1U->PDCP mapping //----------------------- hash_rc = hashtable_get(gtpv1u_data_g.teid_mapping, teid, (void**)>pv1u_teid_data_p); if (hash_rc == HASH_TABLE_OK) { #if defined(LOG_GTPU) && LOG_GTPU > 0 LOG_D(GTPU, "Received T-PDU from gtpv1u stack teid %u size %d -> enb module id %u ue module id %u rab id %u\n", teid, buffer_len, gtpv1u_teid_data_p->enb_id, gtpv1u_teid_data_p->ue_id, gtpv1u_teid_data_p->eps_bearer_id); #endif //#warning "LG eps bearer mapping to DRB id to do (offset -4)" PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, gtpv1u_teid_data_p->enb_id, ENB_FLAG_YES, gtpv1u_teid_data_p->ue_id, 0, 0,gtpv1u_teid_data_p->enb_id); MSC_LOG_TX_MESSAGE( MSC_GTPU_ENB, MSC_PDCP_ENB, NULL,0, MSC_AS_TIME_FMT" DATA-REQ rb %u size %u", 0,0, (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, buffer_len); result = pdcp_data_req( &ctxt, SRB_FLAG_NO, (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); if ( result == FALSE ) { if (ctxt.configured == FALSE ) LOG_W(GTPU, "PDCP data request failed, cause: RB is not configured!\n") ; else LOG_W(GTPU, "PDCP data request failed\n"); return NW_GTPV1U_FAILURE; } } else { LOG_W(GTPU, "Received T-PDU from gtpv1u stack teid %u unknown size %u", teid, buffer_len); } } break; default: { LOG_E(GTPU, "Received undefined UlpApi (%02x) from gtpv1u stack!\n", pUlpApi->apiType); } } // end of switch return NW_GTPV1U_OK; }