PUBLIC VOID procGtpcMsg(UdpData_t *data) { LOG_ENTERFN(); UeSession *ueSsn = NULL; U8 *gtpMsgBuf = NULL; GtpMsgType_t msgType = GTPC_MSG_TYPE_INVALID; gtpMsgBuf = data->buf.pVal; GTP_MSG_GET_TYPE(gtpMsgBuf, msgType); if (GTPC_MSG_CS_REQ == msgType || GTPC_MSG_FR_REQ == msgType) { U8 *imsiBuf = getImsiBufPtr(&data->buf); GtpImsiKey imsiKey; GTP_GET_IE_LEN(imsiBuf, imsiKey.len); MEMCPY(imsiKey.val, imsiBuf + GTP_IE_HDR_LEN, imsiKey.len); ueSsn = UeSession::getUeSession(imsiKey); if (NULL == ueSsn) { addPeerData(data->peerEp); ueSsn = UeSession::createUeSession(imsiKey); } } else { GtpTeid_t teid = 0; GTP_MSG_DEC_TEID(gtpMsgBuf, teid); if (0 != teid) { ueSsn = UeSession::getUeSession(teid); if (NULL == ueSsn) { LOG_ERROR("GTPC Message received with unknown TEID [%d]", teid); delete data; } else { ueSsn->resumeTask(); } } else { LOG_ERROR("Unhandled Incoming GTP Message"); delete data; } } if (NULL != ueSsn) { if (ROK != ueSsn->run(data)) { ueSsn->abort(); } } LOG_EXITVOID(); }
/** * @brief * Processes the keyboard input from user * * @param */ VOID Keyboard::processKey ( S32 kbInput ) { LOG_ENTERFN(); switch(kbInput) { case 'p': { LOG_DEBUG("Pausing Traffic"); key = KB_KEY_PAUSE_TRAFFIC; break; } case 'c': { LOG_DEBUG("Resuming Traffic"); key = KB_KEY_INVALID; break; } case 'q': { key = KB_KEY_SIM_QUIT; } default: { LOG_DEBUG("Invalid Keyboard Input"); } } LOG_EXITVOID(); }
VOID Keyboard::abort() { LOG_ENTERFN(); delete this; LOG_EXITVOID(); }
/** * @brief * allocates a new imsi incremented by one * * @return * imsi */ VOID GtpImsiGenerator::allocNew(GtpImsiKey *pImsi) { LOG_ENTERFN(); numericStrIncriment(m_imsiStr, m_len); pImsi->len = encodeImsi(m_imsiStr, m_len, pImsi->val); LOG_EXITVOID(); }
VOID decIeHdr(U8 *pBuf, GtpIeHdr *pHdr) { LOG_ENTERFN(); MEMSET((VOID *)pHdr, 0, sizeof(GtpIeHdr)); GTP_DEC_IE_TYPE(pBuf, pHdr->ieType); GTP_DEC_IE_LEN(pBuf, pHdr->len); GTP_DEC_IE_INSTANCE(pBuf, pHdr->instance); LOG_EXITVOID(); }
PUBLIC VOID deleteCTun(GtpcTun *pTun) { LOG_ENTERFN(); pTun->m_refCount--; if (pTun->m_refCount == 0) { LOG_DEBUG("Deleting GTP-C Tunnel, TEID [%d]", pTun->m_locTeid); s_gtpcTunMap.erase(pTun->m_locTeid); delete pTun; } LOG_EXITVOID(); }
/** * @brief * Handles keyboard event * * @param pSock */ PRIVATE VOID handleStdinSock ( GSimSocket *pSock ) { LOG_ENTERFN(); if (feof(stdin)) { delete pSock; } S32 input = getchar(); if (input == EOF) { LOG_EXITVOID(); } else { Keyboard::getInstance()->processKey(input); } LOG_EXITVOID(); }
/** * @brief encodes PLMN ID into buffer based on encoding PLMN ID encoding * in 23.003 * * @param pPlmnId * @param pBuf * * @return */ PUBLIC VOID gtpUtlEncPlmnId(GtpPlmnId_t *pPlmnId, U8* pBuf) { LOG_ENTERFN(); pBuf[0] = (pPlmnId->mcc[1] << 4) | pPlmnId->mcc[0]; if (pPlmnId->numMncDigits == 2) { pBuf[1] = (0xf0 | pPlmnId->mcc[2]); } else { pBuf[1] = ((pPlmnId->mnc[2] << 4) | pPlmnId->mcc[2]); } pBuf[2] = ((pPlmnId->mnc[1] << 4) | pPlmnId->mnc[0]); LOG_EXITVOID(); }
PUBLIC VOID numericStrIncriment(S8 *pStr, U32 len) { LOG_ENTERFN(); U32 d = 0; U32 carry = 1; for (S32 i = len - 1; i >= 0; i--) { d = GSIM_CHAR_TO_DIGIT(pStr[i]) + carry; if (d > 9) { pStr[i] = GSIM_DIGIT_TO_CHAR(d % 10); carry = 1; } else { pStr[i] = GSIM_DIGIT_TO_CHAR(d); carry = 0; } } LOG_EXITVOID(); }