version 3.0.4 98/1998/1
authoraa7133@att.com <aa7133@att.com>
Wed, 11 Dec 2019 12:11:26 +0000 (14:11 +0200)
committeraa7133@att.com <aa7133@att.com>
Wed, 11 Dec 2019 12:11:30 +0000 (14:11 +0200)
fix the length bug
add testing (not yet produce the exe)

Change-Id: Ie95299a9a19153384c37e941e4c3e9dcda9285ea
Signed-off-by: aa7133@att.com <aa7133@att.com>
RIC-E2-TERMINATION/TEST/T1/E2Builder.h
RIC-E2-TERMINATION/TEST/T1/E2Setup.cpp
RIC-E2-TERMINATION/sctpThread.cpp
T1

index 11fa3f1..ea284a3 100644 (file)
 
 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<typename T>
-    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<typename T>
-    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<typename T>
-    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<typename T>
+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<typename T>
+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<typename T>
+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
index 5637dbb..8a93186 100644 (file)
 #include "asn1cFiles/ProtocolIE-Field.h"
 
 template<typename T>
-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
index 5acf491..b5da1b7 100644 (file)
@@ -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 (executable)
Binary files a/T1 and b/T1 differ