asn1tostruct: fix defines getting redefined

Patch asn1tostruct.py, so it does not write the same define twice for
two fields in a struct, for example:

  #define ENHANCEDRELOCATIONCOMPLETEREQUESTIES_RANAP_EXTENDEDRNC_ID_PRESENT                   (1 << 0)
  #define ENHANCEDRELOCATIONCOMPLETEREQUESTIES_RANAP_EXTENDEDRNC_ID_PRESENT                   (1 << 1)
  #define ENHANCEDRELOCATIONCOMPLETEREQUESTIES_RANAP_RAB_SETUPLIST_ENHANCEDRELOCCOMPLETEREQ_PRESENT (1 << 2)

  typedef struct RANAP_EnhancedRelocationCompleteRequestIEs_s {
      uint16_t                                 presenceMask;
      RANAP_IuSignallingConnectionIdentifier_t oldIuSigConId;
      RANAP_IuSignallingConnectionIdentifier_t iuSigConId;
      RANAP_GlobalRNC_ID_t                     relocation_SourceRNC_ID;
      RANAP_ExtendedRNC_ID_t                   relocation_SourceExtendedRNC_ID; ///< Optional field
      RANAP_GlobalRNC_ID_t                     relocation_TargetRNC_ID;
      RANAP_ExtendedRNC_ID_t                   relocation_TargetExtendedRNC_ID; ///< Optional field
      RANAP_RAB_SetupList_EnhancedRelocCompleteReq_t raB_SetupList_EnhancedRelocCompleteReq; ///< Optional field
  } RANAP_EnhancedRelocationCompleteRequestIEs_t;

The problem is that the type is used and it may not be unique inside a
struct. Change the code to use the name of the field if the type is not
unique. Keep using the type otherwise so existing code doesn't need to
be modified a lot to fix this.

Fix for:
../include/osmocom/ranap/ranap_ies_defs.h:514: warning: "RANAP_ENHANCEDRELOCATIONINFORMATIONREQUESTIES_RANAP_IUSIGNALLINGCONNECTIONIDENTIFIER_PRESENT" redefined

Change-Id: I2ecae6789899952d1dc5691ab76907abeaa71c12
This commit is contained in:
Oliver Smith 2022-11-11 17:09:51 +01:00
parent 215620b252
commit 4a3521fa87
1 changed files with 24 additions and 1 deletions

View File

@ -79,6 +79,29 @@ def usage():
print("-p [pfx] Prefix all types with given prefix")
print("-h Print this help and return")
def getUniqueIENameForDefine(ies, ie):
""" Usually the type of the IE is used for defines. However a struct may
use the same type multiple times, in that case we use the actual name
of the field. """
unique = True
for ie_other in ies:
if ie_other == ie:
continue
if ie_other[2] == ie[2]:
unique = False
assert ie[0] != ie_other[0], "failed to find a unique name for" \
f" IE {ie}. Found another entry in ies {ie_other}" \
" that has the same ie[0] value."
if unique:
ret = ie[2]
else:
ret = ie[0]
ret = re.sub('-', '_', ret.upper())
return ret
try:
opts, args = getopt.getopt(sys.argv[1:], "df:ho:p:", ["debug", "file", "help", "outdir", "prefix"])
except getopt.GetoptError as err:
@ -167,7 +190,7 @@ for key in iesDefs:
# Presence mask
for ie in iesDefs[key]["ies"]:
ieupperunderscore = re.sub('-', '_', ie[2].upper())
ieupperunderscore = getUniqueIENameForDefine(iesDefs[key]["ies"], ie)
if ie[3] == "optional" or ie[3] == "conditional":
f.write("#define {0:<{pad}} {1}\n".format("%s_%s%s_PRESENT" % (keyupperunderscore, prefix, ieupperunderscore), "(1 << %d)" % shift,
pad=iesDefs[key]["length"] + len(keyupperunderscore) + 9))