From c0c3a737edcf62c2ba6bd143dd291531e9af7d0b Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 25 Nov 2022 10:53:15 +0100 Subject: [PATCH] asn1c: use better version of asn1c We don't work much on asn1c. The version we use has several bugs. There is an active community out there that fixes bugs and improves asn1c. Let's use their version. --- CMakeLists.txt | 6 +- cmake_targets/tools/build_helper | 8 +- .../MESSAGES/ASN.1/38463-g80.R16.78.0.cmake | 79 +- openair2/E1AP/MESSAGES/CMakeLists.txt | 2 +- openair2/ENB_APP/enb_config.c | 1 + openair2/F1AP/MESSAGES/ASN1/asn1tostruct.py | 697 ----------------- openair2/F1AP/MESSAGES/ASN1/f1ap-16.3.1.cmake | 89 ++- openair2/F1AP/MESSAGES/CMakeLists.txt | 2 +- openair2/F1AP/f1ap_du_rrc_message_transfer.c | 2 + openair2/GNB_APP/gnb_config.c | 2 + openair2/LAYER2/NR_MAC_gNB/config.c | 1 + openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 1 + .../NR_MAC_gNB/gNB_scheduler_primitives.c | 3 + .../LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c | 3 + openair2/M2AP/MESSAGES/ASN1/m2ap-14.0.0.cmake | 77 +- openair2/M2AP/MESSAGES/CMakeLists.txt | 2 +- openair2/M2AP/MESSAGES/asn1tostruct.py | 697 ----------------- openair2/RRC/LTE/L2_interface.c | 1 + .../LTE/MESSAGES/ASN.1/lte-rrc-15.6.0.cmake | 91 ++- openair2/RRC/LTE/MESSAGES/CMakeLists.txt | 2 +- openair2/RRC/LTE/MESSAGES/README.md | 2 +- openair2/RRC/LTE/rrc_eNB.c | 3 +- openair2/RRC/LTE/rrc_eNB_M2AP.c | 1 + openair2/RRC/LTE/rrc_eNB_S1AP.c | 1 + openair2/RRC/LTE/rrc_eNB_endc.c | 1 + openair2/RRC/NR/L2_nr_interface.c | 2 + .../RRC/NR/MESSAGES/ASN.1/nr-rrc-16.4.1.cmake | 91 ++- .../RRC/NR/MESSAGES/ASN.1/nr-rrc-17.3.0.cmake | 91 ++- openair2/RRC/NR/MESSAGES/CMakeLists.txt | 4 +- openair2/RRC/NR/nr_rrc_config.c | 3 + openair2/RRC/NR/rrc_gNB.c | 2 + openair2/RRC/NR/rrc_gNB_NGAP.c | 3 + openair2/RRC/NR/rrc_gNB_internode.c | 2 + openair2/RRC/NR/rrc_gNB_nsa.c | 2 + openair2/RRC/NR/rrc_gNB_reconfig.c | 1 + openair2/RRC/NR_UE/rrc_UE.c | 2 + .../X2AP/MESSAGES/ASN1/R15/x2ap-15.6.0.cmake | 87 ++- openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py | 697 ----------------- openair2/X2AP/MESSAGES/CMakeLists.txt | 2 +- openair3/LPP/MESSAGES/ASN1/37355-g60.cmake | 97 ++- openair3/LPP/MESSAGES/CMakeLists.txt | 2 +- openair3/M3AP/MESSAGES/ASN1/m3ap-14.0.0.cmake | 77 +- openair3/M3AP/MESSAGES/CMakeLists.txt | 2 +- openair3/NGAP/MESSAGES/ASN1/ngap-15.8.0.cmake | 97 ++- openair3/NGAP/MESSAGES/CMakeLists.txt | 2 +- openair3/NRPPA/MESSAGES/ASN1/38455.cmake | 109 ++- openair3/NRPPA/MESSAGES/CMakeLists.txt | 2 +- .../S1AP/MESSAGES/ASN1/R15/s1ap-15.6.0.cmake | 84 +- openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py | 732 ------------------ openair3/S1AP/MESSAGES/CMakeLists.txt | 2 +- 50 files changed, 1063 insertions(+), 2906 deletions(-) delete mode 100644 openair2/F1AP/MESSAGES/ASN1/asn1tostruct.py delete mode 100644 openair2/M2AP/MESSAGES/asn1tostruct.py delete mode 100644 openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py delete mode 100644 openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py diff --git a/CMakeLists.txt b/CMakeLists.txt index a4a4b94028..4778e0bbaf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -307,6 +307,9 @@ if (DEBUG_ASN1C) add_definitions(-DHAVE_CONFIG_H) endif() +# asn1c skeletons need this +add_definitions(-DHAVE_NETINET_IN_H) + ################################################## # ASN.1 grammar C code generation & dependencies # ################################################## @@ -2088,9 +2091,6 @@ add_custom_target ( DEPENDS ${OPENAIR_DIR}/common/utils/T/T_IDs.h ) -# Hack on a test of asn1c version (already dirty) -add_definitions(-DASN1_MINIMUM_VERSION=924) - ################################# # add executables for operation ################################# diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 2d5769e3c9..303bb2a84d 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -677,14 +677,12 @@ install_asn1c_from_source(){ asn1_install_log=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log " ( + $SUDO $INSTALLER -y install bison flex $SUDO rm -rf /tmp/asn1c # GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c - git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c + git clone https://github.com/mouse07410/asn1c /tmp/asn1c cd /tmp/asn1c - # better to use a given commit than a branch in case the branch - # is updated and requires modifications in the source of OAI - #git checkout velichkov_s1ap_plus_option_group - git checkout f12568d617dbf48497588f8e227d70388fa217c9 + git checkout vlm_master autoreconf -iv ./configure make -j`nproc` diff --git a/openair2/E1AP/MESSAGES/ASN.1/38463-g80.R16.78.0.cmake b/openair2/E1AP/MESSAGES/ASN.1/38463-g80.R16.78.0.cmake index 5638ba50d6..7d8340a7b5 100644 --- a/openair2/E1AP/MESSAGES/ASN.1/38463-g80.R16.78.0.cmake +++ b/openair2/E1AP/MESSAGES/ASN.1/38463-g80.R16.78.0.cmake @@ -1,25 +1,53 @@ set(E1AP_GRAMMAR ASN.1/38463-g80.R16.78.0.asn) set(e1ap_source + ANY_aper.c ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c E1AP_ActivityInformation.c E1AP_ActivityNotificationLevel.c E1AP_AdditionalHandoverInfo.c @@ -182,6 +210,7 @@ set(e1ap_source E1AP_Extended-NR-CGI-Support-List.c E1AP_ExtendedPacketDelayBudget.c E1AP_ExtendedSliceSupportList.c + E1AP_EXTERNAL.c E1AP_FirstDLCount.c E1AP_GBR-QoSFlowInformation.c E1AP_GBR-QosInformation.c @@ -450,18 +479,50 @@ set(e1ap_source E1AP_UPSecuritykey.c E1AP_UP-TNL-Information.c E1AP_URIaddress.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c + ObjectDescriptor.c OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c PrintableString.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c UTF8String.c + UTF8String_print.c + UTF8String_rfill.c VisibleString.c xer_decoder.c xer_encoder.c @@ -470,17 +531,21 @@ set(e1ap_source set(e1ap_headers ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -490,7 +555,6 @@ set(e1ap_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h E1AP_ActivityInformation.h E1AP_ActivityNotificationLevel.h E1AP_AdditionalHandoverInfo.h @@ -654,6 +718,7 @@ set(e1ap_headers E1AP_Extended-NR-CGI-Support-List.h E1AP_ExtendedPacketDelayBudget.h E1AP_ExtendedSliceSupportList.h + E1AP_EXTERNAL.h E1AP_FirstDLCount.h E1AP_GBR-QoSFlowInformation.h E1AP_GBR-QosInformation.h @@ -922,9 +987,11 @@ set(e1ap_headers E1AP_UPSecuritykey.h E1AP_UP-TNL-Information.h E1AP_URIaddress.h + GraphicString.h INTEGER.h NativeEnumerated.h NativeInteger.h + ObjectDescriptor.h OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h @@ -933,6 +1000,10 @@ set(e1ap_headers per_opentype.h per_support.h PrintableString.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h UTF8String.h VisibleString.h xer_decoder.h diff --git a/openair2/E1AP/MESSAGES/CMakeLists.txt b/openair2/E1AP/MESSAGES/CMakeLists.txt index a69e703c80..3226e607f3 100644 --- a/openair2/E1AP/MESSAGES/CMakeLists.txt +++ b/openair2/E1AP/MESSAGES/CMakeLists.txt @@ -10,7 +10,7 @@ else() endif() add_custom_command(OUTPUT ${e1ap_source} ${e1ap_headers} - COMMAND ASN1C_PREFIX=E1AP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${E1AP_GRAMMAR} + COMMAND ASN1C_PREFIX=E1AP_ asn1c -gen-APER -gen-UPER -no-gen-JER -no-gen-BER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${E1AP_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${E1AP_GRAMMAR} COMMENT "Generating E1AP source files from ${CMAKE_CURRENT_SOURCE_DIR}/${E1AP_GRAMMAR}" ) diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 888c567fc4..191fa961cd 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -42,6 +42,7 @@ #include "common/ran_context.h" #include "sctp_default_values.h" #include "LTE_SystemInformationBlockType2.h" +#include "uper_decoder.h" #include "LAYER2/MAC/mac_extern.h" #include "LAYER2/MAC/mac_proto.h" #include "PHY/phy_extern.h" diff --git a/openair2/F1AP/MESSAGES/ASN1/asn1tostruct.py b/openair2/F1AP/MESSAGES/ASN1/asn1tostruct.py deleted file mode 100644 index b5f019f486..0000000000 --- a/openair2/F1AP/MESSAGES/ASN1/asn1tostruct.py +++ /dev/null @@ -1,697 +0,0 @@ -import re, os, sys, string -import datetime -import getopt -import getpass - -version = "1.0.2" - -lines = "" -iesDefs = {} -ieofielist = {} -outdir = './' - -filenames = [] -verbosity = 0 -prefix = "" - -FAIL = '\033[91m' -WARN = '\033[93m' -ENDC = '\033[0m' - -fileprefix = "" -fileprefix_first_upper = "" - -def printFail(string): - sys.stderr.write(FAIL + string + ENDC + "\n") - -def printWarning(string): - print WARN + string + ENDC - -def printDebug(string): - if verbosity > 0: - print string - -def outputHeaderToFile(f, filename): - now = datetime.datetime.now() - f.write("""/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -""") - f.write("/*******************************************************************************\n") - f.write(" * This file had been created by asn1tostruct.py script v%s\n" % (version)) - f.write(" * Please do not modify this file but regenerate it via script.\n") - f.write(" * Created on: %s by %s\n * from %s\n" % (str(now), getpass.getuser(), filenames)) - f.write(" ******************************************************************************/\n") - -def lowerFirstCamelWord(word): - """ puts the first word in a CamelCase Word in lowercase. - - I.e. CustomerID becomes customerID, XMLInfoTest becomes xmlInfoTest - """ - newstr = '' - swapped = word.swapcase() - idx = 0 - - # if it's all-caps, return an all-lowered version - lowered = word.lower() - - if swapped == lowered: - return lowered - - for c in swapped: - if c in string.lowercase: - newstr += c - idx += 1 - else: - break - if idx < 2: - newstr += word[idx:] - else: - newstr = newstr[:-1]+ word[idx-1:] - - return newstr - -def usage(): - print "Python parser for asn1 v%s" % (version) - print "Usage: python asn1tostruct.py [options]" - print "Available options:" - print "-d Enable script debug" - print "-f [file] Input file to parse" - print "-o [dir] Output files to given directory" - print "-h Print this help and return" - -try: - opts, args = getopt.getopt(sys.argv[1:], "df:ho:", ["debug", "file", "help", "outdir"]) -except getopt.GetoptError as err: - # print help information and exit: - usage() - sys.exit(2) - -for o, a in opts: - if o in ("-f", "--file"): - filenames.append(a) - if o in ("-d", "--debug"): - verbosity = 1 - if o in ("-o", "--outdir"): - outdir = a - if outdir.rfind('/') != len(outdir): - outdir += '/' - if o in ("-h", "--help"): - usage() - sys.exit(2) - -for filename in filenames: - file = open(filename, 'r') - for line in file: - # Removing any comment - if line.find('--') >= 0: - line = line[:line.find('--')] - # Removing any carriage return - lines += re.sub('\r', '', line) - - for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+SEQUENCE\s+\(\s*SIZE\s*\(\s*\d+\s*\.\.\s*[0-9a-zA-Z-]+\s*\)\s*\)\s*OF\s+[a-zA-Z-]+\s*\{\s*\{\s*([0-9a-zA-Z-]+)\s*\}\s*\}', lines, re.MULTILINE): - ieofielist[m[0]] = m[1] - for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+E-RAB-IE-ContainerList\s*\{\s*\{\s*([a-zA-Z0-9-]+)\s*\}\s*\}', lines, re.MULTILINE): - ieofielist[m[0]] = m[1] - - for i in re.findall(r'([a-zA-Z0-9-]+)\s+([A-Z0-9-]+)\s*::=\s*\{\s+([\,\|\{\}\t\n\.{3}\ \-a-zA-Z0-9]+)\s+}\n?', lines, re.MULTILINE): - ies = [] - maxLength = 0 - # TODO: handle extensions - if i[1].find('EXTENSION') >= 0: - continue - if fileprefix == "": - fileprefix = i[1][:i[1].find('-')].lower() - for j in re.findall(r'\s*\{\s*([a-zA-Z0-9-\ \t]+)\s*\}\s*[\|,]*', i[2], re.MULTILINE): - for k in re.findall(r'ID\s*([a-zA-Z0-9\-]+)\s*CRITICALITY\s*([a-zA-Z0-9\-]+)\s+[A-Z]+\s+([a-zA-Z0-9\-]+)\s*PRESENCE\s*([a-zA-Z0-9\-]+)', j, re.MULTILINE): - printDebug("Got new ie for message " + i[0] + ": " + str(k)) - if len(k[2]) > maxLength: - maxLength = len(k[2]) - ies.append(k) - - if len(ies) > 0: - iesDefs[i[0]] = { "length": maxLength, "ies": ies } - else: - printWarning("Didn't find any information element for message: " + i[0]) - -if len(iesDefs) == 0: - printFail("No Information Element parsed, exiting") - sys.exit(0) - -fileprefix_first_upper = fileprefix[0].upper() + fileprefix[1:] - -f = open(outdir + fileprefix + '_ies_defs.h', 'w') -outputHeaderToFile(f, filename) -f.write("#include \"%s_common.h\"\n\n" % (fileprefix)) -f.write("#ifndef %s_IES_DEFS_H_\n#define %s_IES_DEFS_H_\n\n" % (fileprefix.upper(), fileprefix.upper())) -f.write("/* Define the version of script used to generate this file */\n") -f.write("#define %s_SCRIPT_VERSION (%s)\n\n" % (fileprefix.upper(), re.sub('\.', '', version))) - -for key in iesDefs: - - if key not in ieofielist.values(): - continue - - for (i, j) in ieofielist.items(): - if j == key: - break - - f.write("typedef struct %sIEs_s {\n" % (re.sub('-', '_', i))) - f.write(" A_SEQUENCE_OF(struct %s_s) %s;\n" % (re.sub('IEs', '', re.sub('-', '_', ieofielist[i])), lowerFirstCamelWord(re.sub('IEs', '', re.sub('-', '_', ieofielist[i]))))) - f.write("} %sIEs_t;\n\n" % (re.sub('-', '_', i))) - -for key in iesDefs: - keyupperunderscore = re.sub('-', '_', key.upper()) - keylowerunderscore = re.sub('-', '_', key.lower()) - shift = 0 - - if len(iesDefs[key]["ies"]) == 0: - continue - - # Presence mask - for ie in iesDefs[key]["ies"]: - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] == "optional" or ie[3] == "conditional": - f.write("#define {0:<{pad}} {1}\n".format("%s_%s_PRESENT" % (keyupperunderscore, ieupperunderscore), "(1 << %d)" % shift, - pad=iesDefs[key]["length"] + len(keyupperunderscore) + 9)) - shift += 1 - if (shift > 0): - f.write("\n") - - f.write("typedef struct %s_s {\n" % (re.sub('-', '_', key))) - if (shift > 0): - f.write(" {0:<{pad}} {1};\n".format("uint16_t", "presenceMask", pad=iesDefs[key]["length"] + 2)) - for ie in iesDefs[key]["ies"]: - ieunderscore = re.sub('-', '_', ie[2]) - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - if ie[2] in ieofielist: - f.write(" %sIEs_t %s;" % (re.sub('-', '_', ie[2]), ienameunderscore)) - else: - f.write(" {0:<{pad}} {1};".format("%s_t" % ieunderscore, ienameunderscore, pad=iesDefs[key]["length"] + 2)) - if ie[3] == "optional": - f.write(" ///< Optional field") - elif ie[3] == "conditional": - f.write(" ///< Conditional field") - f.write("\n") - - f.write("} %s_t;\n\n" % (re.sub('-', '_', key))) - -f.write("typedef struct %s_message_s {\n" % (fileprefix)) -f.write(" %s_ProcedureCode_t procedureCode;\n" % (fileprefix_first_upper)) -f.write(" %s_Criticality_t criticality;\n" % (fileprefix_first_upper)) -f.write(" uint8_t direction;\n") -f.write(" union {\n") - -messageList = iesDefs.keys() -messageList.sort() -for message in messageList: - if message in ieofielist.values(): - continue - if len(iesDefs[message]["ies"]) == 0: - continue - f.write(" %s_t %s;\n" % (re.sub('-', '_', message), lowerFirstCamelWord(re.sub('-', '_', message)))) -f.write(" } msg;\n") -f.write("} %s_message;\n\n" % (fileprefix)) - -for key in iesDefs: - if key in ieofielist.values(): - continue - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - keylowerunderscore = re.sub('-', '_', key.lower()) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - f.write("/** \\brief Decode function for %s ies.\n" % (key)) - if len(iesDefs[key]["ies"]) != 0: - f.write(" * \\param %s Pointer to ASN1 structure in which data will be stored\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" * \\param any_p Pointer to the ANY value to decode.\n") - f.write(" **/\n") - f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore)) - - if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" ANY_t *any_p);\n\n") - - if len(iesDefs[key]["ies"]) == 0: - continue - - f.write("/** \\brief Encode function for %s ies.\n" % (key)) - f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" **/\n") - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - -for key in iesDefs: - if key not in ieofielist.values(): - continue - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - f.write("/** \\brief Encode function for %s ies.\n" % (key)) - f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" **/\n") - f.write("int %s_encode_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %sIEs_t *%sIEs);\n\n" % (asn1cStruct, firstlower)) - f.write("/** \\brief Decode function for %s ies.\n" % (key)) - f.write(" * \\param any_p Pointer to the ANY value to decode.\n") - f.write(" * \\param callback Callback function called when any_p is successfully decoded.\n") - f.write(" **/\n") - f.write("int %s_decode_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" %sIEs_t *%sIEs,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (asn1cStruct, lowerFirstCamelWord(asn1cStruct))) - -for key in iesDefs: - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - if key in ieofielist.values(): - f.write("/** \\brief Display %s encapsulated IE using XER encoding.\n" % (asn1cStruct)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" * \\param file File descriptor to write output.\n") - f.write(" **/\n") - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('item', 'list', firstlower.lower()))) - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - f.write(" %sIEs_t *%sIEs);\n\n" % (re.sub('item', 'list', asn1cStruct), firstlower)) - else: - f.write("/** \\brief Display %s message using XER encoding.\n" % (asn1cStruct)) - f.write(" * \\param message_p Pointer to root message.\n") - f.write(" * \\param file File descriptor to write output.\n") - f.write(" **/\n") - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - f.write(" %s_message *message_p);\n\n" % (fileprefix)) - -f.write("int %s_xer__print2sp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower())) -f.write("int %s_xer__print2fp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower())) -f.write("extern size_t %s_string_total_size;\n\n" % (fileprefix.lower())) -f.write("#endif /* %s_IES_DEFS_H_ */\n\n" % (fileprefix.upper())) - -#Generate Decode functions -f = open(outdir + fileprefix + '_decoder.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix)) -for key in iesDefs: - if key in ieofielist.values(): - continue - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: - asn1cStruct = asn1cStruct[:-1] - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - ielistname = re.sub('UE', 'ue', asn1cStruct) - ielistnamefirstlower = ielistname[:1].lower() + ielistname[1:] - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - iesaccess = "" - if key not in ieofielist.values(): - iesaccess = "%s_ies." % (firstlower) - - f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" ANY_t *any_p) {\n\n") - - f.write(" %s_t %s;\n %s_t *%s_p = &%s;\n" % (asn1cStruct, asn1cStructfirstlower, asn1cStruct, asn1cStructfirstlower, asn1cStructfirstlower)) - f.write(" int i, decoded = 0;\n") - if len(iesDefs[key]["ies"]) != 0: - f.write(" int tempDecoded = 0;\n") - - f.write(" assert(any_p != NULL);\n") - if len(iesDefs[key]["ies"]) != 0: - f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - - f.write(" %s_DEBUG(\"Decoding message %s (%%s:%%d)\\n\", __FILE__, __LINE__);\n\n" % (fileprefix.upper(), re.sub('-', '_', keyName))) - f.write(" ANY_to_type_aper(any_p, &asn_DEF_%s, (void**)&%s_p);\n\n" % (asn1cStruct, asn1cStructfirstlower)) - f.write(" for (i = 0; i < %s_p->%slist.count; i++) {\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" %s_IE_t *ie_p;\n" % (fileprefix[0].upper() + fileprefix[1:])) - f.write(" ie_p = %s_p->%slist.array[i];\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" switch(ie_p->id) {\n") - for ie in iesDefs[key]["ies"]: - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - ienameunderscorefirstlower = lowerFirstCamelWord(ienameunderscore) - ietypesubst = re.sub('-', '', ie[2]) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" {\n") - f.write(" %s_t *%s_p = NULL;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - if ie[3] != "mandatory": - f.write(" %s->presenceMask |= %s_%s_PRESENT;\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) - f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(ietypesubst))) - f.write(" %s_ERROR(\"Decoding of IE %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore)) - f.write(" if (%s_p)\n" % (lowerFirstCamelWord(ietypesubst))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" decoded += tempDecoded;\n") - f.write(" if (asn1_xer_print)\n") - f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - if ie[2] in ieofielist.keys(): - f.write(" if (%s_decode_%s(&%s->%s, %s_p) < 0) {\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" %s_ERROR(\"Decoding of encapsulated IE %s failed\\n\");\n" % (fileprefix.upper(), lowerFirstCamelWord(ietypesubst))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" }\n") - else: - f.write(" memcpy(&%s->%s, %s_p, sizeof(%s_t));\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst), ietypeunderscore)) - #f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" } break;\n") - f.write(" default:\n") - f.write(" %s_ERROR(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower()))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" }\n") - f.write(" return decoded;\n") - f.write("}\n\n") - -for key in iesDefs: - if key not in ieofielist.values(): - continue - - keyname = re.sub('IEs', '', re.sub('Item', 'List', key)) - - f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', keyname).lower())) - f.write(" %sIEs_t *%sIEs,\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" int i, decoded = 0;\n") - f.write(" int tempDecoded = 0;\n\n") - - f.write(" assert(%s != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))); - f.write(" assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))); - - f.write(" for (i = 0; i < %s->list.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_IE_t *ie_p = %s->list.array[i];\n" % (fileprefix[0].upper() + fileprefix[1:], lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" switch (ie_p->id) {\n") - for ie in iesDefs[key]["ies"]: - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - f.write(" case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" {\n") - f.write(" %s_t *%s_p = NULL;\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" %s_ERROR(\"Decoding of IE %s for message %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore, re.sub('-', '_', keyname))) - f.write(" if (%s_p)\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - #f.write(" free(%s_p);\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" decoded += tempDecoded;\n") - f.write(" if (asn1_xer_print)\n") - f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" ASN_SEQUENCE_ADD(&%sIEs->%s, %s_p);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)), - re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" } break;\n") - f.write(" default:\n") - f.write(" %s_ERROR(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower()))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" }\n") - f.write(" return decoded;\n") - f.write("}\n\n") - - -#Generate IES Encode functions -f = open(outdir + fileprefix + '_encoder.c', 'w') -outputHeaderToFile(f,filename) -f.write("#include \"%s_common.h\"\n" % (fileprefix)) -f.write("#include \"%s_ies_defs.h\"\n\n" % (fileprefix)) -for key in iesDefs: - if key in ieofielist.values(): - continue - - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: - asn1cStruct = asn1cStruct[:-1] - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - iesaccess = "" - if key not in ieofielist.values(): - iesaccess = "%s_ies." % (firstwordlower) - - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - # No IE to encode... - if len(iesDefs[key]["ies"]) == 0: - continue - - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - - f.write(" %s_IE_t *ie;\n\n" % (fileprefix_first_upper)) - - f.write(" assert(%s != NULL);\n" % (firstwordlower)); - f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))); - - for ie in iesDefs[key]["ies"]: - iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) - ienamefirstwordlower = lowerFirstCamelWord(iename) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - ietypeunderscore = re.sub('-', '_', ie[2]) - - if ie[3] != "mandatory": - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" if (%s->presenceMask & %s_%s_PRESENT) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) - #f.write(" == %s_%s_PRESENT) {\n" % (keyupperunderscore, ieupperunderscore)) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n" % (firstwordlower, iesaccess)) - f.write(" }\n\n") - else: - if ie[2] in ieofielist.keys(): - f.write(" %s_t %s;\n\n" % (ietypeunderscore, ienamefirstwordlower)) - f.write(" memset(&%s, 0, sizeof(%s_t));\n" % (ienamefirstwordlower, ietypeunderscore)) - f.write("\n") - f.write(" if (%s_encode_%s(&%s, &%s->%s) < 0) return -1;\n" % (fileprefix, ietypeunderscore.lower(), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - if ie[2] in ieofielist.keys(): - f.write(" &%s)) == NULL) {\n" % (ienamefirstwordlower)) - else: - f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n\n" % (firstwordlower, iesaccess)) - if ie[2] in ieofielist.keys(): - f.write(" /* Free any dynamic allocation that is no more used */\n") - f.write(" ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_%s, &%s);\n\n" % (ietypeunderscore, ienamefirstwordlower)) - - f.write(" return 0;\n") - f.write("}\n\n") - -for (key, value) in iesDefs.items(): - if key not in ieofielist.values(): - continue - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - for (i, j) in ieofielist.items(): - if j == key: - break - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', i).lower())) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %sIEs_t *%sIEs) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) - f.write(" int i;\n") - - f.write(" %s_IE_t *ie;\n\n" % (fileprefix_first_upper)) - - f.write(" assert(%s != NULL);\n" % (firstwordlower)); - f.write(" assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', i)))); - - f.write(" for (i = 0; i < %sIEs->%s.count; i++) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - f.write(" %sIEs->%s.array[i])) == NULL) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->list, ie);\n" % (firstwordlower)) - f.write(" }\n") - f.write(" return 0;\n") - f.write("}\n\n") - -#Generate xer print functions -f = open(outdir + fileprefix + '_xer_print.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \n") -f.write("#include \n\n") -f.write("#include \n#include \n\n") -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix)) - -f.write("size_t %s_string_total_size = 0;\n\n" % (fileprefix.lower())) -f.write("""int -%s_xer__print2fp(const void *buffer, size_t size, void *app_key) { - FILE *stream = (FILE *)app_key; - - if(fwrite(buffer, 1, size, stream) != size) - return -1; - - return 0; -} - -""" % (fileprefix.lower())) - -f.write("""int %s_xer__print2sp(const void *buffer, size_t size, void *app_key) { - char *string = (char *)app_key; - - /* Copy buffer to the formatted string */ - memcpy(&string[%s_string_total_size], buffer, size); - - %s_string_total_size += size; - - return 0; -} - -""" % (fileprefix.lower(), fileprefix.lower(), fileprefix.lower())) - -f.write("""static asn_enc_rval_t -xer_encode_local(asn_TYPE_descriptor_t *td, void *sptr, - asn_app_consume_bytes_f *cb, void *app_key, int indent) { - asn_enc_rval_t er, tmper; - const char *mname; - size_t mlen; - int xcan = 2; - - if(!td || !sptr) goto cb_failed; - - mname = td->xml_tag; - mlen = strlen(mname); - - _i_ASN_TEXT_INDENT(0, indent); - _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); - - tmper = td->xer_encoder(td, sptr, indent + 1, XER_F_BASIC, cb, app_key); - if(tmper.encoded == -1) return tmper; - - _ASN_CALLBACK3("\\n", xcan); - - er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; - - _ASN_ENCODED_OK(er); -cb_failed: - _ASN_ENCODE_FAILED; -} -""") - -for (key, value) in iesDefs.items(): - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - iesStructName = lowerFirstCamelWord(re.sub('-', '_', key)) - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - - if key in ieofielist.values(): - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('item', 'list', re.sub('-', '_', key).lower())))) - else: - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', key).lower()))) - #f.write(" FILE *file,\n") - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - if key in ieofielist.values(): - iesStructName = lowerFirstCamelWord(re.sub('Item', 'List', re.sub('-', '_', key))) - f.write(" %sIEs_t *%s) {\n\n" % (re.sub('IEs', '', re.sub('Item', 'List', re.sub('-', '_', key))), iesStructName)) - f.write(" int i;\n") - f.write(" asn_enc_rval_t er;\n") - else: - f.write(" %s_message *message_p)\n{\n" % (fileprefix)) - f.write(" %s_t *%s;\n" % (re.sub('-', '_', key), iesStructName)) - f.write(" asn_enc_rval_t er;\n") - #f.write(" void *app_key = (void *)file;\n") - #f.write(" asn_app_consume_bytes_f *cb = %s_xer__print2fp;\n\n" % (fileprefix.lower())) - - f.write(" %s = &message_p->msg.%s;\n\n" % (iesStructName, iesStructName)) - - if key in ieofielist.values(): - # Increase indentation level - f.write(" for (i = 0; i < %s->%s.count; i++) {\n" % (iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - #f.write(" xer_fprint(file, &asn_DEF_%s, %s->%s.array[i]);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" er = xer_encode(&asn_DEF_%s, %s->%s.array[i], XER_F_BASIC, cb, app_key);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" }\n") - else: - f.write(" cb(\"<%s-PDU>\\n\", %d, app_key);\n" % (key, len("<%s-PDU>\n" % (key)))) - f.write(" xer_encode_local(&asn_DEF_%s_Criticality, &message_p->criticality, cb, app_key, 1);\n" % fileprefix_first_upper) - f.write(" xer_encode_local(&asn_DEF_%s_ProcedureCode, &message_p->procedureCode, cb, app_key, 1);\n" % fileprefix_first_upper) - - f.write(" cb(\" <%s>\\n\", %d, app_key);\n" % (key, len(" <%s>\n" % (key)))) - - for ie in iesDefs[key]["ies"]: - iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) - ienamefirstwordlower = lowerFirstCamelWord(iename) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] != "mandatory": - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" if (%s->presenceMask & %s_%s_PRESENT)\n " % (iesStructName, keyupperunderscore, ieupperunderscore)) - - # Is it an encapsulated IE ? - if ie[2] in ieofielist.keys(): - f.write(" %s_xer_print_%s(cb, app_key, &%s->%s);\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', ie[2]).lower()), iesStructName, ienamefirstwordlower)) - else: - f.write(" xer_encode_local(&asn_DEF_%s, &%s->%s, cb, app_key, 2);\n" % (ietypeunderscore, iesStructName, ienamefirstwordlower)) - f.write(" cb(\" \\n\", %d, app_key);\n" % (key, len(" \n" % (key)))) - f.write(" cb(\"\\n\", %d, app_key);\n" % (key, len("\n" % (key)))) - - f.write(" _ASN_ENCODED_OK(er);\n") - #if key not in ieofielist.values(): - #f.write("cb_failed:\n") - #f.write(" return er;\n") - f.write("}\n\n") diff --git a/openair2/F1AP/MESSAGES/ASN1/f1ap-16.3.1.cmake b/openair2/F1AP/MESSAGES/ASN1/f1ap-16.3.1.cmake index 9f026aa11b..fa62b91e70 100644 --- a/openair2/F1AP/MESSAGES/ASN1/f1ap-16.3.1.cmake +++ b/openair2/F1AP/MESSAGES/ASN1/f1ap-16.3.1.cmake @@ -1,26 +1,59 @@ set(F1AP_GRAMMAR ASN1/R16.3.1/38473-g31.asn) set(f1ap_source + ANY_aper.c ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c + BOOLEAN_aper.c BOOLEAN.c + BOOLEAN_print.c + BOOLEAN_rfill.c + BOOLEAN_uper.c + BOOLEAN_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c F1AP_AbortTransmission.c F1AP_AccessAndMobilityIndication.c F1AP_AccessPointPosition.c @@ -295,6 +328,7 @@ set(f1ap_source F1AP_ExtendedServedPLMNs-Item.c F1AP_ExtendedServedPLMNs-List.c F1AP_ExtendedSliceSupportList.c + F1AP_EXTERNAL.c F1AP_F1AP-PDU.c F1AP_F1RemovalFailure.c F1AP_F1RemovalRequest.c @@ -969,19 +1003,56 @@ set(f1ap_source F1AP_VictimgNBSetID.c F1AP_WriteReplaceWarningRequest.c F1AP_WriteReplaceWarningResponse.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c + NULL_aper.c NULL.c + NULL_print.c + NULL_rfill.c + NULL_uper.c + NULL_xer.c + ObjectDescriptor.c OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c PrintableString.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c UTF8String.c + UTF8String_print.c + UTF8String_rfill.c VisibleString.c xer_decoder.c xer_encoder.c @@ -990,17 +1061,21 @@ set(f1ap_source set(f1ap_headers ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -1011,7 +1086,6 @@ set(f1ap_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h F1AP_AbortTransmission.h F1AP_AccessAndMobilityIndication.h F1AP_AccessPointPosition.h @@ -1287,6 +1361,7 @@ set(f1ap_headers F1AP_ExtendedServedPLMNs-Item.h F1AP_ExtendedServedPLMNs-List.h F1AP_ExtendedSliceSupportList.h + F1AP_EXTERNAL.h F1AP_F1AP-PDU.h F1AP_F1RemovalFailure.h F1AP_F1RemovalRequest.h @@ -1961,10 +2036,12 @@ set(f1ap_headers F1AP_VictimgNBSetID.h F1AP_WriteReplaceWarningRequest.h F1AP_WriteReplaceWarningResponse.h + GraphicString.h INTEGER.h NativeEnumerated.h NativeInteger.h NULL.h + ObjectDescriptor.h OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h @@ -1973,6 +2050,10 @@ set(f1ap_headers per_opentype.h per_support.h PrintableString.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h UTF8String.h VisibleString.h xer_decoder.h diff --git a/openair2/F1AP/MESSAGES/CMakeLists.txt b/openair2/F1AP/MESSAGES/CMakeLists.txt index 01529b65cd..95bbbf5914 100644 --- a/openair2/F1AP/MESSAGES/CMakeLists.txt +++ b/openair2/F1AP/MESSAGES/CMakeLists.txt @@ -9,7 +9,7 @@ else() endif() add_custom_command(OUTPUT ${f1ap_source} ${f1ap_headers} - COMMAND ASN1C_PREFIX=F1AP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${F1AP_GRAMMAR} + COMMAND ASN1C_PREFIX=F1AP_ asn1c -gen-APER -no-gen-BER -no-gen-JER -no-gen-OER -gen-UPER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${F1AP_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${F1AP_GRAMMAR} COMMENT "Generating F1AP source files from ${CMAKE_CURRENT_SOURCE_DIR}/${F1AP_GRAMMAR}" ) diff --git a/openair2/F1AP/f1ap_du_rrc_message_transfer.c b/openair2/F1AP/f1ap_du_rrc_message_transfer.c index c2fefec662..ff99525487 100644 --- a/openair2/F1AP/f1ap_du_rrc_message_transfer.c +++ b/openair2/F1AP/f1ap_du_rrc_message_transfer.c @@ -37,6 +37,8 @@ #include "f1ap_du_rrc_message_transfer.h" +#include "uper_decoder.h" + #include "NR_DL-CCCH-Message.h" #include "NR_UL-CCCH-Message.h" #include "NR_DL-DCCH-Message.h" diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index b59aa6e823..ba965349a7 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -83,6 +83,8 @@ #include "NR_SearchSpace.h" #include "NR_ControlResourceSet.h" #include "NR_EUTRA-MBSFN-SubframeConfig.h" +#include "uper_decoder.h" +#include "uper_encoder.h" #include "RRC/NR/MESSAGES/asn1_msg.h" #include "RRC/NR/nr_rrc_extern.h" diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 4ba189c4bd..77fdf732cb 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -39,6 +39,7 @@ #include "NR_BCCH-BCH-Message.h" #include "NR_ServingCellConfigCommon.h" +#include "uper_encoder.h" #include "LAYER2/NR_MAC_gNB/mac_proto.h" #include "SCHED_NR/phy_frame_config_nr.h" diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 0b5e261c5b..ce70ac6e57 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -28,6 +28,7 @@ */ #include "platform_types.h" +#include "uper_decoder.h" /* MAC */ #include "nr_mac_gNB.h" diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 9794a55e7e..5b2a208941 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -50,6 +50,9 @@ #include "T.h" +#include "uper_encoder.h" +#include "uper_decoder.h" + #define ENABLE_MAC_PAYLOAD_DEBUG #define DEBUG_gNB_SCHEDULER 1 diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c index 006db8ac44..500755cff3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c @@ -25,6 +25,9 @@ #include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "openair2/RRC/NR/MESSAGES/asn1_msg.h" +#include "uper_decoder.h" +#include "uper_encoder.h" + static NR_RLC_BearerConfig_t *get_bearerconfig_from_srb(const f1ap_srb_to_be_setup_t *srb) { long priority = srb->srb_id; // high priority for SRB diff --git a/openair2/M2AP/MESSAGES/ASN1/m2ap-14.0.0.cmake b/openair2/M2AP/MESSAGES/ASN1/m2ap-14.0.0.cmake index 38bc871be3..3cf95c8fa5 100644 --- a/openair2/M2AP/MESSAGES/ASN1/m2ap-14.0.0.cmake +++ b/openair2/M2AP/MESSAGES/ASN1/m2ap-14.0.0.cmake @@ -1,26 +1,60 @@ set(M2AP_GRAMMAR ASN1/m2ap-14.0.0.asn) set(m2ap_source + ANY_aper.c ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c M2AP_Active-MBMS-Session-List.c M2AP_AllocatedSubframesEnd.c M2AP_AllocationAndRetentionPriority.c @@ -51,6 +85,7 @@ set(m2ap_source M2AP_ENBname.c M2AP_ErrorIndication.c M2AP_EUTRANCellIdentifier.c + M2AP_EXTERNAL.c M2AP_GBR-QosInformation.c M2AP_GlobalENB-ID.c M2AP_GlobalMCE-ID.c @@ -154,16 +189,40 @@ set(m2ap_source M2AP_TriggeringMessage.c M2AP_TypeOfError.c M2AP_UnsuccessfulOutcome.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c + ObjectDescriptor.c OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c PrintableString.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c xer_decoder.c xer_encoder.c xer_support.c @@ -171,17 +230,21 @@ set(m2ap_source set(m2ap_headers ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -191,7 +254,7 @@ set(m2ap_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h + GraphicString.h INTEGER.h M2AP_Active-MBMS-Session-List.h M2AP_AllocatedSubframesEnd.h @@ -224,6 +287,7 @@ set(m2ap_headers M2AP_ENBname.h M2AP_ErrorIndication.h M2AP_EUTRANCellIdentifier.h + M2AP_EXTERNAL.h M2AP_GBR-QosInformation.h M2AP_GlobalENB-ID.h M2AP_GlobalMCE-ID.h @@ -329,6 +393,7 @@ set(m2ap_headers M2AP_UnsuccessfulOutcome.h NativeEnumerated.h NativeInteger.h + ObjectDescriptor.h OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h @@ -337,6 +402,10 @@ set(m2ap_headers per_opentype.h per_support.h PrintableString.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h xer_decoder.h xer_encoder.h xer_support.h diff --git a/openair2/M2AP/MESSAGES/CMakeLists.txt b/openair2/M2AP/MESSAGES/CMakeLists.txt index 27c3758028..57d454e82d 100644 --- a/openair2/M2AP/MESSAGES/CMakeLists.txt +++ b/openair2/M2AP/MESSAGES/CMakeLists.txt @@ -19,7 +19,7 @@ else() endif() add_custom_command(OUTPUT ${m2ap_source} ${m2ap_headers} - COMMAND ASN1C_PREFIX=M2AP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${M2AP_GRAMMAR} + COMMAND ASN1C_PREFIX=M2AP_ asn1c -gen-APER -no-gen-BER -no-gen-JER -no-gen-OER -gen-UPER -fcompound-names -no-gen-example -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${M2AP_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${M2AP_GRAMMAR} COMMENT "Generating M2AP source files from ${CMAKE_CURRENT_SOURCE_DIR}/${M2AP_GRAMMAR}" ) diff --git a/openair2/M2AP/MESSAGES/asn1tostruct.py b/openair2/M2AP/MESSAGES/asn1tostruct.py deleted file mode 100644 index 8c0f7e8a16..0000000000 --- a/openair2/M2AP/MESSAGES/asn1tostruct.py +++ /dev/null @@ -1,697 +0,0 @@ -import re, os, sys, string -import datetime -import getopt -import getpass - -version = "1.0.2" - -lines = "" -iesDefs = {} -ieofielist = {} -outdir = './' - -filenames = [] -verbosity = 0 -prefix = "" - -FAIL = '\033[91m' -WARN = '\033[93m' -ENDC = '\033[0m' - -fileprefix = "" -fileprefix_first_upper = "" - -def printFail(string): - sys.stderr.write(FAIL + string + ENDC + "\n") - -def printWarning(string): - print WARN + string + ENDC - -def printDebug(string): - if verbosity > 0: - print string - -def outputHeaderToFile(f, filename): - now = datetime.datetime.now() - f.write("""/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -""") - f.write("/*******************************************************************************\n") - f.write(" * This file had been created by asn1tostruct.py script v%s\n" % (version)) - f.write(" * Please do not modify this file but regenerate it via script.\n") - f.write(" * Created on: %s by %s\n * from %s\n" % (str(now), getpass.getuser(), filenames)) - f.write(" ******************************************************************************/\n") - -def lowerFirstCamelWord(word): - """ puts the first word in a CamelCase Word in lowercase. - - I.e. CustomerID becomes customerID, XMLInfoTest becomes xmlInfoTest - """ - newstr = '' - swapped = word.swapcase() - idx = 0 - - # if it's all-caps, return an all-lowered version - lowered = word.lower() - - if swapped == lowered: - return lowered - - for c in swapped: - if c in string.lowercase: - newstr += c - idx += 1 - else: - break - if idx < 2: - newstr += word[idx:] - else: - newstr = newstr[:-1]+ word[idx-1:] - - return newstr - -def usage(): - print "Python parser for asn1 v%s" % (version) - print "Usage: python asn1tostruct.py [options]" - print "Available options:" - print "-d Enable script debug" - print "-f [file] Input file to parse" - print "-o [dir] Output files to given directory" - print "-h Print this help and return" - -try: - opts, args = getopt.getopt(sys.argv[1:], "df:ho:", ["debug", "file", "help", "outdir"]) -except getopt.GetoptError as err: - # print help information and exit: - usage() - sys.exit(2) - -for o, a in opts: - if o in ("-f", "--file"): - filenames.append(a) - if o in ("-d", "--debug"): - verbosity = 1 - if o in ("-o", "--outdir"): - outdir = a - if outdir.rfind('/') != len(outdir): - outdir += '/' - if o in ("-h", "--help"): - usage() - sys.exit(2) - -for filename in filenames: - file = open(filename, 'r') - for line in file: - # Removing any comment - if line.find('--') >= 0: - line = line[:line.find('--')] - # Removing any carriage return - lines += re.sub('\r', '', line) - - for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+SEQUENCE\s+\(\s*SIZE\s*\(\s*\d+\s*\.\.\s*[0-9a-zA-Z-]+\s*\)\s*\)\s*OF\s+[a-zA-Z-]+\s*\{\s*\{\s*([0-9a-zA-Z-]+)\s*\}\s*\}', lines, re.MULTILINE): - ieofielist[m[0]] = m[1] - for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+E-RAB-IE-ContainerList\s*\{\s*\{\s*([a-zA-Z0-9-]+)\s*\}\s*\}', lines, re.MULTILINE): - ieofielist[m[0]] = m[1] - - for i in re.findall(r'([a-zA-Z0-9-]+)\s+([A-Z0-9-]+)\s*::=\s*\{\s+([\,\|\{\}\t\n\.{3}\ \-a-zA-Z0-9]+)\s+}\n', lines, re.MULTILINE): - ies = [] - maxLength = 0 - # TODO: handle extensions - if i[1].find('EXTENSION') >= 0: - continue - if fileprefix == "": - fileprefix = i[1][:i[1].find('-')].lower() - for j in re.findall(r'\s*\{\s*([a-zA-Z0-9-\ \t]+)\s*\}\s*[\|,]*', i[2], re.MULTILINE): - for k in re.findall(r'ID\s*([a-zA-Z0-9\-]+)\s*CRITICALITY\s*([a-zA-Z0-9\-]+)\s+[A-Z]+\s+([a-zA-Z0-9\-]+)\s*PRESENCE\s*([a-zA-Z0-9\-]+)', j, re.MULTILINE): - printDebug("Got new ie for message " + i[0] + ": " + str(k)) - if len(k[2]) > maxLength: - maxLength = len(k[2]) - ies.append(k) - - if len(ies) > 0: - iesDefs[i[0]] = { "length": maxLength, "ies": ies } - else: - printWarning("Didn't find any information element for message: " + i[0]) - -if len(iesDefs) == 0: - printFail("No Information Element parsed, exiting") - sys.exit(0) - -fileprefix_first_upper = fileprefix[0].upper() + fileprefix[1:] - -f = open(outdir + fileprefix + '_ies_defs.h', 'w') -outputHeaderToFile(f, filename) -f.write("#include \"%s_common.h\"\n\n" % (fileprefix)) -f.write("#ifndef %s_IES_DEFS_H_\n#define %s_IES_DEFS_H_\n\n" % (fileprefix.upper(), fileprefix.upper())) -f.write("/* Define the version of script used to generate this file */\n") -f.write("#define %s_SCRIPT_VERSION (%s)\n\n" % (fileprefix.upper(), re.sub('\.', '', version))) - -for key in iesDefs: - - if key not in ieofielist.values(): - continue - - for (i, j) in ieofielist.items(): - if j == key: - break - - f.write("typedef struct %sIEs_s {\n" % (re.sub('-', '_', i))) - f.write(" A_SEQUENCE_OF(struct %s_s) %s;\n" % (re.sub('IEs', '', re.sub('-', '_', ieofielist[i])), lowerFirstCamelWord(re.sub('IEs', '', re.sub('-', '_', ieofielist[i]))))) - f.write("} %sIEs_t;\n\n" % (re.sub('-', '_', i))) - -for key in iesDefs: - keyupperunderscore = re.sub('-', '_', key.upper()) - keylowerunderscore = re.sub('-', '_', key.lower()) - shift = 0 - - if len(iesDefs[key]["ies"]) == 0: - continue - - # Presence mask - for ie in iesDefs[key]["ies"]: - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] == "optional" or ie[3] == "conditional": - f.write("#define {0:<{pad}} {1}\n".format("%s_%s_PRESENT" % (keyupperunderscore, ieupperunderscore), "(1 << %d)" % shift, - pad=iesDefs[key]["length"] + len(keyupperunderscore) + 9)) - shift += 1 - if (shift > 0): - f.write("\n") - - f.write("typedef struct %s_s {\n" % (re.sub('-', '_', key))) - if (shift > 0): - f.write(" {0:<{pad}} {1};\n".format("uint16_t", "presenceMask", pad=iesDefs[key]["length"] + 2)) - for ie in iesDefs[key]["ies"]: - ieunderscore = re.sub('-', '_', ie[2]) - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - if ie[2] in ieofielist: - f.write(" %sIEs_t %s;" % (re.sub('-', '_', ie[2]), ienameunderscore)) - else: - f.write(" {0:<{pad}} {1};".format("%s_t" % ieunderscore, ienameunderscore, pad=iesDefs[key]["length"] + 2)) - if ie[3] == "optional": - f.write(" ///< Optional field") - elif ie[3] == "conditional": - f.write(" ///< Conditional field") - f.write("\n") - - f.write("} %s_t;\n\n" % (re.sub('-', '_', key))) - -f.write("typedef struct %s_message_s {\n" % (fileprefix)) -f.write(" %s_ProcedureCode_t procedureCode;\n" % (fileprefix_first_upper)) -f.write(" %s_Criticality_t criticality;\n" % (fileprefix_first_upper)) -f.write(" uint8_t direction;\n") -f.write(" union {\n") - -messageList = iesDefs.keys() -messageList.sort() -for message in messageList: - if message in ieofielist.values(): - continue - if len(iesDefs[message]["ies"]) == 0: - continue - f.write(" %s_t %s;\n" % (re.sub('-', '_', message), lowerFirstCamelWord(re.sub('-', '_', message)))) -f.write(" } msg;\n") -f.write("} %s_message;\n\n" % (fileprefix)) - -for key in iesDefs: - if key in ieofielist.values(): - continue - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - keylowerunderscore = re.sub('-', '_', key.lower()) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - f.write("/** \\brief Decode function for %s ies.\n" % (key)) - if len(iesDefs[key]["ies"]) != 0: - f.write(" * \\param %s Pointer to ASN1 structure in which data will be stored\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" * \\param any_p Pointer to the ANY value to decode.\n") - f.write(" **/\n") - f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore)) - - if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" ANY_t *any_p);\n\n") - - if len(iesDefs[key]["ies"]) == 0: - continue - - f.write("/** \\brief Encode function for %s ies.\n" % (key)) - f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" **/\n") - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - -for key in iesDefs: - if key not in ieofielist.values(): - continue - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - f.write("/** \\brief Encode function for %s ies.\n" % (key)) - f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" **/\n") - f.write("int %s_encode_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %sIEs_t *%sIEs);\n\n" % (asn1cStruct, firstlower)) - f.write("/** \\brief Decode function for %s ies.\n" % (key)) - f.write(" * \\param any_p Pointer to the ANY value to decode.\n") - f.write(" * \\param callback Callback function called when any_p is successfully decoded.\n") - f.write(" **/\n") - f.write("int %s_decode_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" %sIEs_t *%sIEs,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (asn1cStruct, lowerFirstCamelWord(asn1cStruct))) - -for key in iesDefs: - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - if key in ieofielist.values(): - f.write("/** \\brief Display %s encapsulated IE using XER encoding.\n" % (asn1cStruct)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" * \\param file File descriptor to write output.\n") - f.write(" **/\n") - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('item', 'list', firstlower.lower()))) - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - f.write(" %sIEs_t *%sIEs);\n\n" % (re.sub('item', 'list', asn1cStruct), firstlower)) - else: - f.write("/** \\brief Display %s message using XER encoding.\n" % (asn1cStruct)) - f.write(" * \\param message_p Pointer to root message.\n") - f.write(" * \\param file File descriptor to write output.\n") - f.write(" **/\n") - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - f.write(" %s_message *message_p);\n\n" % (fileprefix)) - -f.write("int %s_xer__print2sp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower())) -f.write("int %s_xer__print2fp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower())) -f.write("extern size_t %s_string_total_size;\n\n" % (fileprefix.lower())) -f.write("#endif /* %s_IES_DEFS_H_ */\n\n" % (fileprefix.upper())) - -#Generate Decode functions -f = open(outdir + fileprefix + '_decoder.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix)) -for key in iesDefs: - if key in ieofielist.values(): - continue - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: - asn1cStruct = asn1cStruct[:-1] - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - ielistname = re.sub('UE', 'ue', asn1cStruct) - ielistnamefirstlower = ielistname[:1].lower() + ielistname[1:] - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - iesaccess = "" - if key not in ieofielist.values(): - iesaccess = "%s_ies." % (firstlower) - - f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" ANY_t *any_p) {\n\n") - - f.write(" %s_t %s;\n %s_t *%s_p = &%s;\n" % (asn1cStruct, asn1cStructfirstlower, asn1cStruct, asn1cStructfirstlower, asn1cStructfirstlower)) - f.write(" int i, decoded = 0;\n") - if len(iesDefs[key]["ies"]) != 0: - f.write(" int tempDecoded = 0;\n") - - f.write(" assert(any_p != NULL);\n") - if len(iesDefs[key]["ies"]) != 0: - f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - - f.write(" %s_DEBUG(\"Decoding message %s (%%s:%%d)\\n\", __FILE__, __LINE__);\n\n" % (fileprefix.upper(), re.sub('-', '_', keyName))) - f.write(" ANY_to_type_aper(any_p, &asn_DEF_%s, (void**)&%s_p);\n\n" % (asn1cStruct, asn1cStructfirstlower)) - f.write(" for (i = 0; i < %s_p->%slist.count; i++) {\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" %s_IE_t *ie_p;\n" % (fileprefix[0].upper() + fileprefix[1:])) - f.write(" ie_p = %s_p->%slist.array[i];\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" switch(ie_p->id) {\n") - for ie in iesDefs[key]["ies"]: - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - ienameunderscorefirstlower = lowerFirstCamelWord(ienameunderscore) - ietypesubst = re.sub('-', '', ie[2]) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" {\n") - f.write(" %s_t *%s_p = NULL;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - if ie[3] != "mandatory": - f.write(" %s->presenceMask |= %s_%s_PRESENT;\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) - f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(ietypesubst))) - f.write(" %s_ERROR(\"Decoding of IE %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore)) - f.write(" if (%s_p)\n" % (lowerFirstCamelWord(ietypesubst))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" decoded += tempDecoded;\n") - f.write(" if (asn1_xer_print)\n") - f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - if ie[2] in ieofielist.keys(): - f.write(" if (%s_decode_%s(&%s->%s, %s_p) < 0) {\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" %s_ERROR(\"Decoding of encapsulated IE %s failed\\n\");\n" % (fileprefix.upper(), lowerFirstCamelWord(ietypesubst))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" }\n") - else: - f.write(" memcpy(&%s->%s, %s_p, sizeof(%s_t));\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst), ietypeunderscore)) - #f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" } break;\n") - f.write(" default:\n") - f.write(" %s_ERROR(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower()))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" }\n") - f.write(" return decoded;\n") - f.write("}\n\n") - -for key in iesDefs: - if key not in ieofielist.values(): - continue - - keyname = re.sub('IEs', '', re.sub('Item', 'List', key)) - - f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', keyname).lower())) - f.write(" %sIEs_t *%sIEs,\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" int i, decoded = 0;\n") - f.write(" int tempDecoded = 0;\n\n") - - f.write(" assert(%s != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))); - f.write(" assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))); - - f.write(" for (i = 0; i < %s->list.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_IE_t *ie_p = %s->list.array[i];\n" % (fileprefix[0].upper() + fileprefix[1:], lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" switch (ie_p->id) {\n") - for ie in iesDefs[key]["ies"]: - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - f.write(" case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" {\n") - f.write(" %s_t *%s_p = NULL;\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" %s_ERROR(\"Decoding of IE %s for message %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore, re.sub('-', '_', keyname))) - f.write(" if (%s_p)\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - #f.write(" free(%s_p);\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" decoded += tempDecoded;\n") - f.write(" if (asn1_xer_print)\n") - f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" ASN_SEQUENCE_ADD(&%sIEs->%s, %s_p);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)), - re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" } break;\n") - f.write(" default:\n") - f.write(" %s_ERROR(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower()))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" }\n") - f.write(" return decoded;\n") - f.write("}\n\n") - - -#Generate IES Encode functions -f = open(outdir + fileprefix + '_encoder.c', 'w') -outputHeaderToFile(f,filename) -f.write("#include \"%s_common.h\"\n" % (fileprefix)) -f.write("#include \"%s_ies_defs.h\"\n\n" % (fileprefix)) -for key in iesDefs: - if key in ieofielist.values(): - continue - - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: - asn1cStruct = asn1cStruct[:-1] - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - iesaccess = "" - if key not in ieofielist.values(): - iesaccess = "%s_ies." % (firstwordlower) - - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - # No IE to encode... - if len(iesDefs[key]["ies"]) == 0: - continue - - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - - f.write(" %s_IE_t *ie;\n\n" % (fileprefix_first_upper)) - - f.write(" assert(%s != NULL);\n" % (firstwordlower)); - f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))); - - for ie in iesDefs[key]["ies"]: - iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) - ienamefirstwordlower = lowerFirstCamelWord(iename) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - ietypeunderscore = re.sub('-', '_', ie[2]) - - if ie[3] != "mandatory": - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" if (%s->presenceMask & %s_%s_PRESENT) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) - #f.write(" == %s_%s_PRESENT) {\n" % (keyupperunderscore, ieupperunderscore)) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n" % (firstwordlower, iesaccess)) - f.write(" }\n\n") - else: - if ie[2] in ieofielist.keys(): - f.write(" %s_t %s;\n\n" % (ietypeunderscore, ienamefirstwordlower)) - f.write(" memset(&%s, 0, sizeof(%s_t));\n" % (ienamefirstwordlower, ietypeunderscore)) - f.write("\n") - f.write(" if (%s_encode_%s(&%s, &%s->%s) < 0) return -1;\n" % (fileprefix, ietypeunderscore.lower(), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - if ie[2] in ieofielist.keys(): - f.write(" &%s)) == NULL) {\n" % (ienamefirstwordlower)) - else: - f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n\n" % (firstwordlower, iesaccess)) - if ie[2] in ieofielist.keys(): - f.write(" /* Free any dynamic allocation that is no more used */\n") - f.write(" ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_%s, &%s);\n\n" % (ietypeunderscore, ienamefirstwordlower)) - - f.write(" return 0;\n") - f.write("}\n\n") - -for (key, value) in iesDefs.items(): - if key not in ieofielist.values(): - continue - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - for (i, j) in ieofielist.items(): - if j == key: - break - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', i).lower())) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %sIEs_t *%sIEs) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) - f.write(" int i;\n") - - f.write(" %s_IE_t *ie;\n\n" % (fileprefix_first_upper)) - - f.write(" assert(%s != NULL);\n" % (firstwordlower)); - f.write(" assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', i)))); - - f.write(" for (i = 0; i < %sIEs->%s.count; i++) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - f.write(" %sIEs->%s.array[i])) == NULL) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->list, ie);\n" % (firstwordlower)) - f.write(" }\n") - f.write(" return 0;\n") - f.write("}\n\n") - -#Generate xer print functions -f = open(outdir + fileprefix + '_xer_print.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \n") -f.write("#include \n\n") -f.write("#include \n#include \n\n") -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix)) - -f.write("size_t %s_string_total_size = 0;\n\n" % (fileprefix.lower())) -f.write("""int -%s_xer__print2fp(const void *buffer, size_t size, void *app_key) { - FILE *stream = (FILE *)app_key; - - if(fwrite(buffer, 1, size, stream) != size) - return -1; - - return 0; -} - -""" % (fileprefix.lower())) - -f.write("""int %s_xer__print2sp(const void *buffer, size_t size, void *app_key) { - char *string = (char *)app_key; - - /* Copy buffer to the formatted string */ - memcpy(&string[%s_string_total_size], buffer, size); - - %s_string_total_size += size; - - return 0; -} - -""" % (fileprefix.lower(), fileprefix.lower(), fileprefix.lower())) - -f.write("""static asn_enc_rval_t -xer_encode_local(asn_TYPE_descriptor_t *td, void *sptr, - asn_app_consume_bytes_f *cb, void *app_key, int indent) { - asn_enc_rval_t er, tmper; - const char *mname; - size_t mlen; - int xcan = 2; - - if(!td || !sptr) goto cb_failed; - - mname = td->xml_tag; - mlen = strlen(mname); - - _i_ASN_TEXT_INDENT(0, indent); - _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); - - tmper = td->xer_encoder(td, sptr, indent + 1, XER_F_BASIC, cb, app_key); - if(tmper.encoded == -1) return tmper; - - _ASN_CALLBACK3("\\n", xcan); - - er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; - - _ASN_ENCODED_OK(er); -cb_failed: - _ASN_ENCODE_FAILED; -} -""") - -for (key, value) in iesDefs.items(): - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - iesStructName = lowerFirstCamelWord(re.sub('-', '_', key)) - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - - if key in ieofielist.values(): - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('item', 'list', re.sub('-', '_', key).lower())))) - else: - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', key).lower()))) - #f.write(" FILE *file,\n") - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - if key in ieofielist.values(): - iesStructName = lowerFirstCamelWord(re.sub('Item', 'List', re.sub('-', '_', key))) - f.write(" %sIEs_t *%s) {\n\n" % (re.sub('IEs', '', re.sub('Item', 'List', re.sub('-', '_', key))), iesStructName)) - f.write(" int i;\n") - f.write(" asn_enc_rval_t er;\n") - else: - f.write(" %s_message *message_p)\n{\n" % (fileprefix)) - f.write(" %s_t *%s;\n" % (re.sub('-', '_', key), iesStructName)) - f.write(" asn_enc_rval_t er;\n") - #f.write(" void *app_key = (void *)file;\n") - #f.write(" asn_app_consume_bytes_f *cb = %s_xer__print2fp;\n\n" % (fileprefix.lower())) - - f.write(" %s = &message_p->msg.%s;\n\n" % (iesStructName, iesStructName)) - - if key in ieofielist.values(): - # Increase indentation level - f.write(" for (i = 0; i < %s->%s.count; i++) {\n" % (iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - #f.write(" xer_fprint(file, &asn_DEF_%s, %s->%s.array[i]);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" er = xer_encode(&asn_DEF_%s, %s->%s.array[i], XER_F_BASIC, cb, app_key);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" }\n") - else: - f.write(" cb(\"<%s-PDU>\\n\", %d, app_key);\n" % (key, len("<%s-PDU>\n" % (key)))) - f.write(" xer_encode_local(&asn_DEF_%s_Criticality, &message_p->criticality, cb, app_key, 1);\n" % fileprefix_first_upper) - f.write(" xer_encode_local(&asn_DEF_%s_ProcedureCode, &message_p->procedureCode, cb, app_key, 1);\n" % fileprefix_first_upper) - - f.write(" cb(\" <%s>\\n\", %d, app_key);\n" % (key, len(" <%s>\n" % (key)))) - - for ie in iesDefs[key]["ies"]: - iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) - ienamefirstwordlower = lowerFirstCamelWord(iename) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] != "mandatory": - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" if (%s->presenceMask & %s_%s_PRESENT)\n " % (iesStructName, keyupperunderscore, ieupperunderscore)) - - # Is it an encapsulated IE ? - if ie[2] in ieofielist.keys(): - f.write(" %s_xer_print_%s(cb, app_key, &%s->%s);\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', ie[2]).lower()), iesStructName, ienamefirstwordlower)) - else: - f.write(" xer_encode_local(&asn_DEF_%s, &%s->%s, cb, app_key, 2);\n" % (ietypeunderscore, iesStructName, ienamefirstwordlower)) - f.write(" cb(\" \\n\", %d, app_key);\n" % (key, len(" \n" % (key)))) - f.write(" cb(\"\\n\", %d, app_key);\n" % (key, len("\n" % (key)))) - - f.write(" _ASN_ENCODED_OK(er);\n") - #if key not in ieofielist.values(): - #f.write("cb_failed:\n") - #f.write(" return er;\n") - f.write("}\n\n") diff --git a/openair2/RRC/LTE/L2_interface.c b/openair2/RRC/LTE/L2_interface.c index e0bf90cff2..2ce9221317 100644 --- a/openair2/RRC/LTE/L2_interface.c +++ b/openair2/RRC/LTE/L2_interface.c @@ -44,6 +44,7 @@ #include "rrc_eNB_UE_context.h" #include "pdcp.h" #include "common/ran_context.h" +#include "uper_encoder.h" #include "intertask_interface.h" diff --git a/openair2/RRC/LTE/MESSAGES/ASN.1/lte-rrc-15.6.0.cmake b/openair2/RRC/LTE/MESSAGES/ASN.1/lte-rrc-15.6.0.cmake index 37aa069a38..b415578fd2 100644 --- a/openair2/RRC/LTE/MESSAGES/ASN.1/lte-rrc-15.6.0.cmake +++ b/openair2/RRC/LTE/MESSAGES/ASN.1/lte-rrc-15.6.0.cmake @@ -1,26 +1,66 @@ set(LTE_RRC_GRAMMAR ASN.1/lte-rrc-15.6.0.asn1) set(lte_rrc_source + ANY_aper.c + ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c + BOOLEAN_aper.c BOOLEAN.c + BOOLEAN_print.c + BOOLEAN_rfill.c + BOOLEAN_uper.c + BOOLEAN_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c LTE_AB-Config-NB-r13.c LTE_AB-ConfigPLMN-NB-r13.c LTE_AbsoluteTimeInfo-r10.c @@ -497,6 +537,7 @@ set(lte_rrc_source LTE_EUTRA-5GC-Parameters-r15.c LTE_EUTRA-CarrierList-r15.c LTE_ExplicitListOfARFCNs.c + LTE_EXTERNAL.c LTE_FailedLogicalChannelInfo-r15.c LTE_FailureInformation-r15.c LTE_FailureReportSCG-NR-r15.c @@ -2387,32 +2428,67 @@ set(lte_rrc_source LTE_WUS-MaxDurationFactor-NB-r15.c LTE_ZeroTxPowerCSI-RS-Conf-r12.c LTE_ZeroTxPowerCSI-RS-r12.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c + NULL_aper.c NULL.c + NULL_print.c + NULL_rfill.c + NULL_uper.c + NULL_xer.c + ObjectDescriptor.c + OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c xer_decoder.c xer_encoder.c xer_support.c ) set(lte_rrc_headers + ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -2423,7 +2499,7 @@ set(lte_rrc_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h + GraphicString.h INTEGER.h LTE_AB-Config-NB-r13.h LTE_AB-ConfigPLMN-NB-r13.h @@ -2902,6 +2978,7 @@ set(lte_rrc_headers LTE_EUTRA-5GC-Parameters-r15.h LTE_EUTRA-CarrierList-r15.h LTE_ExplicitListOfARFCNs.h + LTE_EXTERNAL.h LTE_FailedLogicalChannelInfo-r15.h LTE_FailureInformation-r15.h LTE_FailureReportSCG-NR-r15.h @@ -4795,12 +4872,18 @@ set(lte_rrc_headers NativeEnumerated.h NativeInteger.h NULL.h + ObjectDescriptor.h + OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h per_decoder.h per_encoder.h per_opentype.h per_support.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h xer_decoder.h xer_encoder.h xer_support.h diff --git a/openair2/RRC/LTE/MESSAGES/CMakeLists.txt b/openair2/RRC/LTE/MESSAGES/CMakeLists.txt index b7e7f3ead6..3af4af5e8b 100644 --- a/openair2/RRC/LTE/MESSAGES/CMakeLists.txt +++ b/openair2/RRC/LTE/MESSAGES/CMakeLists.txt @@ -9,7 +9,7 @@ else() endif() add_custom_command(OUTPUT ${lte_rrc_source} ${lte_rrc_headers} - COMMAND ASN1C_PREFIX=LTE_ asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${LTE_RRC_GRAMMAR} + COMMAND ASN1C_PREFIX=LTE_ asn1c -pdu=all -fcompound-names -gen-UPER -no-gen-BER -no-gen-JER -no-gen-OER -gen-APER -no-gen-example -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${LTE_RRC_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${LTE_RRC_GRAMMAR} COMMENT "Generating LTE RRC source file from ${CMAKE_CURRENT_SOURCE_DIR}/${LTE_RRC_GRAMMAR}" ) diff --git a/openair2/RRC/LTE/MESSAGES/README.md b/openair2/RRC/LTE/MESSAGES/README.md index ead6bcfca6..13fbf82dd9 100644 --- a/openair2/RRC/LTE/MESSAGES/README.md +++ b/openair2/RRC/LTE/MESSAGES/README.md @@ -25,7 +25,7 @@ You should install the asn1c utility using `./build_oai -I`. Run ```bash -ASN1C_PREFIX=LTE_ asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D +ASN1C_PREFIX=LTE_ asn1c -pdu=all -fcompound-names -gen-UPER -no-gen-BER -no-gen-JER -no-gen-OER -no-gen-APER -no-gen-example -D ``` to generate the files that result from the asn.1-file. Create an `ASN.1/*.cmake` file with the following structure: diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index 348e1a9fd4..7a6b0ec006 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -31,7 +31,8 @@ #define RRC_ENB_C #include "oai_asn1.h" #include -#include +#include "uper_encoder.h" +#include "uper_decoder.h" #include "rrc_defs.h" #include "rrc_extern.h" #include "assertions.h" diff --git a/openair2/RRC/LTE/rrc_eNB_M2AP.c b/openair2/RRC/LTE/rrc_eNB_M2AP.c index 16c003d471..c4d0642b9f 100644 --- a/openair2/RRC/LTE/rrc_eNB_M2AP.c +++ b/openair2/RRC/LTE/rrc_eNB_M2AP.c @@ -36,6 +36,7 @@ # include "intertask_interface.h" # include "common/ran_context.h" #include "pdcp.h" +#include "uper_encoder.h" extern RAN_CONTEXT_t RC; diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c index 141a70488e..8265602106 100644 --- a/openair2/RRC/LTE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c @@ -47,6 +47,7 @@ #include "pdcp_primitives.h" #include "LTE_UERadioAccessCapabilityInformation.h" +#include "uper_encoder.h" #include "openair3/ocp-gtpu/gtp_itf.h" #include diff --git a/openair2/RRC/LTE/rrc_eNB_endc.c b/openair2/RRC/LTE/rrc_eNB_endc.c index b33cf83d3a..3fca32d7b8 100644 --- a/openair2/RRC/LTE/rrc_eNB_endc.c +++ b/openair2/RRC/LTE/rrc_eNB_endc.c @@ -25,6 +25,7 @@ #include "common/ran_context.h" #include "oai_asn1.h" #include "LTE_DL-DCCH-Message.h" +#include "uper_encoder.h" #include #include diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c index 74b08e7dfe..0f524a0241 100644 --- a/openair2/RRC/NR/L2_nr_interface.c +++ b/openair2/RRC/NR/L2_nr_interface.c @@ -41,6 +41,8 @@ #include "intertask_interface.h" +#include "uper_encoder.h" + #include "NR_MIB.h" #include "NR_BCCH-BCH-Message.h" #include "rrc_gNB_UE_context.h" diff --git a/openair2/RRC/NR/MESSAGES/ASN.1/nr-rrc-16.4.1.cmake b/openair2/RRC/NR/MESSAGES/ASN.1/nr-rrc-16.4.1.cmake index bd2a0a8dcd..6fd386aa35 100644 --- a/openair2/RRC/NR/MESSAGES/ASN.1/nr-rrc-16.4.1.cmake +++ b/openair2/RRC/NR/MESSAGES/ASN.1/nr-rrc-16.4.1.cmake @@ -1,28 +1,76 @@ set(NR_RRC_GRAMMAR ASN.1/nr-rrc-16.4.1.asn1) set(nr_rrc_source + ANY_aper.c + ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c + BOOLEAN_aper.c BOOLEAN.c + BOOLEAN_print.c + BOOLEAN_rfill.c + BOOLEAN_uper.c + BOOLEAN_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c NR_AbsoluteTimeInfo-r16.c NR_AccessStratumRelease.c NR_AccessStratumReleaseSidelink-r16.c @@ -369,6 +417,7 @@ set(nr_rrc_source NR_EventTriggerConfigInterRAT.c NR_EventTriggerConfigNR-SL-r16.c NR_EventType-r16.c + NR_EXTERNAL.c NR_FailureInfoDAPS-r16.c NR_FailureInfoRLC-Bearer.c NR_FailureInformation.c @@ -1486,30 +1535,57 @@ set(nr_rrc_source NR_ZP-CSI-RS-ResourceId.c NR_ZP-CSI-RS-ResourceSet.c NR_ZP-CSI-RS-ResourceSetId.c + NULL_aper.c NULL.c + NULL_print.c + NULL_rfill.c + NULL_uper.c + NULL_xer.c + ObjectDescriptor.c + OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c xer_decoder.c xer_encoder.c xer_support.c ) set(nr_rrc_headers + ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -1520,7 +1596,7 @@ set(nr_rrc_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h + GraphicString.h INTEGER.h NativeEnumerated.h NativeInteger.h @@ -1871,6 +1947,7 @@ set(nr_rrc_headers NR_EventTriggerConfigInterRAT.h NR_EventTriggerConfigNR-SL-r16.h NR_EventType-r16.h + NR_EXTERNAL.h NR_FailureInfoDAPS-r16.h NR_FailureInfoRLC-Bearer.h NR_FailureInformation.h @@ -2989,12 +3066,18 @@ set(nr_rrc_headers NR_ZP-CSI-RS-ResourceSet.h NR_ZP-CSI-RS-ResourceSetId.h NULL.h + ObjectDescriptor.h + OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h per_decoder.h per_encoder.h per_opentype.h per_support.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h xer_decoder.h xer_encoder.h xer_support.h diff --git a/openair2/RRC/NR/MESSAGES/ASN.1/nr-rrc-17.3.0.cmake b/openair2/RRC/NR/MESSAGES/ASN.1/nr-rrc-17.3.0.cmake index 28416eabba..7b643b2539 100644 --- a/openair2/RRC/NR/MESSAGES/ASN.1/nr-rrc-17.3.0.cmake +++ b/openair2/RRC/NR/MESSAGES/ASN.1/nr-rrc-17.3.0.cmake @@ -1,28 +1,76 @@ set(NR_RRC_GRAMMAR ASN.1/nr-rrc-17.3.0.asn1) set(nr_rrc_source +ANY_aper.c +ANY.c +ANY_uper.c +ANY_xer.c +aper_decoder.c +aper_encoder.c +aper_opentype.c +aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c +asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c -ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c +BIT_STRING_print.c +BIT_STRING_rfill.c +BIT_STRING_uper.c +BIT_STRING_xer.c +BOOLEAN_aper.c BOOLEAN.c +BOOLEAN_print.c +BOOLEAN_rfill.c +BOOLEAN_uper.c +BOOLEAN_xer.c constraints.c +constr_CHOICE_aper.c constr_CHOICE.c +constr_CHOICE_print.c +constr_CHOICE_rfill.c +constr_CHOICE_uper.c +constr_CHOICE_xer.c +constr_SEQUENCE_aper.c constr_SEQUENCE.c +constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c +constr_SEQUENCE_OF_uper.c +constr_SEQUENCE_OF_xer.c +constr_SEQUENCE_print.c +constr_SEQUENCE_rfill.c +constr_SEQUENCE_uper.c +constr_SEQUENCE_xer.c +constr_SET_OF_aper.c constr_SET_OF.c +constr_SET_OF_print.c +constr_SET_OF_rfill.c +constr_SET_OF_uper.c +constr_SET_OF_xer.c constr_TYPE.c -der_encoder.c +GraphicString.c +INTEGER_aper.c INTEGER.c +INTEGER_print.c +INTEGER_rfill.c +INTEGER_uper.c +INTEGER_xer.c +NativeEnumerated_aper.c NativeEnumerated.c +NativeEnumerated_uper.c +NativeEnumerated_xer.c +NativeInteger_aper.c NativeInteger.c +NativeInteger_print.c +NativeInteger_rfill.c +NativeInteger_uper.c +NativeInteger_xer.c NR_AbsoluteTimeInfo-r16.c NR_AccessStratumRelease.c NR_AccessStratumReleaseSidelink-r16.c @@ -521,6 +569,7 @@ NR_EventTriggerConfigNR-SL-r16.c NR_EventType-r16.c NR_ExcessDelay-DRB-IdentityInfo-r17.c NR_ExtendedPagingCycle-r17.c +NR_EXTERNAL.c NR_FailureInfoDAPS-r16.c NR_FailureInfoRLC-Bearer.c NR_FailureInformation.c @@ -2077,30 +2126,57 @@ NR_ZP-CSI-RS-Resource.c NR_ZP-CSI-RS-ResourceId.c NR_ZP-CSI-RS-ResourceSet.c NR_ZP-CSI-RS-ResourceSetId.c +NULL_aper.c NULL.c +NULL_print.c +NULL_rfill.c +NULL_uper.c +NULL_xer.c +ObjectDescriptor.c +OBJECT_IDENTIFIER.c +OBJECT_IDENTIFIER_print.c +OBJECT_IDENTIFIER_rfill.c +OBJECT_IDENTIFIER_xer.c +OCTET_STRING_aper.c OCTET_STRING.c +OCTET_STRING_print.c +OCTET_STRING_rfill.c +OCTET_STRING_uper.c +OCTET_STRING_xer.c +OPEN_TYPE_aper.c OPEN_TYPE.c +OPEN_TYPE_uper.c +OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c +uper_decoder.c +uper_encoder.c +uper_opentype.c +uper_support.c xer_decoder.c xer_encoder.c xer_support.c ) set(nr_rrc_headers +ANY.h +aper_decoder.h +aper_encoder.h +aper_opentype.h +aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h +asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h -ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -2111,7 +2187,7 @@ constr_SEQUENCE.h constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h -der_encoder.h +GraphicString.h INTEGER.h NativeEnumerated.h NativeInteger.h @@ -2614,6 +2690,7 @@ NR_EventTriggerConfigNR-SL-r16.h NR_EventType-r16.h NR_ExcessDelay-DRB-IdentityInfo-r17.h NR_ExtendedPagingCycle-r17.h +NR_EXTERNAL.h NR_FailureInfoDAPS-r16.h NR_FailureInfoRLC-Bearer.h NR_FailureInformation.h @@ -4171,12 +4248,18 @@ NR_ZP-CSI-RS-ResourceId.h NR_ZP-CSI-RS-ResourceSet.h NR_ZP-CSI-RS-ResourceSetId.h NULL.h +ObjectDescriptor.h +OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h per_decoder.h per_encoder.h per_opentype.h per_support.h +uper_decoder.h +uper_encoder.h +uper_opentype.h +uper_support.h xer_decoder.h xer_encoder.h xer_support.h diff --git a/openair2/RRC/NR/MESSAGES/CMakeLists.txt b/openair2/RRC/NR/MESSAGES/CMakeLists.txt index dcf7ecf3f1..e2f60ae615 100644 --- a/openair2/RRC/NR/MESSAGES/CMakeLists.txt +++ b/openair2/RRC/NR/MESSAGES/CMakeLists.txt @@ -11,7 +11,7 @@ else() endif() add_custom_command(OUTPUT ${nr_rrc_source} ${nr_rrc_headers} - COMMAND ASN1C_PREFIX=NR_ asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -findirect-choice -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${NR_RRC_GRAMMAR} + COMMAND ASN1C_PREFIX=NR_ asn1c -pdu=all -fcompound-names -gen-UPER -no-gen-BER -no-gen-JER -no-gen-OER -gen-APER -no-gen-example -findirect-choice -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${NR_RRC_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${NR_RRC_GRAMMAR} COMMENT "Generating NR RRC source file from ${CMAKE_CURRENT_SOURCE_DIR}/${NR_RRC_GRAMMAR}" ) @@ -25,7 +25,7 @@ add_custom_command(OUTPUT ${nr_rrc_source} ${nr_rrc_headers} # recommended way, see https://gitlab.kitware.com/cmake/cmake/-/issues/17366. # In newer cmake version (e.g., 3.20), it is also possible to have # ${nr_rrc_headers} directly in the add_library(asn1_nr_rrc_hdrs) statement, -# without the need for asn1_lte_rrc_hdrs +# without the need for asn1_nr_rrc_hdrs add_custom_target(gen_nr_rrc_hdrs DEPENDS ${nr_rrc_headers}) add_library(asn1_nr_rrc_hdrs INTERFACE) add_dependencies(asn1_nr_rrc_hdrs gen_nr_rrc_hdrs) diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 8fb059887e..2a817ff376 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -34,6 +34,9 @@ #include "oai_asn1.h" #include "SIMULATION/TOOLS/sim.h" // for taus(); +#include "uper_decoder.h" +#include "uper_encoder.h" + const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; static NR_SearchSpace_t *rrc_searchspace_config(bool is_common, int searchspaceid, int coresetid) diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index dbb557fe85..d1856b5c89 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -65,6 +65,8 @@ #include "NR_RRCSetupComplete-IEs.h" #include "NR_RRCReestablishmentRequest-IEs.h" #include "NR_MIB.h" +#include "uper_encoder.h" +#include "uper_decoder.h" #include "rlc.h" #include "platform_types.h" diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index 7f5b6ad14b..a35b0ff66a 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -69,6 +69,9 @@ #include "NGAP_NonDynamic5QIDescriptor.h" #include "conversions.h" #include "RRC/NR/rrc_gNB_radio_bearers.h" + +#include "uper_encoder.h" + extern RAN_CONTEXT_t RC; /* Masks for NGAP Encryption algorithms, NEA0 is always supported (not coded) */ diff --git a/openair2/RRC/NR/rrc_gNB_internode.c b/openair2/RRC/NR/rrc_gNB_internode.c index c4cd41c5b4..19230f179a 100644 --- a/openair2/RRC/NR/rrc_gNB_internode.c +++ b/openair2/RRC/NR/rrc_gNB_internode.c @@ -37,6 +37,8 @@ #include "NR_UE-CapabilityRAT-ContainerList.h" #include "LTE_UE-CapabilityRAT-ContainerList.h" #include "NR_CG-Config.h" +#include "uper_encoder.h" +#include "uper_decoder.h" #include "executables/softmodem-common.h" int parse_CG_ConfigInfo(gNB_RRC_INST *rrc, NR_CG_ConfigInfo_t *CG_ConfigInfo, x2ap_ENDC_sgnb_addition_req_t *m) { diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c index 294ff79346..4096dfa0ca 100644 --- a/openair2/RRC/NR/rrc_gNB_nsa.c +++ b/openair2/RRC/NR/rrc_gNB_nsa.c @@ -36,6 +36,8 @@ #include "NR_CellGroupConfig.h" #include "NR_CG-Config.h" //#include "NR_SRB-ToAddModList.h" +#include "uper_encoder.h" +#include "uper_decoder.h" #include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h" #include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "openair2/RRC/LTE/rrc_eNB_GTPV1U.h" diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index bb107d8592..c657d35831 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -40,6 +40,7 @@ #include "NR_PDSCH-ServingCellConfig.h" #include "NR_RLC-BearerConfig.h" #include "BOOLEAN.h" +#include "uper_encoder.h" #include "assertions.h" #include "oai_asn1.h" #include "common/utils/nr/nr_common.h" diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 028807530a..0cb54fbb87 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -44,6 +44,8 @@ #include "NR_RRCReconfiguration.h" #include "NR_MeasConfig.h" #include "NR_UL-DCCH-Message.h" +#include "uper_encoder.h" +#include "uper_decoder.h" #include "rrc_defs.h" #include "rrc_proto.h" diff --git a/openair2/X2AP/MESSAGES/ASN1/R15/x2ap-15.6.0.cmake b/openair2/X2AP/MESSAGES/ASN1/R15/x2ap-15.6.0.cmake index 5a5a64f6db..6ac85b0b48 100644 --- a/openair2/X2AP/MESSAGES/ASN1/R15/x2ap-15.6.0.cmake +++ b/openair2/X2AP/MESSAGES/ASN1/R15/x2ap-15.6.0.cmake @@ -1,37 +1,105 @@ set(X2AP_GRAMMAR ASN1/R15/x2ap-15.6.0.asn1) set(x2ap_source + ANY_aper.c ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c + BOOLEAN_aper.c BOOLEAN.c + BOOLEAN_print.c + BOOLEAN_rfill.c + BOOLEAN_uper.c + BOOLEAN_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c + NULL_aper.c NULL.c + NULL_print.c + NULL_rfill.c + NULL_uper.c + NULL_xer.c + ObjectDescriptor.c OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c X2AP_ABSInformation.c X2AP_ABSInformationFDD.c X2AP_ABSInformationTDD.c @@ -303,6 +371,7 @@ set(x2ap_source X2AP_ExpectedUEBehaviour.c X2AP_ExtendedBitRate.c X2AP_ExtendedULInterferenceOverloadInfo.c + X2AP_EXTERNAL.c X2AP_FDD-Info.c X2AP_FDD-InfoNeighbourServedNRCell-Information.c X2AP_FDD-InfoServedNRCell-Information.c @@ -728,17 +797,21 @@ set(x2ap_source set(x2ap_headers ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -749,11 +822,12 @@ set(x2ap_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h + GraphicString.h INTEGER.h NativeEnumerated.h NativeInteger.h NULL.h + ObjectDescriptor.h OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h @@ -761,6 +835,10 @@ set(x2ap_headers per_encoder.h per_opentype.h per_support.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h X2AP_ABSInformationFDD.h X2AP_ABSInformation.h X2AP_ABSInformationTDD.h @@ -1033,6 +1111,7 @@ set(x2ap_headers X2AP_ExpectedUEBehaviour.h X2AP_ExtendedBitRate.h X2AP_ExtendedULInterferenceOverloadInfo.h + X2AP_EXTERNAL.h X2AP_FDD-Info.h X2AP_FDD-InfoNeighbourServedNRCell-Information.h X2AP_FDD-InfoServedNRCell-Information.h diff --git a/openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py b/openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py deleted file mode 100644 index 8c0f7e8a16..0000000000 --- a/openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py +++ /dev/null @@ -1,697 +0,0 @@ -import re, os, sys, string -import datetime -import getopt -import getpass - -version = "1.0.2" - -lines = "" -iesDefs = {} -ieofielist = {} -outdir = './' - -filenames = [] -verbosity = 0 -prefix = "" - -FAIL = '\033[91m' -WARN = '\033[93m' -ENDC = '\033[0m' - -fileprefix = "" -fileprefix_first_upper = "" - -def printFail(string): - sys.stderr.write(FAIL + string + ENDC + "\n") - -def printWarning(string): - print WARN + string + ENDC - -def printDebug(string): - if verbosity > 0: - print string - -def outputHeaderToFile(f, filename): - now = datetime.datetime.now() - f.write("""/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -""") - f.write("/*******************************************************************************\n") - f.write(" * This file had been created by asn1tostruct.py script v%s\n" % (version)) - f.write(" * Please do not modify this file but regenerate it via script.\n") - f.write(" * Created on: %s by %s\n * from %s\n" % (str(now), getpass.getuser(), filenames)) - f.write(" ******************************************************************************/\n") - -def lowerFirstCamelWord(word): - """ puts the first word in a CamelCase Word in lowercase. - - I.e. CustomerID becomes customerID, XMLInfoTest becomes xmlInfoTest - """ - newstr = '' - swapped = word.swapcase() - idx = 0 - - # if it's all-caps, return an all-lowered version - lowered = word.lower() - - if swapped == lowered: - return lowered - - for c in swapped: - if c in string.lowercase: - newstr += c - idx += 1 - else: - break - if idx < 2: - newstr += word[idx:] - else: - newstr = newstr[:-1]+ word[idx-1:] - - return newstr - -def usage(): - print "Python parser for asn1 v%s" % (version) - print "Usage: python asn1tostruct.py [options]" - print "Available options:" - print "-d Enable script debug" - print "-f [file] Input file to parse" - print "-o [dir] Output files to given directory" - print "-h Print this help and return" - -try: - opts, args = getopt.getopt(sys.argv[1:], "df:ho:", ["debug", "file", "help", "outdir"]) -except getopt.GetoptError as err: - # print help information and exit: - usage() - sys.exit(2) - -for o, a in opts: - if o in ("-f", "--file"): - filenames.append(a) - if o in ("-d", "--debug"): - verbosity = 1 - if o in ("-o", "--outdir"): - outdir = a - if outdir.rfind('/') != len(outdir): - outdir += '/' - if o in ("-h", "--help"): - usage() - sys.exit(2) - -for filename in filenames: - file = open(filename, 'r') - for line in file: - # Removing any comment - if line.find('--') >= 0: - line = line[:line.find('--')] - # Removing any carriage return - lines += re.sub('\r', '', line) - - for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+SEQUENCE\s+\(\s*SIZE\s*\(\s*\d+\s*\.\.\s*[0-9a-zA-Z-]+\s*\)\s*\)\s*OF\s+[a-zA-Z-]+\s*\{\s*\{\s*([0-9a-zA-Z-]+)\s*\}\s*\}', lines, re.MULTILINE): - ieofielist[m[0]] = m[1] - for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+E-RAB-IE-ContainerList\s*\{\s*\{\s*([a-zA-Z0-9-]+)\s*\}\s*\}', lines, re.MULTILINE): - ieofielist[m[0]] = m[1] - - for i in re.findall(r'([a-zA-Z0-9-]+)\s+([A-Z0-9-]+)\s*::=\s*\{\s+([\,\|\{\}\t\n\.{3}\ \-a-zA-Z0-9]+)\s+}\n', lines, re.MULTILINE): - ies = [] - maxLength = 0 - # TODO: handle extensions - if i[1].find('EXTENSION') >= 0: - continue - if fileprefix == "": - fileprefix = i[1][:i[1].find('-')].lower() - for j in re.findall(r'\s*\{\s*([a-zA-Z0-9-\ \t]+)\s*\}\s*[\|,]*', i[2], re.MULTILINE): - for k in re.findall(r'ID\s*([a-zA-Z0-9\-]+)\s*CRITICALITY\s*([a-zA-Z0-9\-]+)\s+[A-Z]+\s+([a-zA-Z0-9\-]+)\s*PRESENCE\s*([a-zA-Z0-9\-]+)', j, re.MULTILINE): - printDebug("Got new ie for message " + i[0] + ": " + str(k)) - if len(k[2]) > maxLength: - maxLength = len(k[2]) - ies.append(k) - - if len(ies) > 0: - iesDefs[i[0]] = { "length": maxLength, "ies": ies } - else: - printWarning("Didn't find any information element for message: " + i[0]) - -if len(iesDefs) == 0: - printFail("No Information Element parsed, exiting") - sys.exit(0) - -fileprefix_first_upper = fileprefix[0].upper() + fileprefix[1:] - -f = open(outdir + fileprefix + '_ies_defs.h', 'w') -outputHeaderToFile(f, filename) -f.write("#include \"%s_common.h\"\n\n" % (fileprefix)) -f.write("#ifndef %s_IES_DEFS_H_\n#define %s_IES_DEFS_H_\n\n" % (fileprefix.upper(), fileprefix.upper())) -f.write("/* Define the version of script used to generate this file */\n") -f.write("#define %s_SCRIPT_VERSION (%s)\n\n" % (fileprefix.upper(), re.sub('\.', '', version))) - -for key in iesDefs: - - if key not in ieofielist.values(): - continue - - for (i, j) in ieofielist.items(): - if j == key: - break - - f.write("typedef struct %sIEs_s {\n" % (re.sub('-', '_', i))) - f.write(" A_SEQUENCE_OF(struct %s_s) %s;\n" % (re.sub('IEs', '', re.sub('-', '_', ieofielist[i])), lowerFirstCamelWord(re.sub('IEs', '', re.sub('-', '_', ieofielist[i]))))) - f.write("} %sIEs_t;\n\n" % (re.sub('-', '_', i))) - -for key in iesDefs: - keyupperunderscore = re.sub('-', '_', key.upper()) - keylowerunderscore = re.sub('-', '_', key.lower()) - shift = 0 - - if len(iesDefs[key]["ies"]) == 0: - continue - - # Presence mask - for ie in iesDefs[key]["ies"]: - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] == "optional" or ie[3] == "conditional": - f.write("#define {0:<{pad}} {1}\n".format("%s_%s_PRESENT" % (keyupperunderscore, ieupperunderscore), "(1 << %d)" % shift, - pad=iesDefs[key]["length"] + len(keyupperunderscore) + 9)) - shift += 1 - if (shift > 0): - f.write("\n") - - f.write("typedef struct %s_s {\n" % (re.sub('-', '_', key))) - if (shift > 0): - f.write(" {0:<{pad}} {1};\n".format("uint16_t", "presenceMask", pad=iesDefs[key]["length"] + 2)) - for ie in iesDefs[key]["ies"]: - ieunderscore = re.sub('-', '_', ie[2]) - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - if ie[2] in ieofielist: - f.write(" %sIEs_t %s;" % (re.sub('-', '_', ie[2]), ienameunderscore)) - else: - f.write(" {0:<{pad}} {1};".format("%s_t" % ieunderscore, ienameunderscore, pad=iesDefs[key]["length"] + 2)) - if ie[3] == "optional": - f.write(" ///< Optional field") - elif ie[3] == "conditional": - f.write(" ///< Conditional field") - f.write("\n") - - f.write("} %s_t;\n\n" % (re.sub('-', '_', key))) - -f.write("typedef struct %s_message_s {\n" % (fileprefix)) -f.write(" %s_ProcedureCode_t procedureCode;\n" % (fileprefix_first_upper)) -f.write(" %s_Criticality_t criticality;\n" % (fileprefix_first_upper)) -f.write(" uint8_t direction;\n") -f.write(" union {\n") - -messageList = iesDefs.keys() -messageList.sort() -for message in messageList: - if message in ieofielist.values(): - continue - if len(iesDefs[message]["ies"]) == 0: - continue - f.write(" %s_t %s;\n" % (re.sub('-', '_', message), lowerFirstCamelWord(re.sub('-', '_', message)))) -f.write(" } msg;\n") -f.write("} %s_message;\n\n" % (fileprefix)) - -for key in iesDefs: - if key in ieofielist.values(): - continue - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - keylowerunderscore = re.sub('-', '_', key.lower()) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - f.write("/** \\brief Decode function for %s ies.\n" % (key)) - if len(iesDefs[key]["ies"]) != 0: - f.write(" * \\param %s Pointer to ASN1 structure in which data will be stored\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" * \\param any_p Pointer to the ANY value to decode.\n") - f.write(" **/\n") - f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore)) - - if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" ANY_t *any_p);\n\n") - - if len(iesDefs[key]["ies"]) == 0: - continue - - f.write("/** \\brief Encode function for %s ies.\n" % (key)) - f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" **/\n") - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - -for key in iesDefs: - if key not in ieofielist.values(): - continue - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - f.write("/** \\brief Encode function for %s ies.\n" % (key)) - f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" **/\n") - f.write("int %s_encode_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %sIEs_t *%sIEs);\n\n" % (asn1cStruct, firstlower)) - f.write("/** \\brief Decode function for %s ies.\n" % (key)) - f.write(" * \\param any_p Pointer to the ANY value to decode.\n") - f.write(" * \\param callback Callback function called when any_p is successfully decoded.\n") - f.write(" **/\n") - f.write("int %s_decode_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" %sIEs_t *%sIEs,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (asn1cStruct, lowerFirstCamelWord(asn1cStruct))) - -for key in iesDefs: - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - if key in ieofielist.values(): - f.write("/** \\brief Display %s encapsulated IE using XER encoding.\n" % (asn1cStruct)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" * \\param file File descriptor to write output.\n") - f.write(" **/\n") - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('item', 'list', firstlower.lower()))) - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - f.write(" %sIEs_t *%sIEs);\n\n" % (re.sub('item', 'list', asn1cStruct), firstlower)) - else: - f.write("/** \\brief Display %s message using XER encoding.\n" % (asn1cStruct)) - f.write(" * \\param message_p Pointer to root message.\n") - f.write(" * \\param file File descriptor to write output.\n") - f.write(" **/\n") - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - f.write(" %s_message *message_p);\n\n" % (fileprefix)) - -f.write("int %s_xer__print2sp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower())) -f.write("int %s_xer__print2fp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower())) -f.write("extern size_t %s_string_total_size;\n\n" % (fileprefix.lower())) -f.write("#endif /* %s_IES_DEFS_H_ */\n\n" % (fileprefix.upper())) - -#Generate Decode functions -f = open(outdir + fileprefix + '_decoder.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix)) -for key in iesDefs: - if key in ieofielist.values(): - continue - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: - asn1cStruct = asn1cStruct[:-1] - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - ielistname = re.sub('UE', 'ue', asn1cStruct) - ielistnamefirstlower = ielistname[:1].lower() + ielistname[1:] - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - iesaccess = "" - if key not in ieofielist.values(): - iesaccess = "%s_ies." % (firstlower) - - f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" ANY_t *any_p) {\n\n") - - f.write(" %s_t %s;\n %s_t *%s_p = &%s;\n" % (asn1cStruct, asn1cStructfirstlower, asn1cStruct, asn1cStructfirstlower, asn1cStructfirstlower)) - f.write(" int i, decoded = 0;\n") - if len(iesDefs[key]["ies"]) != 0: - f.write(" int tempDecoded = 0;\n") - - f.write(" assert(any_p != NULL);\n") - if len(iesDefs[key]["ies"]) != 0: - f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - - f.write(" %s_DEBUG(\"Decoding message %s (%%s:%%d)\\n\", __FILE__, __LINE__);\n\n" % (fileprefix.upper(), re.sub('-', '_', keyName))) - f.write(" ANY_to_type_aper(any_p, &asn_DEF_%s, (void**)&%s_p);\n\n" % (asn1cStruct, asn1cStructfirstlower)) - f.write(" for (i = 0; i < %s_p->%slist.count; i++) {\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" %s_IE_t *ie_p;\n" % (fileprefix[0].upper() + fileprefix[1:])) - f.write(" ie_p = %s_p->%slist.array[i];\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" switch(ie_p->id) {\n") - for ie in iesDefs[key]["ies"]: - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - ienameunderscorefirstlower = lowerFirstCamelWord(ienameunderscore) - ietypesubst = re.sub('-', '', ie[2]) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" {\n") - f.write(" %s_t *%s_p = NULL;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - if ie[3] != "mandatory": - f.write(" %s->presenceMask |= %s_%s_PRESENT;\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) - f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(ietypesubst))) - f.write(" %s_ERROR(\"Decoding of IE %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore)) - f.write(" if (%s_p)\n" % (lowerFirstCamelWord(ietypesubst))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" decoded += tempDecoded;\n") - f.write(" if (asn1_xer_print)\n") - f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - if ie[2] in ieofielist.keys(): - f.write(" if (%s_decode_%s(&%s->%s, %s_p) < 0) {\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" %s_ERROR(\"Decoding of encapsulated IE %s failed\\n\");\n" % (fileprefix.upper(), lowerFirstCamelWord(ietypesubst))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" }\n") - else: - f.write(" memcpy(&%s->%s, %s_p, sizeof(%s_t));\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst), ietypeunderscore)) - #f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" } break;\n") - f.write(" default:\n") - f.write(" %s_ERROR(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower()))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" }\n") - f.write(" return decoded;\n") - f.write("}\n\n") - -for key in iesDefs: - if key not in ieofielist.values(): - continue - - keyname = re.sub('IEs', '', re.sub('Item', 'List', key)) - - f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', keyname).lower())) - f.write(" %sIEs_t *%sIEs,\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" int i, decoded = 0;\n") - f.write(" int tempDecoded = 0;\n\n") - - f.write(" assert(%s != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))); - f.write(" assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))); - - f.write(" for (i = 0; i < %s->list.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_IE_t *ie_p = %s->list.array[i];\n" % (fileprefix[0].upper() + fileprefix[1:], lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" switch (ie_p->id) {\n") - for ie in iesDefs[key]["ies"]: - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - f.write(" case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" {\n") - f.write(" %s_t *%s_p = NULL;\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" %s_ERROR(\"Decoding of IE %s for message %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore, re.sub('-', '_', keyname))) - f.write(" if (%s_p)\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - #f.write(" free(%s_p);\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" decoded += tempDecoded;\n") - f.write(" if (asn1_xer_print)\n") - f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" ASN_SEQUENCE_ADD(&%sIEs->%s, %s_p);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)), - re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" } break;\n") - f.write(" default:\n") - f.write(" %s_ERROR(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower()))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" }\n") - f.write(" return decoded;\n") - f.write("}\n\n") - - -#Generate IES Encode functions -f = open(outdir + fileprefix + '_encoder.c', 'w') -outputHeaderToFile(f,filename) -f.write("#include \"%s_common.h\"\n" % (fileprefix)) -f.write("#include \"%s_ies_defs.h\"\n\n" % (fileprefix)) -for key in iesDefs: - if key in ieofielist.values(): - continue - - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: - asn1cStruct = asn1cStruct[:-1] - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - iesaccess = "" - if key not in ieofielist.values(): - iesaccess = "%s_ies." % (firstwordlower) - - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - # No IE to encode... - if len(iesDefs[key]["ies"]) == 0: - continue - - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - - f.write(" %s_IE_t *ie;\n\n" % (fileprefix_first_upper)) - - f.write(" assert(%s != NULL);\n" % (firstwordlower)); - f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))); - - for ie in iesDefs[key]["ies"]: - iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) - ienamefirstwordlower = lowerFirstCamelWord(iename) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - ietypeunderscore = re.sub('-', '_', ie[2]) - - if ie[3] != "mandatory": - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" if (%s->presenceMask & %s_%s_PRESENT) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) - #f.write(" == %s_%s_PRESENT) {\n" % (keyupperunderscore, ieupperunderscore)) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n" % (firstwordlower, iesaccess)) - f.write(" }\n\n") - else: - if ie[2] in ieofielist.keys(): - f.write(" %s_t %s;\n\n" % (ietypeunderscore, ienamefirstwordlower)) - f.write(" memset(&%s, 0, sizeof(%s_t));\n" % (ienamefirstwordlower, ietypeunderscore)) - f.write("\n") - f.write(" if (%s_encode_%s(&%s, &%s->%s) < 0) return -1;\n" % (fileprefix, ietypeunderscore.lower(), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - if ie[2] in ieofielist.keys(): - f.write(" &%s)) == NULL) {\n" % (ienamefirstwordlower)) - else: - f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n\n" % (firstwordlower, iesaccess)) - if ie[2] in ieofielist.keys(): - f.write(" /* Free any dynamic allocation that is no more used */\n") - f.write(" ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_%s, &%s);\n\n" % (ietypeunderscore, ienamefirstwordlower)) - - f.write(" return 0;\n") - f.write("}\n\n") - -for (key, value) in iesDefs.items(): - if key not in ieofielist.values(): - continue - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - for (i, j) in ieofielist.items(): - if j == key: - break - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', i).lower())) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %sIEs_t *%sIEs) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) - f.write(" int i;\n") - - f.write(" %s_IE_t *ie;\n\n" % (fileprefix_first_upper)) - - f.write(" assert(%s != NULL);\n" % (firstwordlower)); - f.write(" assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', i)))); - - f.write(" for (i = 0; i < %sIEs->%s.count; i++) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - f.write(" %sIEs->%s.array[i])) == NULL) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->list, ie);\n" % (firstwordlower)) - f.write(" }\n") - f.write(" return 0;\n") - f.write("}\n\n") - -#Generate xer print functions -f = open(outdir + fileprefix + '_xer_print.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \n") -f.write("#include \n\n") -f.write("#include \n#include \n\n") -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix)) - -f.write("size_t %s_string_total_size = 0;\n\n" % (fileprefix.lower())) -f.write("""int -%s_xer__print2fp(const void *buffer, size_t size, void *app_key) { - FILE *stream = (FILE *)app_key; - - if(fwrite(buffer, 1, size, stream) != size) - return -1; - - return 0; -} - -""" % (fileprefix.lower())) - -f.write("""int %s_xer__print2sp(const void *buffer, size_t size, void *app_key) { - char *string = (char *)app_key; - - /* Copy buffer to the formatted string */ - memcpy(&string[%s_string_total_size], buffer, size); - - %s_string_total_size += size; - - return 0; -} - -""" % (fileprefix.lower(), fileprefix.lower(), fileprefix.lower())) - -f.write("""static asn_enc_rval_t -xer_encode_local(asn_TYPE_descriptor_t *td, void *sptr, - asn_app_consume_bytes_f *cb, void *app_key, int indent) { - asn_enc_rval_t er, tmper; - const char *mname; - size_t mlen; - int xcan = 2; - - if(!td || !sptr) goto cb_failed; - - mname = td->xml_tag; - mlen = strlen(mname); - - _i_ASN_TEXT_INDENT(0, indent); - _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); - - tmper = td->xer_encoder(td, sptr, indent + 1, XER_F_BASIC, cb, app_key); - if(tmper.encoded == -1) return tmper; - - _ASN_CALLBACK3("\\n", xcan); - - er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; - - _ASN_ENCODED_OK(er); -cb_failed: - _ASN_ENCODE_FAILED; -} -""") - -for (key, value) in iesDefs.items(): - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - iesStructName = lowerFirstCamelWord(re.sub('-', '_', key)) - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - - if key in ieofielist.values(): - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('item', 'list', re.sub('-', '_', key).lower())))) - else: - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', key).lower()))) - #f.write(" FILE *file,\n") - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - if key in ieofielist.values(): - iesStructName = lowerFirstCamelWord(re.sub('Item', 'List', re.sub('-', '_', key))) - f.write(" %sIEs_t *%s) {\n\n" % (re.sub('IEs', '', re.sub('Item', 'List', re.sub('-', '_', key))), iesStructName)) - f.write(" int i;\n") - f.write(" asn_enc_rval_t er;\n") - else: - f.write(" %s_message *message_p)\n{\n" % (fileprefix)) - f.write(" %s_t *%s;\n" % (re.sub('-', '_', key), iesStructName)) - f.write(" asn_enc_rval_t er;\n") - #f.write(" void *app_key = (void *)file;\n") - #f.write(" asn_app_consume_bytes_f *cb = %s_xer__print2fp;\n\n" % (fileprefix.lower())) - - f.write(" %s = &message_p->msg.%s;\n\n" % (iesStructName, iesStructName)) - - if key in ieofielist.values(): - # Increase indentation level - f.write(" for (i = 0; i < %s->%s.count; i++) {\n" % (iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - #f.write(" xer_fprint(file, &asn_DEF_%s, %s->%s.array[i]);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" er = xer_encode(&asn_DEF_%s, %s->%s.array[i], XER_F_BASIC, cb, app_key);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" }\n") - else: - f.write(" cb(\"<%s-PDU>\\n\", %d, app_key);\n" % (key, len("<%s-PDU>\n" % (key)))) - f.write(" xer_encode_local(&asn_DEF_%s_Criticality, &message_p->criticality, cb, app_key, 1);\n" % fileprefix_first_upper) - f.write(" xer_encode_local(&asn_DEF_%s_ProcedureCode, &message_p->procedureCode, cb, app_key, 1);\n" % fileprefix_first_upper) - - f.write(" cb(\" <%s>\\n\", %d, app_key);\n" % (key, len(" <%s>\n" % (key)))) - - for ie in iesDefs[key]["ies"]: - iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) - ienamefirstwordlower = lowerFirstCamelWord(iename) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] != "mandatory": - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" if (%s->presenceMask & %s_%s_PRESENT)\n " % (iesStructName, keyupperunderscore, ieupperunderscore)) - - # Is it an encapsulated IE ? - if ie[2] in ieofielist.keys(): - f.write(" %s_xer_print_%s(cb, app_key, &%s->%s);\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', ie[2]).lower()), iesStructName, ienamefirstwordlower)) - else: - f.write(" xer_encode_local(&asn_DEF_%s, &%s->%s, cb, app_key, 2);\n" % (ietypeunderscore, iesStructName, ienamefirstwordlower)) - f.write(" cb(\" \\n\", %d, app_key);\n" % (key, len(" \n" % (key)))) - f.write(" cb(\"\\n\", %d, app_key);\n" % (key, len("\n" % (key)))) - - f.write(" _ASN_ENCODED_OK(er);\n") - #if key not in ieofielist.values(): - #f.write("cb_failed:\n") - #f.write(" return er;\n") - f.write("}\n\n") diff --git a/openair2/X2AP/MESSAGES/CMakeLists.txt b/openair2/X2AP/MESSAGES/CMakeLists.txt index f0a28be723..8b4281a240 100644 --- a/openair2/X2AP/MESSAGES/CMakeLists.txt +++ b/openair2/X2AP/MESSAGES/CMakeLists.txt @@ -10,7 +10,7 @@ else() endif() add_custom_command(OUTPUT ${x2ap_source} ${x2ap_headers} - COMMAND ASN1C_PREFIX=X2AP_ asn1c -pdu=all -gen-PER -no-gen-OER -fcompound-names -no-gen-example -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${X2AP_GRAMMAR} + COMMAND ASN1C_PREFIX=X2AP_ asn1c -pdu=all -gen-APER -no-gen-BER -no-gen-JER -no-gen-OER -gen-UPER -fcompound-names -no-gen-example -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${X2AP_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${X2AP_GRAMMAR} COMMENT "Generating X2AP source files from ${CMAKE_CURRENT_SOURCE_DIR}/${X2AP_GRAMMAR}" ) diff --git a/openair3/LPP/MESSAGES/ASN1/37355-g60.cmake b/openair3/LPP/MESSAGES/ASN1/37355-g60.cmake index 979772e5b1..2712acb06f 100644 --- a/openair3/LPP/MESSAGES/ASN1/37355-g60.cmake +++ b/openair3/LPP/MESSAGES/ASN1/37355-g60.cmake @@ -1,27 +1,70 @@ set(LPP_GRAMMAR ASN1/37355-g60.asn) set(lpp_source + ANY_aper.c + ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c + BOOLEAN_aper.c BOOLEAN.c + BOOLEAN_print.c + BOOLEAN_rfill.c + BOOLEAN_uper.c + BOOLEAN_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c GeneralizedTime.c + GeneralizedTime_print.c + GeneralizedTime_rfill.c + GeneralizedTime_xer.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c LPP_Abort.c LPP_Abort-r9-IEs.c LPP_AccessTypes.c @@ -150,6 +193,7 @@ set(lpp_source LPP_EqualIntegerAmbiguityLevel-r16.c LPP_Error.c LPP_Error-r9-IEs.c + LPP_EXTERNAL.c LPP_FKP-Gradients-Element-r15.c LPP_FKP-Gradients-List-r15.c LPP_FreqBandIndicatorNR-r16.c @@ -637,16 +681,49 @@ set(lpp_source LPP_WLAN-RequestLocationInformation-r13.c LPP_WLAN-RTT-r13.c LPP_WLAN-TargetDeviceErrorCauses-r13.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c + NULL_aper.c NULL.c + NULL_print.c + NULL_rfill.c + NULL_uper.c + NULL_xer.c + ObjectDescriptor.c + OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c UTCTime.c + UTCTime_print.c + UTCTime_rfill.c + UTCTime_xer.c VisibleString.c xer_decoder.c xer_encoder.c @@ -654,17 +731,22 @@ set(lpp_source ) set(lpp_headers + ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -675,8 +757,8 @@ set(lpp_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h GeneralizedTime.h + GraphicString.h INTEGER.h LPP_Abort.h LPP_Abort-r9-IEs.h @@ -807,6 +889,7 @@ set(lpp_headers LPP_EqualIntegerAmbiguityLevel-r16.h LPP_Error.h LPP_Error-r9-IEs.h + LPP_EXTERNAL.h LPP_FKP-Gradients-Element-r15.h LPP_FKP-Gradients-List-r15.h LPP_FreqBandIndicatorNR-r16.h @@ -1297,12 +1380,18 @@ set(lpp_headers NativeEnumerated.h NativeInteger.h NULL.h + ObjectDescriptor.h + OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h per_decoder.h per_encoder.h per_opentype.h per_support.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h UTCTime.h VisibleString.h xer_decoder.h diff --git a/openair3/LPP/MESSAGES/CMakeLists.txt b/openair3/LPP/MESSAGES/CMakeLists.txt index a1363e8975..18cbc8ba16 100644 --- a/openair3/LPP/MESSAGES/CMakeLists.txt +++ b/openair3/LPP/MESSAGES/CMakeLists.txt @@ -10,7 +10,7 @@ include(ASN1/37355-g60.cmake) #endif() add_custom_command(OUTPUT ${lpp_source} ${lpp_headers} - COMMAND ASN1C_PREFIX=LPP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${LPP_GRAMMAR} + COMMAND ASN1C_PREFIX=LPP_ asn1c -gen-UPER -no-gen-BER -no-gen-JER -no-gen-OER -gen-APER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${LPP_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${LPP_GRAMMAR} COMMENT "Generating LPP source files from ${CMAKE_CURRENT_SOURCE_DIR}/${LPP_GRAMMAR}" ) diff --git a/openair3/M3AP/MESSAGES/ASN1/m3ap-14.0.0.cmake b/openair3/M3AP/MESSAGES/ASN1/m3ap-14.0.0.cmake index 004feec3bf..d077880ed1 100644 --- a/openair3/M3AP/MESSAGES/ASN1/m3ap-14.0.0.cmake +++ b/openair3/M3AP/MESSAGES/ASN1/m3ap-14.0.0.cmake @@ -1,26 +1,60 @@ set(M3AP_GRAMMAR ASN1/m3ap-14.0.0.asn) set(m3ap_source + ANY_aper.c ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c M3AP_Absolute-Time-ofMBMS-Data.c M3AP_AllocationAndRetentionPriority.c M3AP_BitRate.c @@ -37,6 +71,7 @@ set(m3ap_source M3AP_ErrorIndication.c M3AP_EUTRANCellIdentifier.c M3AP_ExtendedMCE-ID.c + M3AP_EXTERNAL.c M3AP_GBR-QosInformation.c M3AP_Global-MCE-ID.c M3AP_GTP-TEID.c @@ -105,16 +140,40 @@ set(m3ap_source M3AP_TriggeringMessage.c M3AP_TypeOfError.c M3AP_UnsuccessfulOutcome.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c + ObjectDescriptor.c OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c PrintableString.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c xer_decoder.c xer_encoder.c xer_support.c @@ -122,17 +181,21 @@ set(m3ap_source set(m3ap_headers ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -142,7 +205,7 @@ set(m3ap_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h + GraphicString.h INTEGER.h M3AP_Absolute-Time-ofMBMS-Data.h M3AP_AllocationAndRetentionPriority.h @@ -161,6 +224,7 @@ set(m3ap_headers M3AP_ErrorIndication.h M3AP_EUTRANCellIdentifier.h M3AP_ExtendedMCE-ID.h + M3AP_EXTERNAL.h M3AP_GBR-QosInformation.h M3AP_Global-MCE-ID.h M3AP_GTP-TEID.h @@ -231,6 +295,7 @@ set(m3ap_headers M3AP_UnsuccessfulOutcome.h NativeEnumerated.h NativeInteger.h + ObjectDescriptor.h OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h @@ -239,6 +304,10 @@ set(m3ap_headers per_opentype.h per_support.h PrintableString.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h xer_decoder.h xer_encoder.h xer_support.h diff --git a/openair3/M3AP/MESSAGES/CMakeLists.txt b/openair3/M3AP/MESSAGES/CMakeLists.txt index 48f4c5be3a..cc53d3820b 100644 --- a/openair3/M3AP/MESSAGES/CMakeLists.txt +++ b/openair3/M3AP/MESSAGES/CMakeLists.txt @@ -17,7 +17,7 @@ else() endif() add_custom_command(OUTPUT ${m3ap_source} ${m3ap_headers} - COMMAND ASN1C_PREFIX=M3AP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${M3AP_GRAMMAR} + COMMAND ASN1C_PREFIX=M3AP_ asn1c -gen-APER -no-gen-BER -no-gen-JER -no-gen-OER -gen-UPER -fcompound-names -no-gen-example -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${M3AP_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${M3AP_GRAMMAR} COMMENT "Generating M3AP source files from ${CMAKE_CURRENT_SOURCE_DIR}/${M3AP_GRAMMAR}" ) diff --git a/openair3/NGAP/MESSAGES/ASN1/ngap-15.8.0.cmake b/openair3/NGAP/MESSAGES/ASN1/ngap-15.8.0.cmake index fe239e9bcc..7fd05cd29f 100644 --- a/openair3/NGAP/MESSAGES/ASN1/ngap-15.8.0.cmake +++ b/openair3/NGAP/MESSAGES/ASN1/ngap-15.8.0.cmake @@ -1,28 +1,70 @@ set(NGAP_GRAMMAR ASN1/ngap-15.8.0.asn1) set(ngap_source + ANY_aper.c ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c NGAP_AdditionalDLUPTNLInformationForHOItem.c NGAP_AdditionalDLUPTNLInformationForHOList.c NGAP_AdditionalQosFlowInformation.c @@ -111,7 +153,7 @@ set(ngap_source NGAP_ConfidentialityProtectionIndication.c NGAP_ConfidentialityProtectionResult.c NGAP_ConfiguredNSSAI.c - NGAP_CoreNetworkAssistanceInformationForInactive.c + NGAP_CoreNetworkAssistanceInformationForInactive.c NGAP_COUNTValueForPDCP-SN12.c NGAP_COUNTValueForPDCP-SN18.c NGAP_CPTransportLayerInformation.c @@ -184,6 +226,7 @@ set(ngap_source NGAP_ExpectedUEMobility.c NGAP_ExpectedUEMovingTrajectory.c NGAP_ExpectedUEMovingTrajectoryItem.c + NGAP_EXTERNAL.c NGAP_FiveG-S-TMSI.c NGAP_FiveG-TMSI.c NGAP_FiveQI.c @@ -213,7 +256,7 @@ set(ngap_source NGAP_HandoverRequest.c NGAP_HandoverRequired.c NGAP_HandoverRequiredTransfer.c - NGAP_HandoverResourceAllocationUnsuccessfulTransfer.c + NGAP_HandoverResourceAllocationUnsuccessfulTransfer.c NGAP_HandoverType.c NGAP_IMSVoiceSupportIndicator.c NGAP_IndexToRFSP.c @@ -331,7 +374,7 @@ set(ngap_source NGAP_PDUSessionResourceModifyConfirmTransfer.c NGAP_PDUSessionResourceModifyIndication.c NGAP_PDUSessionResourceModifyIndicationTransfer.c - NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.c + NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.c NGAP_PDUSessionResourceModifyItemModCfm.c NGAP_PDUSessionResourceModifyItemModInd.c NGAP_PDUSessionResourceModifyItemModReq.c @@ -344,7 +387,7 @@ set(ngap_source NGAP_PDUSessionResourceModifyRequestTransfer.c NGAP_PDUSessionResourceModifyResponse.c NGAP_PDUSessionResourceModifyResponseTransfer.c - NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.c + NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.c NGAP_PDUSessionResourceNotify.c NGAP_PDUSessionResourceNotifyItem.c NGAP_PDUSessionResourceNotifyList.c @@ -378,7 +421,7 @@ set(ngap_source NGAP_PDUSessionResourceSetupRequestTransfer.c NGAP_PDUSessionResourceSetupResponse.c NGAP_PDUSessionResourceSetupResponseTransfer.c - NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.c + NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.c NGAP_PDUSessionResourceSwitchedItem.c NGAP_PDUSessionResourceSwitchedList.c NGAP_PDUSessionResourceToBeSwitchedDLItem.c @@ -616,14 +659,30 @@ set(ngap_source NGAP_XnGTP-TLAs.c NGAP_XnTLAs.c NGAP_XnTNLConfigurationInfo.c + ObjectDescriptor.c OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c PrintableString.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c xer_decoder.c xer_encoder.c xer_support.c @@ -631,17 +690,21 @@ set(ngap_source set(ngap_headers ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h @@ -651,7 +714,7 @@ set(ngap_headers constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h + GraphicString.h INTEGER.h NativeEnumerated.h NativeInteger.h @@ -744,7 +807,7 @@ set(ngap_headers NGAP_ConfidentialityProtectionIndication.h NGAP_ConfidentialityProtectionResult.h NGAP_ConfiguredNSSAI.h - NGAP_CoreNetworkAssistanceInformationForInactive.h + NGAP_CoreNetworkAssistanceInformationForInactive.h NGAP_COUNTValueForPDCP-SN12.h NGAP_COUNTValueForPDCP-SN18.h NGAP_CPTransportLayerInformation.h @@ -817,6 +880,7 @@ set(ngap_headers NGAP_ExpectedUEMobility.h NGAP_ExpectedUEMovingTrajectory.h NGAP_ExpectedUEMovingTrajectoryItem.h + NGAP_EXTERNAL.h NGAP_FiveG-S-TMSI.h NGAP_FiveG-TMSI.h NGAP_FiveQI.h @@ -846,7 +910,7 @@ set(ngap_headers NGAP_HandoverRequest.h NGAP_HandoverRequired.h NGAP_HandoverRequiredTransfer.h - NGAP_HandoverResourceAllocationUnsuccessfulTransfer.h + NGAP_HandoverResourceAllocationUnsuccessfulTransfer.h NGAP_HandoverType.h NGAP_IMSVoiceSupportIndicator.h NGAP_IndexToRFSP.h @@ -964,7 +1028,7 @@ set(ngap_headers NGAP_PDUSessionResourceModifyConfirmTransfer.h NGAP_PDUSessionResourceModifyIndication.h NGAP_PDUSessionResourceModifyIndicationTransfer.h - NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.h + NGAP_PDUSessionResourceModifyIndicationUnsuccessfulTransfer.h NGAP_PDUSessionResourceModifyItemModCfm.h NGAP_PDUSessionResourceModifyItemModInd.h NGAP_PDUSessionResourceModifyItemModReq.h @@ -977,7 +1041,7 @@ set(ngap_headers NGAP_PDUSessionResourceModifyRequestTransfer.h NGAP_PDUSessionResourceModifyResponse.h NGAP_PDUSessionResourceModifyResponseTransfer.h - NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h + NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h NGAP_PDUSessionResourceNotify.h NGAP_PDUSessionResourceNotifyItem.h NGAP_PDUSessionResourceNotifyList.h @@ -1011,7 +1075,7 @@ set(ngap_headers NGAP_PDUSessionResourceSetupRequestTransfer.h NGAP_PDUSessionResourceSetupResponse.h NGAP_PDUSessionResourceSetupResponseTransfer.h - NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h + NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h NGAP_PDUSessionResourceSwitchedItem.h NGAP_PDUSessionResourceSwitchedList.h NGAP_PDUSessionResourceToBeSwitchedDLItem.h @@ -1249,6 +1313,7 @@ set(ngap_headers NGAP_XnGTP-TLAs.h NGAP_XnTLAs.h NGAP_XnTNLConfigurationInfo.h + ObjectDescriptor.h OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h @@ -1257,6 +1322,10 @@ set(ngap_headers per_opentype.h per_support.h PrintableString.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h xer_decoder.h xer_encoder.h xer_support.h diff --git a/openair3/NGAP/MESSAGES/CMakeLists.txt b/openair3/NGAP/MESSAGES/CMakeLists.txt index 5d68fb6f2f..4b8db2efc0 100644 --- a/openair3/NGAP/MESSAGES/CMakeLists.txt +++ b/openair3/NGAP/MESSAGES/CMakeLists.txt @@ -10,7 +10,7 @@ else() endif() add_custom_command(OUTPUT ${ngap_source} ${ngap_headers} - COMMAND ASN1C_PREFIX=NGAP_ asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -fno-include-deps -findirect-choice -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${NGAP_GRAMMAR} + COMMAND ASN1C_PREFIX=NGAP_ asn1c -pdu=all -fcompound-names -gen-APER -no-gen-BER -no-gen-JER -no-gen-OER -gen-UPER -no-gen-example -fno-include-deps -findirect-choice -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${NGAP_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${NGAP_GRAMMAR} COMMENT "Generating NGAP source files from ${CMAKE_CURRENT_SOURCE_DIR}/${NGAP_GRAMMAR}" ) diff --git a/openair3/NRPPA/MESSAGES/ASN1/38455.cmake b/openair3/NRPPA/MESSAGES/ASN1/38455.cmake index 08795339cb..d81f3db96c 100644 --- a/openair3/NRPPA/MESSAGES/ASN1/38455.cmake +++ b/openair3/NRPPA/MESSAGES/ASN1/38455.cmake @@ -1,10 +1,21 @@ set(NRPPA_GRAMMAR ASN1/38455.asn) set(nrppa_source +ANY_aper.c +ANY_ber.c ANY.c +ANY_jer.c +ANY_uper.c +ANY_xer.c +aper_decoder.c +aper_encoder.c +aper_opentype.c +aper_support.c asn_application.c asn_bit_data.c +asn_codecs_prim_ber.c asn_codecs_prim.c +asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c @@ -13,17 +24,67 @@ ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c -BOOLEAN.c +BIT_STRING_jer.c +BIT_STRING_print.c +BIT_STRING_rfill.c +BIT_STRING_uper.c +BIT_STRING_xer.c constraints.c +constr_CHOICE_aper.c +constr_CHOICE_ber.c constr_CHOICE.c +constr_CHOICE_jer.c +constr_CHOICE_print.c +constr_CHOICE_rfill.c +constr_CHOICE_uper.c +constr_CHOICE_xer.c +constr_SEQUENCE_aper.c +constr_SEQUENCE_ber.c constr_SEQUENCE.c +constr_SEQUENCE_jer.c +constr_SEQUENCE_OF_aper.c +constr_SEQUENCE_OF_ber.c constr_SEQUENCE_OF.c +constr_SEQUENCE_OF_jer.c +constr_SEQUENCE_OF_uper.c +constr_SEQUENCE_OF_xer.c +constr_SEQUENCE_print.c +constr_SEQUENCE_rfill.c +constr_SEQUENCE_uper.c +constr_SEQUENCE_xer.c +constr_SET_OF_aper.c +constr_SET_OF_ber.c constr_SET_OF.c +constr_SET_OF_jer.c +constr_SET_OF_print.c +constr_SET_OF_rfill.c +constr_SET_OF_uper.c +constr_SET_OF_xer.c constr_TYPE.c der_encoder.c +GraphicString.c +INTEGER_aper.c +INTEGER_ber.c INTEGER.c +INTEGER_jer.c +INTEGER_print.c +INTEGER_rfill.c +INTEGER_uper.c +INTEGER_xer.c +jer_encoder.c +NativeEnumerated_aper.c NativeEnumerated.c +NativeEnumerated_jer.c +NativeEnumerated_uper.c +NativeEnumerated_xer.c +NativeInteger_aper.c +NativeInteger_ber.c NativeInteger.c +NativeInteger_jer.c +NativeInteger_print.c +NativeInteger_rfill.c +NativeInteger_uper.c +NativeInteger_xer.c NRPPA_AbortTransmission.c NRPPA_ActivationTime.c NRPPA_ActiveULBWP.c @@ -72,6 +133,7 @@ NRPPA_E-CID-MeasurementResult.c NRPPA_E-CIDMeasurementTerminationCommand.c NRPPA_ErrorIndication.c NRPPA_EUTRACellIdentifier.c +NRPPA_EXTERNAL.c NRPPA_GeographicalCoordinates.c NRPPA_GNB-RxTxTimeDiff.c NRPPA_GNBRxTxTimeDiffMeas.c @@ -341,26 +403,57 @@ NRPPA_WLANMeasurementResult.c NRPPA_WLANMeasurementResult-Item.c NRPPA_WLANOperatingClass.c NRPPA_WLAN-RSSI.c +NULL_aper.c +NULL_ber.c NULL.c +NULL_jer.c +NULL_print.c +NULL_rfill.c +NULL_uper.c +NULL_xer.c +ObjectDescriptor.c OBJECT_IDENTIFIER.c +OBJECT_IDENTIFIER_jer.c +OBJECT_IDENTIFIER_print.c +OBJECT_IDENTIFIER_rfill.c +OBJECT_IDENTIFIER_xer.c +OCTET_STRING_aper.c +OCTET_STRING_ber.c OCTET_STRING.c +OCTET_STRING_jer.c +OCTET_STRING_print.c +OCTET_STRING_rfill.c +OCTET_STRING_uper.c +OCTET_STRING_xer.c +OPEN_TYPE_aper.c +OPEN_TYPE_ber.c OPEN_TYPE.c +OPEN_TYPE_uper.c +OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c per_support.c +uper_decoder.c +uper_encoder.c +uper_opentype.c +uper_support.c xer_decoder.c xer_encoder.c xer_support.c - ) set(nrppa_headers ANY.h +aper_decoder.h +aper_encoder.h +aper_opentype.h +aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h +asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h @@ -371,7 +464,6 @@ ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h -BOOLEAN.h constraints.h constr_CHOICE.h constr_SEQUENCE.h @@ -379,7 +471,9 @@ constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h der_encoder.h +GraphicString.h INTEGER.h +jer_encoder.h NativeEnumerated.h NativeInteger.h NRPPA_AbortTransmission.h @@ -431,6 +525,7 @@ NRPPA_E-CID-MeasurementResult.h NRPPA_E-CIDMeasurementTerminationCommand.h NRPPA_ErrorIndication.h NRPPA_EUTRACellIdentifier.h +NRPPA_EXTERNAL.h NRPPA_GeographicalCoordinates.h NRPPA_GNB-RxTxTimeDiff.h NRPPA_GNBRxTxTimeDiffMeas.h @@ -701,6 +796,7 @@ NRPPA_WLANMeasurementResult-Item.h NRPPA_WLANOperatingClass.h NRPPA_WLAN-RSSI.h NULL.h +ObjectDescriptor.h OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h @@ -708,8 +804,11 @@ per_decoder.h per_encoder.h per_opentype.h per_support.h +uper_decoder.h +uper_encoder.h +uper_opentype.h +uper_support.h xer_decoder.h xer_encoder.h xer_support.h - -) \ No newline at end of file +) diff --git a/openair3/NRPPA/MESSAGES/CMakeLists.txt b/openair3/NRPPA/MESSAGES/CMakeLists.txt index e596272175..2b7119bcc4 100644 --- a/openair3/NRPPA/MESSAGES/CMakeLists.txt +++ b/openair3/NRPPA/MESSAGES/CMakeLists.txt @@ -10,7 +10,7 @@ include(ASN1/38455.cmake) #endif() add_custom_command(OUTPUT ${nrppa_source} ${nrppa_headers} - COMMAND ASN1C_PREFIX=NRPPA_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${NRPPA_GRAMMAR} + COMMAND ASN1C_PREFIX=NRPPA_ asn1c -gen-APER -gen-UPER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${NRPPA_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${NRPPA_GRAMMAR} COMMENT "Generating NRPPA source files from ${CMAKE_CURRENT_SOURCE_DIR}/${NRPPA_GRAMMAR}" ) diff --git a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.6.0.cmake b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.6.0.cmake index 8f8758c7dc..5246dfa291 100644 --- a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.6.0.cmake +++ b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.6.0.cmake @@ -1,33 +1,91 @@ set(S1AP_GRAMMAR ASN1/R15/s1ap-15.6.0.asn1) set(s1ap_source + ANY_aper.c ANY.c + ANY_uper.c + ANY_xer.c + aper_decoder.c + aper_encoder.c + aper_opentype.c + aper_support.c asn_application.c asn_bit_data.c asn_codecs_prim.c + asn_codecs_prim_xer.c asn_internal.c asn_random_fill.c asn_SEQUENCE_OF.c asn_SET_OF.c - ber_decoder.c ber_tlv_length.c ber_tlv_tag.c BIT_STRING.c - BOOLEAN.c + BIT_STRING_print.c + BIT_STRING_rfill.c + BIT_STRING_uper.c + BIT_STRING_xer.c constraints.c + constr_CHOICE_aper.c constr_CHOICE.c + constr_CHOICE_print.c + constr_CHOICE_rfill.c + constr_CHOICE_uper.c + constr_CHOICE_xer.c + constr_SEQUENCE_aper.c constr_SEQUENCE.c + constr_SEQUENCE_OF_aper.c constr_SEQUENCE_OF.c + constr_SEQUENCE_OF_uper.c + constr_SEQUENCE_OF_xer.c + constr_SEQUENCE_print.c + constr_SEQUENCE_rfill.c + constr_SEQUENCE_uper.c + constr_SEQUENCE_xer.c + constr_SET_OF_aper.c constr_SET_OF.c + constr_SET_OF_print.c + constr_SET_OF_rfill.c + constr_SET_OF_uper.c + constr_SET_OF_xer.c constr_TYPE.c - der_encoder.c + GraphicString.c + INTEGER_aper.c INTEGER.c + INTEGER_print.c + INTEGER_rfill.c + INTEGER_uper.c + INTEGER_xer.c + NativeEnumerated_aper.c NativeEnumerated.c + NativeEnumerated_uper.c + NativeEnumerated_xer.c + NativeInteger_aper.c NativeInteger.c + NativeInteger_print.c + NativeInteger_rfill.c + NativeInteger_uper.c + NativeInteger_xer.c + NULL_aper.c NULL.c + NULL_print.c + NULL_rfill.c + NULL_uper.c + NULL_xer.c + ObjectDescriptor.c OBJECT_IDENTIFIER.c + OBJECT_IDENTIFIER_print.c + OBJECT_IDENTIFIER_rfill.c + OBJECT_IDENTIFIER_xer.c + OCTET_STRING_aper.c OCTET_STRING.c + OCTET_STRING_print.c + OCTET_STRING_rfill.c + OCTET_STRING_uper.c + OCTET_STRING_xer.c + OPEN_TYPE_aper.c OPEN_TYPE.c + OPEN_TYPE_uper.c + OPEN_TYPE_xer.c per_decoder.c per_encoder.c per_opentype.c @@ -265,6 +323,7 @@ set(s1ap_source S1AP_ExtendedRepetitionPeriod.c S1AP_ExtendedRNC-ID.c S1AP_Extended-UEIdentityIndexValue.c + S1AP_EXTERNAL.c S1AP_FailureEventReport.c S1AP_FailureEventReportingCause.c S1AP_FiveGSTAC.c @@ -673,6 +732,10 @@ set(s1ap_source S1AP_WriteReplaceWarningRequest.c S1AP_WriteReplaceWarningResponse.c S1AP_X2TNLConfigurationInfo.c + uper_decoder.c + uper_encoder.c + uper_opentype.c + uper_support.c xer_decoder.c xer_encoder.c xer_support.c @@ -680,32 +743,36 @@ set(s1ap_source set(s1ap_headers ANY.h + aper_decoder.h + aper_encoder.h + aper_opentype.h + aper_support.h asn_application.h asn_bit_data.h asn_codecs.h asn_codecs_prim.h + asn_config.h asn_internal.h asn_ioc.h asn_random_fill.h asn_SEQUENCE_OF.h asn_SET_OF.h asn_system.h - ber_decoder.h ber_tlv_length.h ber_tlv_tag.h BIT_STRING.h - BOOLEAN.h constraints.h constr_CHOICE.h constr_SEQUENCE.h constr_SEQUENCE_OF.h constr_SET_OF.h constr_TYPE.h - der_encoder.h + GraphicString.h INTEGER.h NativeEnumerated.h NativeInteger.h NULL.h + ObjectDescriptor.h OBJECT_IDENTIFIER.h OCTET_STRING.h OPEN_TYPE.h @@ -947,6 +1014,7 @@ set(s1ap_headers S1AP_ExtendedRepetitionPeriod.h S1AP_ExtendedRNC-ID.h S1AP_Extended-UEIdentityIndexValue.h + S1AP_EXTERNAL.h S1AP_FailureEventReport.h S1AP_FailureEventReportingCause.h S1AP_FiveGSTAC.h @@ -1355,6 +1423,10 @@ set(s1ap_headers S1AP_WriteReplaceWarningRequest.h S1AP_WriteReplaceWarningResponse.h S1AP_X2TNLConfigurationInfo.h + uper_decoder.h + uper_encoder.h + uper_opentype.h + uper_support.h xer_decoder.h xer_encoder.h xer_support.h diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py deleted file mode 100644 index b5a141349b..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py +++ /dev/null @@ -1,732 +0,0 @@ -import re, os, sys, string -import datetime -import getopt -import getpass - -version = "1.0.2" - -lines = "" -iesDefs = {} -ieofielist = {} -outdir = './' - -filenames = [] -verbosity = 0 -prefix = "" - -FAIL = '\033[91m' -WARN = '\033[93m' -ENDC = '\033[0m' - -fileprefix = "" -fileprefix_first_upper = "" - -def printFail(string): - sys.stderr.write(FAIL + string + ENDC + "\n") - -def printWarning(string): - print WARN + string + ENDC - -def printDebug(string): - if verbosity > 0: - print string - -def outputHeaderToFile(f, filename): - now = datetime.datetime.now() - f.write("""/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -""") - f.write("/*******************************************************************************\n") - f.write(" * This file had been created by asn1tostruct.py script v%s\n" % (version)) - f.write(" * Please do not modify this file but regenerate it via script.\n") - f.write(" * Created on: %s by %s\n * from %s\n" % (str(now), getpass.getuser(), filenames)) - f.write(" ******************************************************************************/\n") - -def lowerFirstCamelWord(word): - """ puts the first word in a CamelCase Word in lowercase. - - I.e. CustomerID becomes customerID, XMLInfoTest becomes xmlInfoTest - """ - newstr = '' - swapped = word.swapcase() - idx = 0 - - # if it's all-caps, return an all-lowered version - lowered = word.lower() - - if swapped == lowered: - return lowered - - for c in swapped: - if c in string.lowercase: - newstr += c - idx += 1 - else: - break - if idx < 2: - newstr += word[idx:] - else: - newstr = newstr[:-1]+ word[idx-1:] - - return newstr - -def usage(): - print "Python parser for asn1 v%s" % (version) - print "Usage: python asn1tostruct.py [options]" - print "Available options:" - print "-d Enable script debug" - print "-f [file] Input file to parse" - print "-o [dir] Output files to given directory" - print "-h Print this help and return" - -try: - opts, args = getopt.getopt(sys.argv[1:], "df:ho:", ["debug", "file", "help", "outdir"]) -except getopt.GetoptError as err: - # print help information and exit: - usage() - sys.exit(2) - -for o, a in opts: - if o in ("-f", "--file"): - filenames.append(a) - if o in ("-d", "--debug"): - verbosity = 1 - if o in ("-o", "--outdir"): - outdir = a - if outdir.rfind('/') != len(outdir): - outdir += '/' - if o in ("-h", "--help"): - usage() - sys.exit(2) - -for filename in filenames: - file = open(filename, 'r') - for line in file: - # Removing any comment - if line.find('--') >= 0: - line = line[:line.find('--')] - # Removing any carriage return - lines += re.sub('\r', '', line) - - for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+SEQUENCE\s+\(\s*SIZE\s*\(\s*\d+\s*\.\.\s*[0-9a-zA-Z-]+\s*\)\s*\)\s*OF\s+[a-zA-Z-]+\s*\{\s*\{\s*([0-9a-zA-Z-]+)\s*\}\s*\}', lines, re.MULTILINE): - ieofielist[m[0]] = m[1] - for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+E-RAB-IE-ContainerList\s*\{\s*\{\s*([a-zA-Z0-9-]+)\s*\}\s*\}', lines, re.MULTILINE): - ieofielist[m[0]] = m[1] - - for i in re.findall(r'([a-zA-Z0-9-]+)\s+([A-Z0-9-]+)\s*::=\s*\{\s+([\,\|\{\}\t\n\.{3}\ \-a-zA-Z0-9]+)\s+}\n', lines, re.MULTILINE): - ies = [] - maxLength = 0 - # TODO: handle extensions - if i[1].find('EXTENSION') >= 0: - continue - if fileprefix == "": - fileprefix = i[1][:i[1].find('-')].lower() - for j in re.findall(r'\s*\{\s*([a-zA-Z0-9-\ \t]+)\s*\}\s*[\|,]*', i[2], re.MULTILINE): - for k in re.findall(r'ID\s*([a-zA-Z0-9\-]+)\s*CRITICALITY\s*([a-zA-Z0-9\-]+)\s+[A-Z]+\s+([a-zA-Z0-9\-]+)\s*PRESENCE\s*([a-zA-Z0-9\-]+)', j, re.MULTILINE): - printDebug("Got new ie for message " + i[0] + ": " + str(k)) - if len(k[2]) > maxLength: - maxLength = len(k[2]) - ies.append(k) - - if len(ies) > 0: - iesDefs[i[0]] = { "length": maxLength, "ies": ies } - else: - printWarning("Didn't find any information element for message: " + i[0]) - -if len(iesDefs) == 0: - printFail("No Information Element parsed, exiting") - sys.exit(0) - -fileprefix_first_upper = fileprefix[0].upper() + fileprefix[1:] - -f = open(outdir + fileprefix + '_ies_defs.h', 'w') -outputHeaderToFile(f, filename) -f.write("#include \"%s_common.h\"\n\n" % (fileprefix)) -f.write("#ifndef %s_IES_DEFS_H_\n#define %s_IES_DEFS_H_\n\n" % (fileprefix.upper(), fileprefix.upper())) -f.write("/* Define the version of script used to generate this file */\n") -f.write("#define %s_SCRIPT_VERSION (%s)\n\n" % (fileprefix.upper(), re.sub('\.', '', version))) - -for key in iesDefs: - - if key not in ieofielist.values(): - continue - - for (i, j) in ieofielist.items(): - if j == key: - break - - f.write("typedef struct %sIEs_s {\n" % (re.sub('-', '_', i))) - f.write(" A_SEQUENCE_OF(struct %s_s) %s;\n" % (re.sub('IEs', '', re.sub('-', '_', ieofielist[i])), lowerFirstCamelWord(re.sub('IEs', '', re.sub('-', '_', ieofielist[i]))))) - f.write("} %sIEs_t;\n\n" % (re.sub('-', '_', i))) - -for key in iesDefs: - keyupperunderscore = re.sub('-', '_', key.upper()) - keylowerunderscore = re.sub('-', '_', key.lower()) - shift = 0 - - if len(iesDefs[key]["ies"]) == 0: - continue - - # Presence mask - for ie in iesDefs[key]["ies"]: - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] == "optional" or ie[3] == "conditional": - f.write("#define {0:<{pad}} {1}\n".format("%s_%s_PRESENT" % (keyupperunderscore, ieupperunderscore), "(1 << %d)" % shift, - pad=iesDefs[key]["length"] + len(keyupperunderscore) + 9)) - shift += 1 - if (shift > 0): - f.write("\n") - - f.write("typedef struct %s_s {\n" % (re.sub('-', '_', key))) - if (shift > 0): - f.write(" {0:<{pad}} {1};\n".format("uint16_t", "presenceMask", pad=iesDefs[key]["length"] + 2)) - for ie in iesDefs[key]["ies"]: - ieunderscore = re.sub('-', '_', ie[2]) - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - if ie[2] in ieofielist: - f.write(" %sIEs_t %s;" % (re.sub('-', '_', ie[2]), ienameunderscore)) - else: - f.write(" {0:<{pad}} {1};".format("%s_t" % ieunderscore, ienameunderscore, pad=iesDefs[key]["length"] + 2)) - if ie[3] == "optional": - f.write(" ///< Optional field") - elif ie[3] == "conditional": - f.write(" ///< Conditional field") - f.write("\n") - - f.write("} %s_t;\n\n" % (re.sub('-', '_', key))) - -f.write("typedef struct %s_message_s {\n" % (fileprefix)) -f.write(" %s_ProcedureCode_t procedureCode;\n" % (fileprefix_first_upper)) -f.write(" %s_Criticality_t criticality;\n" % (fileprefix_first_upper)) -f.write(" uint8_t direction;\n") -f.write(" union {\n") - -messageList = iesDefs.keys() -messageList.sort() -for message in messageList: - if message in ieofielist.values(): - continue - if len(iesDefs[message]["ies"]) == 0: - continue - f.write(" %s_t %s;\n" % (re.sub('-', '_', message), lowerFirstCamelWord(re.sub('-', '_', message)))) -f.write(" } msg;\n") -f.write("} %s_message;\n\n" % (fileprefix)) - -for key in iesDefs: - if key in ieofielist.values(): - continue - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - keylowerunderscore = re.sub('-', '_', key.lower()) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - f.write("/* %s in iesDefs not in ieofielist.values() */\n" % (key)) - f.write("/** \\brief Decode function for %s ies.\n" % (key)) - if len(iesDefs[key]["ies"]) != 0: - f.write(" * \\param %s Pointer to ASN1 structure in which data will be stored\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" * \\param any_p Pointer to the ANY value to decode.\n") - f.write(" **/\n") - f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore)) - if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" ANY_t *any_p);\n\n") - - if len(iesDefs[key]["ies"]) == 0: - continue - - f.write("/* %s in iesDefs not in ieofielist.values() */\n" % (key)) - f.write("/** \\brief Encode function for %s ies.\n" % (key)) - f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" **/\n") - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - - -for key in iesDefs: - if key not in ieofielist.values(): - continue - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key)) - f.write("/** \\brief Encode function for %s ies.\n" % (key)) - f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" **/\n") - f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key)) - f.write("int %s_encode_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %sIEs_t *%sIEs);\n\n" % (asn1cStruct, firstlower)) - f.write("/** \\brief Decode function for %s ies.\n" % (key)) - f.write(" * \\param any_p Pointer to the ANY value to decode.\n") - f.write(" * \\param callback Callback function called when any_p is successfully decoded.\n") - f.write(" **/\n") - f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key)) - f.write("int %s_decode_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" %sIEs_t *%sIEs,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (asn1cStruct, lowerFirstCamelWord(asn1cStruct))) - - - -for key in iesDefs: - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - if key in ieofielist.values(): - f.write("/** \\brief Display %s encapsulated IE using XER encoding.\n" % (asn1cStruct)) - f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" * \\param file File descriptor to write output.\n") - f.write(" **/\n") - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('item', 'list', firstlower.lower()))) - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - f.write(" %sIEs_t *%sIEs);\n\n" % (re.sub('item', 'list', asn1cStruct), firstlower)) - else: - f.write("/** \\brief Display %s message using XER encoding.\n" % (asn1cStruct)) - f.write(" * \\param message_p Pointer to root message.\n") - f.write(" * \\param file File descriptor to write output.\n") - f.write(" **/\n") - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, firstlower.lower())) - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - f.write(" %s_message *message_p);\n\n" % (fileprefix)) - -f.write("int %s_xer__print2sp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower())) -f.write("int %s_xer__print2fp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower())) -f.write("extern size_t %s_string_total_size;\n\n" % (fileprefix.lower())) -f.write("#endif /* %s_IES_DEFS_H_ */\n\n" % (fileprefix.upper())) - -#Generate Decode functions -f = open(outdir + fileprefix + '_decoder.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix)) -for key in iesDefs: - if key in ieofielist.values(): - continue - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: - asn1cStruct = asn1cStruct[:-1] - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - ielistname = re.sub('UE', 'ue', asn1cStruct) - ielistnamefirstlower = ielistname[:1].lower() + ielistname[1:] - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - iesaccess = "" - if key not in ieofielist.values(): - iesaccess = "%s_ies." % (firstlower) - - f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" ANY_t *any_p) {\n\n") - - f.write(" %s_t %s;\n %s_t *%s_p = &%s;\n" % (asn1cStruct, asn1cStructfirstlower, asn1cStruct, asn1cStructfirstlower, asn1cStructfirstlower)) - f.write(" int i, decoded = 0;\n") - if len(iesDefs[key]["ies"]) != 0: - f.write(" int tempDecoded = 0;\n") - - f.write(" assert(any_p != NULL);\n") - if len(iesDefs[key]["ies"]) != 0: - f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - - f.write(" %s_DEBUG(\"Decoding message %s (%%s:%%d)\\n\", __FILE__, __LINE__);\n\n" % (fileprefix.upper(), re.sub('-', '_', keyName))) - f.write(" ANY_to_type_aper(any_p, &asn_DEF_%s, (void**)&%s_p);\n\n" % (asn1cStruct, asn1cStructfirstlower)) - f.write(" for (i = 0; i < %s_p->%slist.count; i++) {\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" %s_IE_t *ie_p;\n" % (fileprefix[0].upper() + fileprefix[1:])) - f.write(" ie_p = %s_p->%slist.array[i];\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" switch(ie_p->id) {\n") - for ie in iesDefs[key]["ies"]: - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - ienameunderscorefirstlower = lowerFirstCamelWord(ienameunderscore) - ietypesubst = re.sub('-', '', ie[2]) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" {\n") - f.write(" %s_t *%s_p = NULL;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - if ie[3] != "mandatory": - f.write(" %s->presenceMask |= %s_%s_PRESENT;\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) - f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(ietypesubst))) - f.write(" %s_ERROR(\"Decoding of IE %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore)) - f.write(" if (%s_p)\n" % (lowerFirstCamelWord(ietypesubst))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" decoded += tempDecoded;\n") - f.write(" if (asn1_xer_print)\n") - f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - if ie[2] in ieofielist.keys(): - f.write(" if (%s_decode_%s(&%s->%s, %s_p) < 0) {\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" %s_ERROR(\"Decoding of encapsulated IE %s failed\\n\");\n" % (fileprefix.upper(), lowerFirstCamelWord(ietypesubst))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" }\n") - else: - f.write(" memcpy(&%s->%s, %s_p, sizeof(%s_t));\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst), ietypeunderscore)) - #f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) - f.write(" } break;\n") - f.write(" default:\n") - f.write(" %s_ERROR(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower()))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" }\n") - f.write(" return decoded;\n") - f.write("}\n\n") - -for key in iesDefs: - if key not in ieofielist.values(): - continue - - keyname = re.sub('IEs', '', re.sub('Item', 'List', key)) - - f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', keyname).lower())) - f.write(" %sIEs_t *%sIEs,\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" int i, decoded = 0;\n") - f.write(" int tempDecoded = 0;\n\n") - - f.write(" assert(%s != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))); - f.write(" assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))); - - f.write(" for (i = 0; i < %s->list.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_IE_t *ie_p = %s->list.array[i];\n" % (fileprefix[0].upper() + fileprefix[1:], lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" switch (ie_p->id) {\n") - for ie in iesDefs[key]["ies"]: - iename = re.sub('id-', '', ie[0]) - ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) - f.write(" case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" {\n") - f.write(" %s_t *%s_p = NULL;\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" %s_ERROR(\"Decoding of IE %s for message %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore, re.sub('-', '_', keyname))) - f.write(" if (%s_p)\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - #f.write(" free(%s_p);\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" decoded += tempDecoded;\n") - f.write(" if (asn1_xer_print)\n") - f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" ASN_SEQUENCE_ADD(&%sIEs->%s, %s_p);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)), - re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), lowerFirstCamelWord(re.sub('-', '', ie[2])))) - f.write(" } break;\n") - f.write(" default:\n") - f.write(" %s_ERROR(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower()))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" }\n") - f.write(" return decoded;\n") - f.write("}\n\n") - - -#Generate IES Encode functions -f = open(outdir + fileprefix + '_encoder.c', 'w') -outputHeaderToFile(f,filename) -f.write("#include \"%s_common.h\"\n" % (fileprefix)) -f.write("#include \"%s_ies_defs.h\"\n\n" % (fileprefix)) -for key in iesDefs: - if key in ieofielist.values(): - continue - - structName = re.sub('ies', '', key) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: - asn1cStruct = asn1cStruct[:-1] - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - iesaccess = "" - if key not in ieofielist.values(): - iesaccess = "%s_ies." % (firstwordlower) - - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - # No IE to encode... - if len(iesDefs[key]["ies"]) == 0: - continue - - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - - f.write(" %s_IE_t *ie;\n\n" % (fileprefix_first_upper)) - - f.write(" assert(%s != NULL);\n" % (firstwordlower)); - f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))); - - for ie in iesDefs[key]["ies"]: - iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) - ienamefirstwordlower = lowerFirstCamelWord(iename) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - ietypeunderscore = re.sub('-', '_', ie[2]) - - if ie[3] != "mandatory": - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" if (%s->presenceMask & %s_%s_PRESENT) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) - #f.write(" == %s_%s_PRESENT) {\n" % (keyupperunderscore, ieupperunderscore)) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n" % (firstwordlower, iesaccess)) - f.write(" }\n\n") - else: - if ie[2] in ieofielist.keys(): - f.write(" %s_t %s;\n\n" % (ietypeunderscore, ienamefirstwordlower)) - f.write(" memset(&%s, 0, sizeof(%s_t));\n" % (ienamefirstwordlower, ietypeunderscore)) - f.write("\n") - f.write(" if (%s_encode_%s(&%s, &%s->%s) < 0) return -1;\n" % (fileprefix, ietypeunderscore.lower(), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - if ie[2] in ieofielist.keys(): - f.write(" &%s)) == NULL) {\n" % (ienamefirstwordlower)) - else: - f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n\n" % (firstwordlower, iesaccess)) - if ie[2] in ieofielist.keys(): - f.write(" /* Free any dynamic allocation that is no more used */\n") - f.write(" ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_%s, &%s);\n\n" % (ietypeunderscore, ienamefirstwordlower)) - - f.write(" return 0;\n") - f.write("}\n\n") - -for (key, value) in iesDefs.items(): - if key not in ieofielist.values(): - continue - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - for (i, j) in ieofielist.items(): - if j == key: - break - f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', i).lower())) - f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %sIEs_t *%sIEs) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) - f.write(" int i;\n") - - f.write(" %s_IE_t *ie;\n\n" % (fileprefix_first_upper)) - - f.write(" assert(%s != NULL);\n" % (firstwordlower)); - f.write(" assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', i)))); - - f.write(" for (i = 0; i < %sIEs->%s.count; i++) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0]))) - f.write(" %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1])) - f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) - f.write(" %sIEs->%s.array[i])) == NULL) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" return -1;\n") - f.write(" }\n") - f.write(" ASN_SEQUENCE_ADD(&%s->list, ie);\n" % (firstwordlower)) - f.write(" }\n") - f.write(" return 0;\n") - f.write("}\n\n") - -#Generate xer print functions -f = open(outdir + fileprefix + '_xer_print.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \n") -f.write("#include \n\n") -f.write("#include \n#include \n\n") -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix)) - -f.write("size_t %s_string_total_size = 0;\n\n" % (fileprefix.lower())) -f.write("""int -%s_xer__print2fp(const void *buffer, size_t size, void *app_key) { - FILE *stream = (FILE *)app_key; - - if(fwrite(buffer, 1, size, stream) != size) - return -1; - - return 0; -} - -""" % (fileprefix.lower())) - -f.write("""int %s_xer__print2sp(const void *buffer, size_t size, void *app_key) { - char *string = (char *)app_key; - - /* Copy buffer to the formatted string */ - memcpy(&string[%s_string_total_size], buffer, size); - - %s_string_total_size += size; - - return 0; -} - -""" % (fileprefix.lower(), fileprefix.lower(), fileprefix.lower())) - -f.write("""static asn_enc_rval_t -xer_encode_local(asn_TYPE_descriptor_t *td, void *sptr, - asn_app_consume_bytes_f *cb, void *app_key, int indent) { - asn_enc_rval_t er, tmper; - const char *mname; - size_t mlen; - int xcan = 2; - - if(!td || !sptr) goto cb_failed; - - mname = td->xml_tag; - mlen = strlen(mname); - - ASN__TEXT_INDENT(0, indent); - ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); - - tmper = td->op->xer_encoder(td, sptr, indent + 1, XER_F_BASIC, cb, app_key); - if(tmper.encoded == -1) return tmper; - - ASN__CALLBACK3("\\n", xcan); - - er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; - - ASN__ENCODED_OK(er); -cb_failed: - ASN__ENCODE_FAILED; -} -""") - -for (key, value) in iesDefs.items(): - keyName = re.sub('-', '_', key) - keyupperunderscore = keyName.upper() - iesStructName = lowerFirstCamelWord(re.sub('-', '_', key)) - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - - if key in ieofielist.values(): - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('item', 'list', re.sub('-', '_', key).lower())))) - else: - f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', key).lower()))) - #f.write(" FILE *file,\n") - f.write(" asn_app_consume_bytes_f *cb,\n") - f.write(" void *app_key,\n") - if key in ieofielist.values(): - iesStructName = lowerFirstCamelWord(re.sub('Item', 'List', re.sub('-', '_', key))) - f.write(" %sIEs_t *%s) {\n\n" % (re.sub('IEs', '', re.sub('Item', 'List', re.sub('-', '_', key))), iesStructName)) - f.write(" int i;\n") - f.write(" asn_enc_rval_t er;\n") - else: - f.write(" %s_message *message_p)\n{\n" % (fileprefix)) - f.write(" %s_t *%s;\n" % (re.sub('-', '_', key), iesStructName)) - f.write(" asn_enc_rval_t er;\n") - #f.write(" void *app_key = (void *)file;\n") - #f.write(" asn_app_consume_bytes_f *cb = %s_xer__print2fp;\n\n" % (fileprefix.lower())) - - f.write(" %s = &message_p->msg.%s;\n\n" % (iesStructName, iesStructName)) - - if key in ieofielist.values(): - # Increase indentation level - f.write(" for (i = 0; i < %s->%s.count; i++) {\n" % (iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - #f.write(" xer_fprint(file, &asn_DEF_%s, %s->%s.array[i]);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" er = xer_encode(&asn_DEF_%s, %s->%s.array[i], XER_F_BASIC, cb, app_key);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" }\n") - else: - f.write(" cb(\"<%s-PDU>\\n\", %d, app_key);\n" % (key, len("<%s-PDU>\n" % (key)))) - f.write(" xer_encode_local(&asn_DEF_%s_Criticality, &message_p->criticality, cb, app_key, 1);\n" % fileprefix_first_upper) - f.write(" xer_encode_local(&asn_DEF_%s_ProcedureCode, &message_p->procedureCode, cb, app_key, 1);\n" % fileprefix_first_upper) - - f.write(" cb(\" <%s>\\n\", %d, app_key);\n" % (key, len(" <%s>\n" % (key)))) - - for ie in iesDefs[key]["ies"]: - iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) - ienamefirstwordlower = lowerFirstCamelWord(iename) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() - - if ie[3] != "mandatory": - if ie[3] == "optional": - f.write(" /* Optional field */\n") - elif ie[3] == "conditional": - f.write(" /* Conditional field */\n") - f.write(" if (%s->presenceMask & %s_%s_PRESENT)\n " % (iesStructName, keyupperunderscore, ieupperunderscore)) - - # Is it an encapsulated IE ? - if ie[2] in ieofielist.keys(): - f.write(" %s_xer_print_%s(cb, app_key, &%s->%s);\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', ie[2]).lower()), iesStructName, ienamefirstwordlower)) - else: - f.write(" xer_encode_local(&asn_DEF_%s, &%s->%s, cb, app_key, 2);\n" % (ietypeunderscore, iesStructName, ienamefirstwordlower)) - f.write(" cb(\" \\n\", %d, app_key);\n" % (key, len(" \n" % (key)))) - f.write(" cb(\"\\n\", %d, app_key);\n" % (key, len("\n" % (key)))) - - f.write(" ASN__ENCODED_OK(er);\n") - #if key not in ieofielist.values(): - #f.write("cb_failed:\n") - #f.write(" return er;\n") - f.write("}\n\n") - - -#Generate xer print functions -f = open(outdir + fileprefix + '_compare.c', 'w') -outputHeaderToFile(f, filename) -f.write("#include \n") -f.write("#include \n\n") -f.write("#include \n#include \n\n") -f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n" % (fileprefix, fileprefix)) -f.write("#include \"%s-ProtocolIE-ID.h\"\n\n" % (fileprefix_first_upper)) - - -for (key, value) in iesDefs.items(): - if key not in ieofielist.values(): - continue - - ie = value["ies"][0] - ietypeunderscore = re.sub('-', '_', ie[2]) - asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) - - for (i, j) in ieofielist.items(): - if j == key: - break - - f.write("extern asn_TYPE_descriptor_t asn_DEF_%s;\n" % (ietypeunderscore)) diff --git a/openair3/S1AP/MESSAGES/CMakeLists.txt b/openair3/S1AP/MESSAGES/CMakeLists.txt index 5c6db417ea..4369b487b7 100644 --- a/openair3/S1AP/MESSAGES/CMakeLists.txt +++ b/openair3/S1AP/MESSAGES/CMakeLists.txt @@ -10,7 +10,7 @@ else() endif() add_custom_command(OUTPUT ${s1ap_source} ${s1ap_headers} - COMMAND ASN1C_PREFIX=S1AP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${S1AP_GRAMMAR} + COMMAND ASN1C_PREFIX=S1AP_ asn1c -gen-APER -no-gen-BER -no-gen-JER -no-gen-OER -gen-UPER -fcompound-names -no-gen-example -fno-include-deps -D ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${S1AP_GRAMMAR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${S1AP_GRAMMAR} COMMENT "Generating S1AP source files from ${CMAKE_CURRENT_SOURCE_DIR}/${S1AP_GRAMMAR}" )