From: aa7133@att.com Date: Wed, 11 Dec 2019 12:11:26 +0000 (+0200) Subject: version 3.0.4 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F98%2F1998%2F1;p=ric-plt%2Fe2.git version 3.0.4 fix the length bug add testing (not yet produce the exe) Change-Id: Ie95299a9a19153384c37e941e4c3e9dcda9285ea Signed-off-by: aa7133@att.com --- diff --git a/RIC-E2-TERMINATION/TEST/T1/E2Builder.h b/RIC-E2-TERMINATION/TEST/T1/E2Builder.h index 11fa3f1..ea284a3 100644 --- a/RIC-E2-TERMINATION/TEST/T1/E2Builder.h +++ b/RIC-E2-TERMINATION/TEST/T1/E2Builder.h @@ -45,321 +45,465 @@ using namespace std; -class E2Builder { -public: - - static void checkAndPrint(asn_TYPE_descriptor_t *typeDescriptor, void *data, char *dataType, const char *function) { - char errbuf[128]; /* Buffer for error message */ - size_t errlen = sizeof(errbuf); /* Size of the buffer */ - if (asn_check_constraints(typeDescriptor, data, errbuf, &errlen) != 0) { - mdclog_write(MDCLOG_ERR, "%s Constraint validation failed: %s", dataType, errbuf); - } else if (mdclog_level_get() >= MDCLOG_DEBUG) { - mdclog_write(MDCLOG_DEBUG, "%s successes function %s", dataType, function); - } +#define printEntry(type, function) \ + if (mdclog_level_get() >= MDCLOG_DEBUG) { \ + mdclog_write(MDCLOG_DEBUG, "start Test %s , %s", type, function); \ } - static void buildInitiatingMessagePDU(E2AP_PDU_t &pdu, InitiatingMessage_t *initMsg) { - pdu.present = E2AP_PDU_PR_initiatingMessage; - pdu.choice.initiatingMessage = initMsg; - } - template - static void buildInitMsg(InitiatingMessage_t &initMsg, - InitiatingMessage__value_PR present, - ProcedureCode_t procedureCode, - Criticality_t criticality, - T *value) { - initMsg.value.present = present; - initMsg.procedureCode = procedureCode; - initMsg.criticality = criticality; - - switch (present) { - case InitiatingMessage__value_PR_RICsubscriptionRequest: { - memcpy(&initMsg.value.choice.RICsubscriptionRequest, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_RICsubscriptionDeleteRequest: { - memcpy(&initMsg.value.choice.RICsubscriptionDeleteRequest, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_RICserviceUpdate: { - memcpy(&initMsg.value.choice.RICserviceUpdate, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_RICcontrolRequest: { - memcpy(&initMsg.value.choice.RICcontrolRequest, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_X2SetupRequest: { - memcpy(&initMsg.value.choice.X2SetupRequest, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_ENDCX2SetupRequest: { - memcpy(&initMsg.value.choice.ENDCX2SetupRequest, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_ResourceStatusRequest: { - memcpy(&initMsg.value.choice.ResourceStatusRequest, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_ENBConfigurationUpdate: { - memcpy(&initMsg.value.choice.ENBConfigurationUpdate, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_ENDCConfigurationUpdate: { - memcpy(&initMsg.value.choice.ENDCConfigurationUpdate, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_ResetRequest: { - memcpy(&initMsg.value.choice.ResetRequest, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_RICindication: { - memcpy(&initMsg.value.choice.RICindication, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_RICserviceQuery: { - memcpy(&initMsg.value.choice.RICserviceQuery, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_LoadInformation: { - memcpy(&initMsg.value.choice.LoadInformation, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_GNBStatusIndication: { - memcpy(&initMsg.value.choice.GNBStatusIndication, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_ResourceStatusUpdate: { - memcpy(&initMsg.value.choice.ResourceStatusUpdate, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_ErrorIndication: { - memcpy(&initMsg.value.choice.ErrorIndication, value, sizeof(*value)); - break; - } - case InitiatingMessage__value_PR_NOTHING: - default : { - break; - } - } +static void checkAndPrint(asn_TYPE_descriptor_t *typeDescriptor, void *data, char *dataType, const char *function) { + char errbuf[128]; /* Buffer for error message */ + size_t errlen = sizeof(errbuf); /* Size of the buffer */ + if (asn_check_constraints(typeDescriptor, data, errbuf, &errlen) != 0) { + mdclog_write(MDCLOG_ERR, "%s Constraint validation failed: %s", dataType, errbuf); + } else if (mdclog_level_get() >= MDCLOG_DEBUG) { + mdclog_write(MDCLOG_DEBUG, "%s successes function %s", dataType, function); } +} - static void buildSuccsesfulMessagePDU(E2AP_PDU_t &pdu, SuccessfulOutcome_t *succMsg) { - pdu.present = E2AP_PDU_PR_successfulOutcome; - pdu.choice.successfulOutcome = succMsg; - } - template - static void buildSuccMsg(SuccessfulOutcome_t &succMsg, - SuccessfulOutcome__value_PR present, - ProcedureCode_t procedureCode, - Criticality_t criticality, - T *value) { - succMsg.value.present = present; - succMsg.procedureCode = procedureCode; - succMsg.criticality = criticality; - - switch (present) { - case SuccessfulOutcome__value_PR_RICsubscriptionResponse: { - memcpy(&succMsg.value.choice.RICsubscriptionResponse, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse: { - memcpy(&succMsg.value.choice.RICsubscriptionDeleteResponse, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_RICserviceUpdateAcknowledge: { - memcpy(&succMsg.value.choice.RICserviceUpdateAcknowledge, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_RICcontrolAcknowledge: { - memcpy(&succMsg.value.choice.RICcontrolAcknowledge, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_X2SetupResponse: { - memcpy(&succMsg.value.choice.X2SetupResponse, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_ENDCX2SetupResponse: { - memcpy(&succMsg.value.choice.ENDCX2SetupResponse, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_ResourceStatusResponse: { - memcpy(&succMsg.value.choice.ResourceStatusResponse, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_ENBConfigurationUpdateAcknowledge: { - memcpy(&succMsg.value.choice.ENBConfigurationUpdateAcknowledge, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_ENDCConfigurationUpdateAcknowledge: { - memcpy(&succMsg.value.choice.ENDCConfigurationUpdateAcknowledge, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_ResetResponse: { - memcpy(&succMsg.value.choice.ResetResponse, value, sizeof(*value)); - break; - } - case SuccessfulOutcome__value_PR_NOTHING: - default: - break; - } +PLMN_Identity_t *createPLMN_ID(const unsigned char *data) { + printEntry("PLMN_Identity_t", __func__) + auto *plmnId = (PLMN_Identity_t *)calloc(1, sizeof(PLMN_Identity_t)); + ASN_STRUCT_RESET(asn_DEF_PLMN_Identity, plmnId); + plmnId->size = 3; + plmnId->buf = (uint8_t *)calloc(1, 3); + memcpy(plmnId->buf, data, 3); + + if (mdclog_level_get() >= MDCLOG_DEBUG) { + checkAndPrint(&asn_DEF_PLMN_Identity, plmnId, (char *)"PLMN_Identity_t", __func__); } + return plmnId; +} +ENB_ID_t *createENB_ID(ENB_ID_PR enbType, unsigned char *data) { + printEntry("ENB_ID_t", __func__) + auto *enb = (ENB_ID_t *)calloc(1, sizeof(ENB_ID_t)); + ASN_STRUCT_RESET(asn_DEF_ENB_ID, enb); + enb->present = enbType; + switch (enbType) { + case ENB_ID_PR_macro_eNB_ID: { // 20 bit 3 bytes + enb->choice.macro_eNB_ID.size = 3; + enb->choice.macro_eNB_ID.bits_unused = 4; - static void buildUnSucssesfullMessagePDU(E2AP_PDU_t &pdu,UnsuccessfulOutcome_t *unSuccMsg) { - pdu.present = E2AP_PDU_PR_unsuccessfulOutcome; - pdu.choice.unsuccessfulOutcome = unSuccMsg; - } + enb->present = ENB_ID_PR_macro_eNB_ID; + + enb->choice.macro_eNB_ID.buf = (uint8_t *)calloc(1, enb->choice.macro_eNB_ID.size); + data[enb->choice.macro_eNB_ID.size - 1] = ((unsigned)(data[enb->choice.macro_eNB_ID.size - 1] >> + (unsigned)enb->choice.macro_eNB_ID.bits_unused) << (unsigned)enb->choice.macro_eNB_ID.bits_unused); + memcpy(enb->choice.macro_eNB_ID.buf, data, enb->choice.macro_eNB_ID.size); - template - static void buildUnSuccMsg(UnsuccessfulOutcome_t &unSuccMsg, - UnsuccessfulOutcome__value_PR present, - ProcedureCode_t procedureCode, - Criticality_t criticality, - T *value) { - unSuccMsg.value.present = present; - unSuccMsg.procedureCode = procedureCode; - unSuccMsg.criticality = criticality; - - switch (present) { - case UnsuccessfulOutcome__value_PR_RICsubscriptionFailure: { - memcpy(&unSuccMsg.value.choice.RICsubscriptionFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure: { - memcpy(&unSuccMsg.value.choice.RICsubscriptionDeleteFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_RICserviceUpdateFailure: { - memcpy(&unSuccMsg.value.choice.RICserviceUpdateFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_RICcontrolFailure: { - memcpy(&unSuccMsg.value.choice.RICcontrolFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_X2SetupFailure: { - memcpy(&unSuccMsg.value.choice.X2SetupFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_ENDCX2SetupFailure: { - memcpy(&unSuccMsg.value.choice.ENDCX2SetupFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_ResourceStatusFailure: { - memcpy(&unSuccMsg.value.choice.ResourceStatusFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_ENBConfigurationUpdateFailure: { - memcpy(&unSuccMsg.value.choice.ENBConfigurationUpdateFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_ENDCConfigurationUpdateFailure: { - memcpy(&unSuccMsg.value.choice.ENDCConfigurationUpdateFailure, value, sizeof(*value)); - break; - } - case UnsuccessfulOutcome__value_PR_NOTHING: - default: - break; + break; } + case ENB_ID_PR_home_eNB_ID: { // 28 bit 4 bytes + enb->choice.home_eNB_ID.size = 4; + enb->choice.home_eNB_ID.bits_unused = 4; + enb->present = ENB_ID_PR_home_eNB_ID; + + enb->choice.home_eNB_ID.buf = (uint8_t *)calloc(1, enb->choice.home_eNB_ID.size); + data[enb->choice.home_eNB_ID.size - 1] = ((unsigned)(data[enb->choice.home_eNB_ID.size - 1] >> + (unsigned)enb->choice.home_eNB_ID.bits_unused) << (unsigned)enb->choice.home_eNB_ID.bits_unused); + memcpy(enb->choice.home_eNB_ID.buf, data, enb->choice.home_eNB_ID.size); + break; + } + case ENB_ID_PR_short_Macro_eNB_ID: { // 18 bit - 3 bytes + enb->choice.short_Macro_eNB_ID.size = 3; + enb->choice.short_Macro_eNB_ID.bits_unused = 6; + enb->present = ENB_ID_PR_short_Macro_eNB_ID; + + enb->choice.short_Macro_eNB_ID.buf = (uint8_t *)calloc(1, enb->choice.short_Macro_eNB_ID.size); + data[enb->choice.short_Macro_eNB_ID.size - 1] = ((unsigned)(data[enb->choice.short_Macro_eNB_ID.size - 1] >> + (unsigned)enb->choice.short_Macro_eNB_ID.bits_unused) << (unsigned)enb->choice.short_Macro_eNB_ID.bits_unused); + memcpy(enb->choice.short_Macro_eNB_ID.buf, data, enb->choice.short_Macro_eNB_ID.size); + break; + } + case ENB_ID_PR_long_Macro_eNB_ID: { // 21 + enb->choice.long_Macro_eNB_ID.size = 3; + enb->choice.long_Macro_eNB_ID.bits_unused = 3; + enb->present = ENB_ID_PR_long_Macro_eNB_ID; + + enb->choice.long_Macro_eNB_ID.buf = (uint8_t *)calloc(1, enb->choice.long_Macro_eNB_ID.size); + data[enb->choice.long_Macro_eNB_ID.size - 1] = ((unsigned)(data[enb->choice.long_Macro_eNB_ID.size - 1] >> + (unsigned)enb->choice.long_Macro_eNB_ID.bits_unused) << (unsigned)enb->choice.long_Macro_eNB_ID.bits_unused); + memcpy(enb->choice.long_Macro_eNB_ID.buf, data, enb->choice.long_Macro_eNB_ID.size); + break; + } + default: + free(enb); + return nullptr; } + if (mdclog_level_get() >= MDCLOG_DEBUG) { + checkAndPrint(&asn_DEF_ENB_ID, enb, (char *)"ENB_ID_t", __func__); + } + return enb; +} + +GlobalENB_ID_t *createGlobalENB_ID(PLMN_Identity_t *plmnIdentity, ENB_ID_t *enbId) { + printEntry("GlobalENB_ID_t", __func__) + auto *genbId = (GlobalENB_ID_t *)calloc(1, sizeof(GlobalENB_ID_t)); + ASN_STRUCT_RESET(asn_DEF_GlobalENB_ID, genbId); + memcpy(&genbId->pLMN_Identity, plmnIdentity, sizeof(PLMN_Identity_t)); + memcpy(&genbId->eNB_ID, enbId, sizeof(ENB_ID_t)); + + if (mdclog_level_get() >= MDCLOG_DEBUG) { + checkAndPrint(&asn_DEF_GlobalENB_ID, genbId, (char *)"GlobalENB_ID_t", __func__); + } + return genbId; +} + +//ServedCell-Information ::= SEQUENCE { +// pCI PCI, +// cellId ECGI, +// tAC TAC, +// broadcastPLMNs BroadcastPLMNs-Item, +// eUTRA-Mode-Info EUTRA-Mode-Info, +// iE-Extensions ProtocolExtensionContainer { {ServedCell-Information-ExtIEs} } OPTIONAL, +// ... +//} +// +//ServedCell-Information-ExtIEs X2AP-PROTOCOL-EXTENSION ::= { +// { ID id-Number-of-Antennaports CRITICALITY ignore EXTENSION Number-of-Antennaports PRESENCE optional}| +// { ID id-PRACH-Configuration CRITICALITY ignore EXTENSION PRACH-Configuration PRESENCE optional}| +// { ID id-MBSFN-Subframe-Info CRITICALITY ignore EXTENSION MBSFN-Subframe-Infolist PRESENCE optional}| +// { ID id-CSG-Id CRITICALITY ignore EXTENSION CSG-Id PRESENCE optional}| +// { ID id-MBMS-Service-Area-List CRITICALITY ignore EXTENSION MBMS-Service-Area-Identity-List PRESENCE optional}| +// { ID id-MultibandInfoList CRITICALITY ignore EXTENSION MultibandInfoList PRESENCE optional}| +// { ID id-FreqBandIndicatorPriority CRITICALITY ignore EXTENSION FreqBandIndicatorPriority PRESENCE optional}| +// { ID id-BandwidthReducedSI CRITICALITY ignore EXTENSION BandwidthReducedSI PRESENCE optional}| +// { ID id-ProtectedEUTRAResourceIndication CRITICALITY ignore EXTENSION ProtectedEUTRAResourceIndication PRESENCE optional}| +// { ID id-BPLMN-ID-Info-EUTRA CRITICALITY ignore EXTENSION BPLMN-ID-Info-EUTRA PRESENCE optional}, +// ... +//} + +ServedCell_Information_t *createervedCellIno(long pci) { + printEntry("ServedCell_Information_t", __func__) + auto servedCellinfo = (ServedCell_Information_t *)calloc(1, sizeof(ServedCell_Information_t)); + + servedCellinfo->pCI = pci; +// servedCellinfo->cellId = + + if (mdclog_level_get() >= MDCLOG_DEBUG) { + checkAndPrint(&asn_DEF_ServedCell_Information, servedCellinfo, (char *)"ServedCell_Information_t", __func__); + } - static void createPLMN_ID(PLMN_Identity_t &plmnId, const unsigned char *data) { - //printEntry("PLMN_Identity_t", __func__) - //PLMN_Identity_t *plmnId = calloc(1, sizeof(PLMN_Identity_t)); - ASN_STRUCT_RESET(asn_DEF_PLMN_Identity, &plmnId); - plmnId.size = 3; - plmnId.buf = (uint8_t *)calloc(1, 3); - memcpy(plmnId.buf, data, 3); + return servedCellinfo; +} - if (mdclog_level_get() >= MDCLOG_DEBUG) { - checkAndPrint(&asn_DEF_PLMN_Identity, &plmnId, (char *)"PLMN_Identity_t", __func__); - } +ServedCells__Member *createServedCellsMember() { + printEntry("ServedCells__Member", __func__) + auto servedCellMember = (ServedCells__Member *)calloc(1, sizeof(ServedCells__Member)); + + //servedCellMember->servedCellInfo + if (mdclog_level_get() >= MDCLOG_DEBUG) { + checkAndPrint(&asn_DEF_ServedCells, servedCellMember, (char *)"ServedCells__Member", __func__); } - static void createENB_ID(ENB_ID_t &enb, ENB_ID_PR enbType, unsigned char *data) { - //printEntry("ENB_ID_t", __func__) - ASN_STRUCT_RESET(asn_DEF_ENB_ID, &enb); - enb.present = enbType; - switch (enbType) { - case ENB_ID_PR_macro_eNB_ID: { // 20 bit 3 bytes - enb.choice.macro_eNB_ID.size = 3; - enb.choice.macro_eNB_ID.bits_unused = 4; - - enb.present = ENB_ID_PR_macro_eNB_ID; - - enb.choice.macro_eNB_ID.buf = (uint8_t *)calloc(1, enb.choice.macro_eNB_ID.size); - data[enb.choice.macro_eNB_ID.size - 1] = ((unsigned)(data[enb.choice.macro_eNB_ID.size - 1] - >> (unsigned)enb.choice.macro_eNB_ID.bits_unused) - << (unsigned)enb.choice.macro_eNB_ID.bits_unused); - memcpy(enb.choice.macro_eNB_ID.buf, data, enb.choice.macro_eNB_ID.size); - - break; - } - case ENB_ID_PR_home_eNB_ID: { // 28 bit 4 bytes - enb.choice.home_eNB_ID.size = 4; - enb.choice.home_eNB_ID.bits_unused = 4; - enb.present = ENB_ID_PR_home_eNB_ID; - - enb.choice.home_eNB_ID.buf = (uint8_t *)calloc(1, enb.choice.home_eNB_ID.size); - data[enb.choice.home_eNB_ID.size - 1] = ((unsigned)(data[enb.choice.home_eNB_ID.size - 1] - >> (unsigned)enb.choice.home_eNB_ID.bits_unused) - << (unsigned)enb.choice.home_eNB_ID.bits_unused); - memcpy(enb.choice.home_eNB_ID.buf, data, enb.choice.home_eNB_ID.size); - break; - } - case ENB_ID_PR_short_Macro_eNB_ID: { // 18 bit - 3 bytes - enb.choice.short_Macro_eNB_ID.size = 3; - enb.choice.short_Macro_eNB_ID.bits_unused = 6; - enb.present = ENB_ID_PR_short_Macro_eNB_ID; - - enb.choice.short_Macro_eNB_ID.buf = (uint8_t *)calloc(1, enb.choice.short_Macro_eNB_ID.size); - data[enb.choice.short_Macro_eNB_ID.size - 1] = ((unsigned)(data[enb.choice.short_Macro_eNB_ID.size - 1] - >> (unsigned)enb.choice.short_Macro_eNB_ID.bits_unused) - << (unsigned)enb.choice.short_Macro_eNB_ID.bits_unused); - memcpy(enb.choice.short_Macro_eNB_ID.buf, data, enb.choice.short_Macro_eNB_ID.size); - break; - } - case ENB_ID_PR_long_Macro_eNB_ID: { // 21 - enb.choice.long_Macro_eNB_ID.size = 3; - enb.choice.long_Macro_eNB_ID.bits_unused = 3; - enb.present = ENB_ID_PR_long_Macro_eNB_ID; - - enb.choice.long_Macro_eNB_ID.buf = (uint8_t *)calloc(1, enb.choice.long_Macro_eNB_ID.size); - data[enb.choice.long_Macro_eNB_ID.size - 1] = ((unsigned)(data[enb.choice.long_Macro_eNB_ID.size - 1] - >> (unsigned)enb.choice.long_Macro_eNB_ID.bits_unused) - << (unsigned)enb.choice.long_Macro_eNB_ID.bits_unused); - memcpy(enb.choice.long_Macro_eNB_ID.buf, data, enb.choice.long_Macro_eNB_ID.size); - break; - } - default: - break; - } - - if (mdclog_level_get() >= MDCLOG_DEBUG) { - checkAndPrint(&asn_DEF_ENB_ID, &enb, (char *)"ENB_ID_t", __func__); + return servedCellMember; +} + + +static void buildInitiatingMessagePDU(E2AP_PDU_t &pdu, InitiatingMessage_t *initMsg) { + pdu.present = E2AP_PDU_PR_initiatingMessage; + pdu.choice.initiatingMessage = initMsg; +} + +template +static void buildInitMsg(InitiatingMessage_t &initMsg, + InitiatingMessage__value_PR present, + ProcedureCode_t procedureCode, + Criticality_t criticality, + T *value) { + initMsg.value.present = present; + initMsg.procedureCode = procedureCode; + initMsg.criticality = criticality; + + switch (present) { + case InitiatingMessage__value_PR_RICsubscriptionRequest: { + memcpy(&initMsg.value.choice.RICsubscriptionRequest, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_RICsubscriptionDeleteRequest: { + memcpy(&initMsg.value.choice.RICsubscriptionDeleteRequest, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_RICserviceUpdate: { + memcpy(&initMsg.value.choice.RICserviceUpdate, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_RICcontrolRequest: { + memcpy(&initMsg.value.choice.RICcontrolRequest, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_X2SetupRequest: { + memcpy(&initMsg.value.choice.X2SetupRequest, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_ENDCX2SetupRequest: { + memcpy(&initMsg.value.choice.ENDCX2SetupRequest, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_ResourceStatusRequest: { + memcpy(&initMsg.value.choice.ResourceStatusRequest, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_ENBConfigurationUpdate: { + memcpy(&initMsg.value.choice.ENBConfigurationUpdate, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_ENDCConfigurationUpdate: { + memcpy(&initMsg.value.choice.ENDCConfigurationUpdate, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_ResetRequest: { + memcpy(&initMsg.value.choice.ResetRequest, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_RICindication: { + memcpy(&initMsg.value.choice.RICindication, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_RICserviceQuery: { + memcpy(&initMsg.value.choice.RICserviceQuery, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_LoadInformation: { + memcpy(&initMsg.value.choice.LoadInformation, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_GNBStatusIndication: { + memcpy(&initMsg.value.choice.GNBStatusIndication, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_ResourceStatusUpdate: { + memcpy(&initMsg.value.choice.ResourceStatusUpdate, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_ErrorIndication: { + memcpy(&initMsg.value.choice.ErrorIndication, value, sizeof(*value)); + break; + } + case InitiatingMessage__value_PR_NOTHING: + default : { + break; } } +} + +static void buildSuccsesfulMessagePDU(E2AP_PDU_t &pdu, SuccessfulOutcome_t *succMsg) { + pdu.present = E2AP_PDU_PR_successfulOutcome; + pdu.choice.successfulOutcome = succMsg; +} + +template +static void buildSuccMsg(SuccessfulOutcome_t &succMsg, + SuccessfulOutcome__value_PR present, + ProcedureCode_t procedureCode, + Criticality_t criticality, + T *value) { + succMsg.value.present = present; + succMsg.procedureCode = procedureCode; + succMsg.criticality = criticality; + + switch (present) { + case SuccessfulOutcome__value_PR_RICsubscriptionResponse: { + memcpy(&succMsg.value.choice.RICsubscriptionResponse, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse: { + memcpy(&succMsg.value.choice.RICsubscriptionDeleteResponse, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_RICserviceUpdateAcknowledge: { + memcpy(&succMsg.value.choice.RICserviceUpdateAcknowledge, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_RICcontrolAcknowledge: { + memcpy(&succMsg.value.choice.RICcontrolAcknowledge, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_X2SetupResponse: { + memcpy(&succMsg.value.choice.X2SetupResponse, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_ENDCX2SetupResponse: { + memcpy(&succMsg.value.choice.ENDCX2SetupResponse, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_ResourceStatusResponse: { + memcpy(&succMsg.value.choice.ResourceStatusResponse, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_ENBConfigurationUpdateAcknowledge: { + memcpy(&succMsg.value.choice.ENBConfigurationUpdateAcknowledge, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_ENDCConfigurationUpdateAcknowledge: { + memcpy(&succMsg.value.choice.ENDCConfigurationUpdateAcknowledge, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_ResetResponse: { + memcpy(&succMsg.value.choice.ResetResponse, value, sizeof(*value)); + break; + } + case SuccessfulOutcome__value_PR_NOTHING: + default: + break; + } +} + + +static void buildUnSucssesfullMessagePDU(E2AP_PDU_t &pdu, UnsuccessfulOutcome_t *unSuccMsg) { + pdu.present = E2AP_PDU_PR_unsuccessfulOutcome; + pdu.choice.unsuccessfulOutcome = unSuccMsg; +} + +template +static void buildUnSuccMsg(UnsuccessfulOutcome_t &unSuccMsg, + UnsuccessfulOutcome__value_PR present, + ProcedureCode_t procedureCode, + Criticality_t criticality, + T *value) { + unSuccMsg.value.present = present; + unSuccMsg.procedureCode = procedureCode; + unSuccMsg.criticality = criticality; + + switch (present) { + case UnsuccessfulOutcome__value_PR_RICsubscriptionFailure: { + memcpy(&unSuccMsg.value.choice.RICsubscriptionFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure: { + memcpy(&unSuccMsg.value.choice.RICsubscriptionDeleteFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_RICserviceUpdateFailure: { + memcpy(&unSuccMsg.value.choice.RICserviceUpdateFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_RICcontrolFailure: { + memcpy(&unSuccMsg.value.choice.RICcontrolFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_X2SetupFailure: { + memcpy(&unSuccMsg.value.choice.X2SetupFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_ENDCX2SetupFailure: { + memcpy(&unSuccMsg.value.choice.ENDCX2SetupFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_ResourceStatusFailure: { + memcpy(&unSuccMsg.value.choice.ResourceStatusFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_ENBConfigurationUpdateFailure: { + memcpy(&unSuccMsg.value.choice.ENBConfigurationUpdateFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_ENDCConfigurationUpdateFailure: { + memcpy(&unSuccMsg.value.choice.ENDCConfigurationUpdateFailure, value, sizeof(*value)); + break; + } + case UnsuccessfulOutcome__value_PR_NOTHING: + default: + break; + } +} + + +static void createPLMN_ID(PLMN_Identity_t &plmnId, const unsigned char *data) { + //printEntry("PLMN_Identity_t", __func__) + //PLMN_Identity_t *plmnId = calloc(1, sizeof(PLMN_Identity_t)); + ASN_STRUCT_RESET(asn_DEF_PLMN_Identity, &plmnId); + plmnId.size = 3; + plmnId.buf = (uint8_t *) calloc(1, 3); + memcpy(plmnId.buf, data, 3); + + if (mdclog_level_get() >= MDCLOG_DEBUG) { + checkAndPrint(&asn_DEF_PLMN_Identity, &plmnId, (char *) "PLMN_Identity_t", __func__); + } + +} + +static void createENB_ID(ENB_ID_t &enb, ENB_ID_PR enbType, unsigned char *data) { + //printEntry("ENB_ID_t", __func__) + ASN_STRUCT_RESET(asn_DEF_ENB_ID, &enb); + enb.present = enbType; + switch (enbType) { + case ENB_ID_PR_macro_eNB_ID: { // 20 bit 3 bytes + enb.choice.macro_eNB_ID.size = 3; + enb.choice.macro_eNB_ID.bits_unused = 4; + enb.present = ENB_ID_PR_macro_eNB_ID; - static void buildGlobalENB_ID(GlobalENB_ID_t *gnbId, - const unsigned char *gnbData, - ENB_ID_PR enbType, - unsigned char *enbData) { - createPLMN_ID(gnbId->pLMN_Identity, gnbData); - createENB_ID(gnbId->eNB_ID, enbType, enbData); - if (mdclog_level_get() >= MDCLOG_DEBUG) { - checkAndPrint(&asn_DEF_GlobalENB_ID, gnbId, (char *)"GlobalENB_ID_t", __func__); + enb.choice.macro_eNB_ID.buf = (uint8_t *) calloc(1, enb.choice.macro_eNB_ID.size); + data[enb.choice.macro_eNB_ID.size - 1] = ((unsigned) (data[enb.choice.macro_eNB_ID.size - 1] + >> (unsigned) enb.choice.macro_eNB_ID.bits_unused) + << (unsigned) enb.choice.macro_eNB_ID.bits_unused); + memcpy(enb.choice.macro_eNB_ID.buf, data, enb.choice.macro_eNB_ID.size); + + break; + } + case ENB_ID_PR_home_eNB_ID: { // 28 bit 4 bytes + enb.choice.home_eNB_ID.size = 4; + enb.choice.home_eNB_ID.bits_unused = 4; + enb.present = ENB_ID_PR_home_eNB_ID; + + enb.choice.home_eNB_ID.buf = (uint8_t *) calloc(1, enb.choice.home_eNB_ID.size); + data[enb.choice.home_eNB_ID.size - 1] = ((unsigned) (data[enb.choice.home_eNB_ID.size - 1] + >> (unsigned) enb.choice.home_eNB_ID.bits_unused) + << (unsigned) enb.choice.home_eNB_ID.bits_unused); + memcpy(enb.choice.home_eNB_ID.buf, data, enb.choice.home_eNB_ID.size); + break; + } + case ENB_ID_PR_short_Macro_eNB_ID: { // 18 bit - 3 bytes + enb.choice.short_Macro_eNB_ID.size = 3; + enb.choice.short_Macro_eNB_ID.bits_unused = 6; + enb.present = ENB_ID_PR_short_Macro_eNB_ID; + + enb.choice.short_Macro_eNB_ID.buf = (uint8_t *) calloc(1, enb.choice.short_Macro_eNB_ID.size); + data[enb.choice.short_Macro_eNB_ID.size - 1] = ((unsigned) (data[enb.choice.short_Macro_eNB_ID.size - 1] + >> (unsigned) enb.choice.short_Macro_eNB_ID.bits_unused) + << (unsigned) enb.choice.short_Macro_eNB_ID.bits_unused); + memcpy(enb.choice.short_Macro_eNB_ID.buf, data, enb.choice.short_Macro_eNB_ID.size); + break; + } + case ENB_ID_PR_long_Macro_eNB_ID: { // 21 + enb.choice.long_Macro_eNB_ID.size = 3; + enb.choice.long_Macro_eNB_ID.bits_unused = 3; + enb.present = ENB_ID_PR_long_Macro_eNB_ID; + + enb.choice.long_Macro_eNB_ID.buf = (uint8_t *) calloc(1, enb.choice.long_Macro_eNB_ID.size); + data[enb.choice.long_Macro_eNB_ID.size - 1] = ((unsigned) (data[enb.choice.long_Macro_eNB_ID.size - 1] + >> (unsigned) enb.choice.long_Macro_eNB_ID.bits_unused) + << (unsigned) enb.choice.long_Macro_eNB_ID.bits_unused); + memcpy(enb.choice.long_Macro_eNB_ID.buf, data, enb.choice.long_Macro_eNB_ID.size); + break; } + default: + break; } -}; + if (mdclog_level_get() >= MDCLOG_DEBUG) { + checkAndPrint(&asn_DEF_ENB_ID, &enb, (char *) "ENB_ID_t", __func__); + } +} + + +static void buildGlobalENB_ID(GlobalENB_ID_t *gnbId, + const unsigned char *gnbData, + ENB_ID_PR enbType, + unsigned char *enbData) { + createPLMN_ID(gnbId->pLMN_Identity, gnbData); + createENB_ID(gnbId->eNB_ID, enbType, enbData); + if (mdclog_level_get() >= MDCLOG_DEBUG) { + checkAndPrint(&asn_DEF_GlobalENB_ID, gnbId, (char *) "GlobalENB_ID_t", __func__); + } +} #endif //E2_E2BUILDER_H diff --git a/RIC-E2-TERMINATION/TEST/T1/E2Setup.cpp b/RIC-E2-TERMINATION/TEST/T1/E2Setup.cpp index 5637dbb..8a93186 100644 --- a/RIC-E2-TERMINATION/TEST/T1/E2Setup.cpp +++ b/RIC-E2-TERMINATION/TEST/T1/E2Setup.cpp @@ -24,11 +24,11 @@ #include "asn1cFiles/ProtocolIE-Field.h" template -void buildX2SetupIE(X2SetupRequest_IEs_t *x2SetupIE, - ProtocolIE_ID_t id, +X2SetupRequest_IEs_t *buildX2SetupIE(ProtocolIE_ID_t id, Criticality_t criticality, X2SetupRequest_IEs__value_PR present, T *value) { + auto *x2SetupIE = (X2SetupRequest_IEs_t *)calloc(1, sizeof(X2SetupRequest_IEs_t)); x2SetupIE->id = id; x2SetupIE->criticality = criticality; x2SetupIE->value.present = present; @@ -52,10 +52,55 @@ void buildX2SetupIE(X2SetupRequest_IEs_t *x2SetupIE, } case X2SetupRequest_IEs__value_PR_NOTHING: default: + free(x2SetupIE); + x2SetupIE = nullptr; break; } + return x2SetupIE; } void buildE2SetupRequest(X2SetupRequest_t *x2Setup) { +} + +void init_log() +{ + mdclog_attr_t *attr; + mdclog_attr_init(&attr); + mdclog_attr_set_ident(attr, "e2smTests"); + mdclog_init(attr); + mdclog_attr_destroy(attr); +} + +int main(const int argc, char **argv) { + init_log(); + //mdclog_level_set(MDCLOG_WARN); + //mdclog_level_set(MDCLOG_INFO); + mdclog_level_set(MDCLOG_DEBUG); + +// x2Setup X2AP-ELEMENTARY-PROCEDURE ::= { +// INITIATING MESSAGE X2SetupRequest +// SUCCESSFUL OUTCOME X2SetupResponse +// UNSUCCESSFUL OUTCOME X2SetupFailure +// PROCEDURE CODE id-x2Setup +// CRITICALITY reject +// } +// +// + +// X2SetupRequest ::= SEQUENCE { +// protocolIEs ProtocolIE-Container {{X2SetupRequest-IEs}}, +// ... +// } +// +// X2SetupRequest-IEs X2AP-PROTOCOL-IES ::= { +// { ID id-GlobalENB-ID CRITICALITY reject TYPE GlobalENB-ID PRESENCE mandatory}| +// { ID id-ServedCells CRITICALITY reject TYPE ServedCells PRESENCE mandatory}| +// { ID id-GUGroupIDList CRITICALITY reject TYPE GUGroupIDList PRESENCE optional}| +// { ID id-LHN-ID CRITICALITY ignore TYPE LHN-ID PRESENCE optional}, +// ... +// } + + + } \ No newline at end of file diff --git a/RIC-E2-TERMINATION/sctpThread.cpp b/RIC-E2-TERMINATION/sctpThread.cpp index 5acf491..b5da1b7 100644 --- a/RIC-E2-TERMINATION/sctpThread.cpp +++ b/RIC-E2-TERMINATION/sctpThread.cpp @@ -311,7 +311,7 @@ void sendTermInit(sctp_params_t &sctpParams) { while (!term_init) { msg->mtype = E2_TERM_INIT; msg->state = 0; - rmr_bytes2payload(msg, (unsigned char *)sctpParams.ka_message, len); + rmr_bytes2payload(msg, (unsigned char *)sctpParams.ka_message, sctpParams.ka_message_length); static unsigned char tx[32]; auto txLen = snprintf((char *) tx, sizeof tx, "%15ld", transactionCounter++); rmr_bytes2xact(msg, tx, txLen); diff --git a/T1 b/T1 index ac0c82c..0d181f4 100755 Binary files a/T1 and b/T1 differ