int s1ap_mme_decode_pdu(s1ap_message *message, uint8_t *buffer, uint32_t len) { S1AP_PDU_t pdu; S1AP_PDU_t *pdu_p = &pdu; asn_dec_rval_t dec_ret; assert(buffer != NULL); memset((void *)pdu_p, 0, sizeof(S1AP_PDU_t)); dec_ret = aper_decode(NULL, &asn_DEF_S1AP_PDU, (void**)&pdu_p, buffer, len, 0, 0); if (dec_ret.code != RC_OK) return -1; message->direction = pdu_p->present; switch(pdu_p->present) { case S1AP_PDU_PR_initiatingMessage: return s1ap_mme_decode_initiating(message, &pdu_p->choice.initiatingMessage); case S1AP_PDU_PR_successfulOutcome: return s1ap_mme_decode_successfull_outcome(message, &pdu_p->choice.successfulOutcome); case S1AP_PDU_PR_unsuccessfulOutcome: return s1ap_mme_decode_unsuccessfull_outcome(message, &pdu_p->choice.unsuccessfulOutcome); default: S1AP_DEBUG("Unknown message outcome (%d) or not implemented", (int)pdu_p->present); break; } return -1; }
int hnbgw_ranap_rx(struct msgb *msg, uint8_t *data, size_t len) { RANAP_RANAP_PDU_t _pdu, *pdu = &_pdu; asn_dec_rval_t dec_ret; int rc; memset(pdu, 0, sizeof(*pdu)); dec_ret = aper_decode(NULL,&asn_DEF_RANAP_RANAP_PDU, (void **) &pdu, data, len, 0, 0); if (dec_ret.code != RC_OK) { LOGP(DRANAP, LOGL_ERROR, "Error in RANAP ASN.1 decode\n"); return rc; } rc = _hnbgw_ranap_rx(msg->dst, pdu); return rc; }
int s1ap_eNB_decode_pdu(s1ap_message *message, const uint8_t * const buffer, const uint32_t length) { S1AP_PDU_t pdu; S1AP_PDU_t *pdu_p = &pdu; asn_dec_rval_t dec_ret; DevAssert(buffer != NULL); memset((void *)pdu_p, 0, sizeof(S1AP_PDU_t)); dec_ret = aper_decode(NULL, &asn_DEF_S1AP_PDU, (void **)&pdu_p, buffer, length, 0, 0); if (dec_ret.code != RC_OK) { S1AP_ERROR("Failed to decode pdu\n"); return -1; } message->direction = pdu_p->present; switch(pdu_p->present) { case S1AP_PDU_PR_initiatingMessage: return s1ap_eNB_decode_initiating_message(message, &pdu_p->choice.initiatingMessage); case S1AP_PDU_PR_successfulOutcome: return s1ap_eNB_decode_successful_outcome(message, &pdu_p->choice.successfulOutcome); case S1AP_PDU_PR_unsuccessfulOutcome: return s1ap_eNB_decode_unsuccessful_outcome(message, &pdu_p->choice.unsuccessfulOutcome); default: S1AP_DEBUG("Unknown presence (%d) or not implemented\n", (int)pdu_p->present); break; } return -1; }
int hnbgw_rua_rx(struct hnb_context *hnb, struct msgb *msg) { RUA_RUA_PDU_t _pdu, *pdu = &_pdu; asn_dec_rval_t dec_ret; int rc; /* decode and handle to _hnbgw_hnbap_rx() */ memset(pdu, 0, sizeof(*pdu)); dec_ret = aper_decode(NULL, &asn_DEF_RUA_RUA_PDU, (void **) &pdu, msg->data, msgb_length(msg), 0, 0); if (dec_ret.code != RC_OK) { LOGP(DRUA, LOGL_ERROR, "Error in ASN.1 decode\n"); return rc; } rc = _hnbgw_rua_rx(msg, pdu); return rc; }