/***************************************************************************** # * # Copyright 2019 AT&T Intellectual Property * # Copyright 2019 Nokia * # * # Licensed under the Apache License, Version 2.0 (the "License"); * # you may not use this file except in compliance with the License. * # You may obtain a copy of the License at * # * # http://www.apache.org/licenses/LICENSE-2.0 * # * # Unless required by applicable law or agreed to in writing, software * # distributed under the License is distributed on an "AS IS" BASIS, * # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * # See the License for the specific language governing permissions and * # limitations under the License. * # * ******************************************************************************/ #include "e2sm.h" #include "ActionParameter-Item.h" #include "ActionParameter-Value.h" #include "PLMN-Identity.h" #include "GlobalENB-ID.h" #include "GlobalGNB-ID.h" #include "Interface-ID.h" #include "ProtocolIE-Field.h" #include "InterfaceMessageType.h" #include "InterfaceProtocolIE-Item.h" static PLMN_Identity_t *createPLMN_ID(const unsigned char *data) { PLMN_Identity_t *plmnId = calloc(1, sizeof(PLMN_Identity_t)); ASN_STRUCT_RESET(asn_DEF_PLMN_Identity, plmnId); plmnId->size = 3; plmnId->buf = calloc(1, 3); memcpy(plmnId->buf, data, 3); return plmnId; } static GNB_ID_t *createGnb_id(const unsigned char *data, int numOfBits) { if (numOfBits < 22 || numOfBits > 32) { printf("[Error] GNB_ID_t number of bits = %d, needs to be 22 .. 32", numOfBits); return NULL; } GNB_ID_t *gnb = calloc(1, sizeof(GNB_ID_t)); ASN_STRUCT_RESET(asn_DEF_GNB_ID, gnb); gnb->present = GNB_ID_PR_gNB_ID; gnb->choice.gNB_ID.size = numOfBits % 8 == 0 ? (unsigned int)(numOfBits / 8) : (unsigned int)(numOfBits / 8 + 1); gnb->choice.gNB_ID.bits_unused = gnb->choice.gNB_ID.size * 8 - numOfBits; gnb->choice.gNB_ID.buf = calloc(1, gnb->choice.gNB_ID.size); memcpy(gnb->choice.gNB_ID.buf, data, gnb->choice.gNB_ID.size); gnb->choice.gNB_ID.buf[gnb->choice.gNB_ID.size - 1] = ((unsigned)(gnb->choice.gNB_ID.buf[gnb->choice.gNB_ID.size - 1] >> (unsigned)gnb->choice.gNB_ID.bits_unused) << (unsigned)gnb->choice.gNB_ID.bits_unused); return gnb; } static GlobalGNB_ID_t *createGlobalGNB_ID(PLMN_Identity_t *plmnIdentity, GNB_ID_t *gnb) { GlobalGNB_ID_t *ggnbId = calloc(1, sizeof(GlobalGNB_ID_t)); ASN_STRUCT_RESET(asn_DEF_GlobalGNB_ID, ggnbId); memcpy(&ggnbId->pLMN_Identity, plmnIdentity, sizeof(PLMN_Identity_t)); memcpy(&ggnbId->gNB_ID, gnb, sizeof(GNB_ID_t)); return ggnbId; } static Interface_ID_t *createInterfaceIDForGnb(GlobalGNB_ID_t *gnb) { Interface_ID_t *interfaceId = calloc(1, sizeof(Interface_ID_t)); ASN_STRUCT_RESET(asn_DEF_Interface_ID, interfaceId); interfaceId->present = Interface_ID_PR_global_gNB_ID; interfaceId->choice.global_gNB_ID = gnb; return interfaceId; } static InterfaceMessageType_t *createInterfaceMessageInitiating(long procedureCode) { InterfaceMessageType_t *intMsgT = calloc(1, sizeof(InterfaceMessageType_t)); ASN_STRUCT_RESET(asn_DEF_InterfaceMessageType, intMsgT); intMsgT->procedureCode = procedureCode; intMsgT->typeOfMessage = TypeOfMessage_initiating_message; return intMsgT; } E2SM_gNB_X2_eventTriggerDefinition_t* create_eventTriggerDefinition(void) { //PLMN_Identity unsigned char plmnidData[3] = {0x33, 0xF4, 0x55}; PLMN_Identity_t *plmnid = createPLMN_ID(plmnidData); // xer_fprint(stdout, &asn_DEF_PLMN_Identity, (void *)plmnid); //GNB_ID unsigned char gnbData[3] = {0x99, 0xaa, 0xbb}; GNB_ID_t *gnb = createGnb_id(gnbData, 26); // xer_fprint(stdout, &asn_DEF_GNB_ID, (void *)gnb); //GlobalGNB_ID GlobalGNB_ID_t *globaGnb = createGlobalGNB_ID(plmnid, gnb); // xer_fprint(stdout, &asn_DEF_GlobalGNB_ID, (void *)globaGnb); //Interface_ID Interface_ID_t *gnbInterfaceId = createInterfaceIDForGnb(globaGnb); // xer_fprint(stdout, &asn_DEF_Interface_ID, (void *)gnbInterfaceId); //InterfaceMessageType InterfaceMessageType_t *initiatingInterface = createInterfaceMessageInitiating(35); //EventTriggerDefinition E2SM_gNB_X2_eventTriggerDefinition_t *eventTrigger = calloc(1, sizeof(E2SM_gNB_X2_eventTriggerDefinition_t)); ASN_STRUCT_RESET(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, eventTrigger); memcpy(&eventTrigger->interface_ID , gnbInterfaceId, sizeof(Interface_ID_t)); eventTrigger->interfaceDirection = 0; memcpy(&eventTrigger->interfaceMessageType, initiatingInterface, sizeof(InterfaceMessageType_t)); return eventTrigger; } #define E2AP_ASN1C_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID) \ do {\ IE_TYPE **ptr; \ ie = NULL; \ for (ptr = container->protocolIEs.list.array; \ ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; \ ptr++) { \ if((*ptr)->id == IE_ID) { \ ie = *ptr; \ break; \ } \ } \ } while(0) void test_eventTriggerDefinition(void) { E2SM_gNB_X2_eventTriggerDefinition_t *eventTrigger = create_eventTriggerDefinition(); xer_fprint(stdout, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, (void *)eventTrigger); printf("\n"); uint8_t *eventBuff; int eventBuff_len; eventBuff_len = aper_encode_to_new_buffer(&asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, 0, eventTrigger, (void **)&eventBuff); LOG_I("Encoded eventBuff_len = %d", eventBuff_len); //----------------------------------------------------------------------- E2AP_PDU_t* pdu = e2ap_xml_to_pdu("E2AP_RICsubscriptionRequest.xml"); e2ap_asn1c_print_pdu(pdu); InitiatingMessage_t *initiatingMessage = pdu->choice.initiatingMessage; xer_fprint(stdout, &asn_DEF_InitiatingMessage, (void *)initiatingMessage); RICsubscriptionRequest_t *request = &initiatingMessage->value.choice.RICsubscriptionRequest; xer_fprint(stdout, &asn_DEF_RICsubscriptionRequest, (void *)request); LOG_I("num of IEs = %d", request->protocolIEs.list.count); RICsubscriptionRequest_IEs_t *ie; ie = request->protocolIEs.list.array[2]; // E2AP_ASN1C_FIND_PROTOCOLIE_BY_ID(RICsubscriptionRequest_IEs_t, ie, request, ProtocolIE_ID_id_RICsubscription); // E2AP_ASN1C_FIND_PROTOCOLIE_BY_ID(RICsubscriptionRequest_IEs_t, ie, request, ProtocolIE_ID_id_RICrequestID); assert( ie != NULL); xer_fprint(stdout, &asn_DEF_RICsubscription, (void *)ie); // xer_fprint(stdout, &asn_DEF_RICrequestID, (void *)ie); } // // typedef struct ProtocolIE_Container_119P0 { // A_SEQUENCE_OF(struct RICsubscriptionRequest_IEs) list; // // /* Context for parsing across buffer boundaries */ // asn_struct_ctx_t _asn_ctx; // } ProtocolIE_Container_119P0_t;