Commit 4f81e7c3 authored by Luke Mewburn's avatar Luke Mewburn
Browse files

asn_process: implement compat_commits checks

Use compat_asn1 to check per-spec tag backwards compatibility.

Add new per-asn_file key to asn_config.json:
  compat_commits  Either:
    - "COMMIT1..COMMIT2" to check changes between COMMIT1 and COMMIT2
       (as per git diff COMMIT1..COMMIT2)
    - "COMMIT" to check changes between COMMIT and origin/main.

Add asn_config.json entries for each tag against its previous tag.

Improve error handling if CompatCheck methods throw an exception
(e.g., an ASN.1 parse error), as some tags had syntax errors and this
makes it easier to highlight in test_config.json.
parent baaf3d7a
Loading
Loading
Loading
Loading
+83 −7
Original line number Diff line number Diff line
@@ -177,13 +177,16 @@ def compatCheckFiles(asnFiles):
                targetDeps = getDependencies(asnFiles, target)
                for compatName, compatExceptions in compatFiles.items():
                    compatDeps = getDependencies(asnFiles, compatName)
                    compatErrors = compatCheck.compare_files(
                    try:
                        compareErrors = compatCheck.compare_files(
                            a_files=compatDeps, b_files=targetDeps
                        )
                    except Exception as ex:
                        compareErrors = [f"Compare exception: {ex}"]
                    errors.extend(
                        [
                            {"message": error}
                            for error in compatErrors
                            for error in compareErrors
                            if error not in compatExceptions
                        ]
                    )
@@ -191,9 +194,77 @@ def compatCheckFiles(asnFiles):
                        [
                            {"message": f"Missing error: {error}"}
                            for error in compatExceptions
                            if error not in compatErrors
                            if error not in compareErrors
                        ]
                    )
            results[str(target)] = {
                "ok": len(errors) == 0,
                "message": errors,
            }
        except Exception as ex:
            results[str(target)] = {"ok": False, "code": -1, "message": f"{ex!r}"}
            continue
    return results


def compatCheckCommits(asnFiles):
    """
    Attempts to check backwards compatibility using the pycrate ASN.1 tools.

    :param asnFiles: dict; key is filename, value is dict with optional keys:
      dependencies: list of dependencies.
      compat_commits: dict of commits to check, value is list of expected errors.
    :returns: A dict of outcome against the first filename of each compile target. Return code and message are included for failures.

    For each file in asnFiles:
      For each compat in file['compat_commits']
         check file against revisions in compat, and the errors should match the value.

    """
    results = {}
    compatCheck = compat_asn1.CompatCheck()
    for target, config in asnFiles.items():
        logging.info(f"Compatibility commit checking {target}")
        try:
            errors = []
            compatCommits = config.get("compat_commits", {})
            if len(compatCommits) > 0:
                logging.info(
                    f"Check {target} against commits {' '.join(compatCommits.keys())}"
                )
                targetDeps = asnFiles.get(target, {}).get("dependencies", [])
                for compatCommits, compatExceptions in compatCommits.items():
                    commitIds = compatCommits.split("..", maxsplit=1)
                    if len(commitIds) == 1:
                        commitIds.append("origin/main")
                    try:
                        compareErrors = compatCheck.compare_commits(
                            commit1=commitIds[0],
                            commit2=commitIds[1],
                            asn_file=target,
                            dependencies=targetDeps,
                        )
                    except Exception as ex:
                        compareErrors = [f"Compare exception: {ex}"]
                    commitErrors = []
                    commitErrors.extend(
                        [
                            {"message": error}
                            for error in compareErrors
                            if error not in compatExceptions
                        ]
                    )
                    commitErrors.extend(
                        [
                            {"message": f"Missing error: {error}"}
                            for error in compatExceptions
                            if error not in compareErrors
                        ]
                    )
                    if commitErrors:
                        # Add error line before group describing commit range
                        errors.append({"message": f"Commit {compatCommits}:"})
                        errors.extend(commitErrors)
            results[str(target)] = {
                "ok": len(errors) == 0,
                "message": errors,
@@ -295,9 +366,14 @@ def main():
    if processResults(lintResults, "Linting") > 0:
        retval = 1

    logging.info("Checking ASN.1 backwards compatibility")
    logging.info("Checking ASN.1 backwards compatibility between files")
    compatResults = compatCheckFiles(asnFiles)
    if processResults(compatResults, "Compatibility checking") > 0:
    if processResults(compatResults, "Compatibility checking files") > 0:
        retval = 1

    logging.info("Checking ASN.1 backwards compatibility between commits")
    commitResults = compatCheckCommits(asnFiles)
    if processResults(commitResults, "Compatibility checking commits") > 0:
        retval = 1

    return retval
+277 −1
Original line number Diff line number Diff line
{
  "asn_files": {
    "33128/r15/TS33128Payloads.asn": {
      "compat_commits": {
        "spec/33128/15.0.0..spec/33128/15.1.0": [
          "Compare exception: RANCGI.eCGI: ASN1RefType to Ecgi, undefined"
        ],
        "spec/33128/15.1.0..spec/33128/15.2.0": [
          "Compare exception: RANCGI.eCGI: ASN1RefType to Ecgi, undefined"
        ],
        "spec/33128/15.2.0..spec/33128/15.3.0": [
          "Compare exception: RANCGI.eCGI: ASN1RefType to Ecgi, undefined"
        ],
        "spec/33128/15.3.0..spec/33128/15.4.0": [
          "TS33128Payloads.AMFSetID constraint 'INTEGER (0..63)' changed to 'INTEGER (0..1023)'",
          "TS33128Payloads.AMFPointer constraint 'INTEGER (0..1023)' changed to 'INTEGER (0..63)'"
        ],
        "spec/33128/15.4.0..spec/33128/15.5.0": [],
        "spec/33128/15.5.0..spec/33128/15.8.0": [],
        "spec/33128/15.8.0..spec/33128/15.9.0": [],
        "spec/33128/15.9.0..spec/33128/15.10.0": [
          "TS33128Payloads.InnerRadius constraint 'INTEGER (0..65535)' changed to 'INTEGER (0..327675)'"
        ],
        "spec/33128/15.10.0..spec/33128/15.11.0": [],
        "spec/33128/15.11.0..spec/33128/15.12.0": [],
        "spec/33128/15.12.0..spec/33128/15.13.0": [],
        "spec/33128/15.13.0": []
      },
      "lint_exceptions": [
        "Tag 16 IRIEvent field 'mDFCellSiteReport' is not present in XIRIEvent",
        "Tag 5 XIRIEvent field 'unsuccessfulAMProcedure' differs from IRIEvent field 'unsuccessfulRegistrationProcedure'",
@@ -9,8 +34,77 @@
        "Field 'aNNodeID' in GlobalRANNodeID is an anonymous CHOICE"
      ]
    },
    "33128/r16/TS33128IdentityAssociation.asn": {},
    "33128/r16/TS33128IdentityAssociation.asn": {
      "compat_commits": {
        "spec/33128/16.5.0..spec/33128/16.6.0": [
          "TS33128IdentityAssociation.FiveGGUTI constraint 'OCTET STRING (SIZE (14))' changed to 'OCTET STRING (SIZE (10))'"
        ],
        "spec/33128/16.6.0..spec/33128/16.7.0": [],
        "spec/33128/16.7.0..spec/33128/16.8.0": [],
        "spec/33128/16.8.0..spec/33128/16.9.0": [],
        "spec/33128/16.9.0..spec/33128/16.10.0": [],
        "spec/33128/16.10.0..spec/33128/16.11.0": [],
        "spec/33128/16.11.0..spec/33128/16.12.0": [],
        "spec/33128/16.12.0..spec/33128/16.13.0": [],
        "spec/33128/16.13.0..spec/33128/16.14.0": [],
        "spec/33128/16.14.0..spec/33128/16.15.0": [],
        "spec/33128/16.15.0..spec/33128/16.16.0": [],
        "spec/33128/16.16.0..spec/33128/16.17.0": [],
        "spec/33128/16.17.0..spec/33128/16.18.0": [],
        "spec/33128/16.18.0..spec/33128/16.20.0": [],
        "spec/33128/16.20.0..spec/33128/16.22.0": [],
        "spec/33128/16.22.0": []
      }
    },
    "33128/r16/TS33128Payloads.asn": {
      "compat_commits": {
        "spec/33128/16.0.0..spec/33128/16.1.0": [
          "Compare exception: RANCGI.eCGI: ASN1RefType to Ecgi, undefined"
        ],
        "spec/33128/16.1.0..spec/33128/16.2.0": [
          "TS33128Payloads.AMFSetID constraint 'INTEGER (0..63)' changed to 'INTEGER (0..1023)'",
          "TS33128Payloads.AMFPointer constraint 'INTEGER (0..1023)' changed to 'INTEGER (0..63)'"
        ],
        "spec/33128/16.2.0..spec/33128/16.3.0": [
          "TS33128Payloads.XIRIPayload.relativeOID[1] renamed to 'xIRIPayloadOID[1]'",
          "TS33128Payloads.GlobalRANNodeID.aNNodeID[2] type 'CHOICE' changed to 'TS33128Payloads.ANNodeID'",
          "TS33128Payloads.IRIPayload.relativeOID[1] renamed to 'iRIPayloadOID[1]'",
          "TS33128Payloads.CCPayload.relativeOID[1] renamed to 'cCPayloadOID[1]'",
          "TS33128Payloads.LINotificationPayload.relativeOID[1] renamed to 'lINotificationPayloadOID[1]'"
        ],
        "spec/33128/16.3.0..spec/33128/16.4.0": [
          "Compare exception: IRIEvent: remaining textual definition, }"
        ],
        "spec/33128/16.4.0..spec/33128/16.5.0": [
          "Compare exception: IRIEvent: remaining textual definition, }"
        ],
        "spec/33128/16.5.0..spec/33128/16.6.0": [],
        "spec/33128/16.6.0..spec/33128/16.7.0": [
          "TS33128Payloads.LALSReport missing field 'pEI[2]'"
        ],
        "spec/33128/16.7.0..spec/33128/16.8.0": [],
        "spec/33128/16.8.0..spec/33128/16.9.0": [],
        "spec/33128/16.9.0..spec/33128/16.10.0": [],
        "spec/33128/16.10.0..spec/33128/16.11.0": [
          "TS33128Payloads.InnerRadius constraint 'INTEGER (0..65535)' changed to 'INTEGER (0..327675)'",
          "TS33128Payloads.BarometricPressure constraint 'INTEGER (30000..155000)' changed to 'INTEGER (30000..115000)'"
        ],
        "spec/33128/16.11.0..spec/33128/16.12.0": [],
        "spec/33128/16.12.0..spec/33128/16.13.0": [],
        "spec/33128/16.13.0..spec/33128/16.14.0": [],
        "spec/33128/16.14.0..spec/33128/16.15.0": [],
        "spec/33128/16.15.0..spec/33128/16.16.0": [],
        "spec/33128/16.16.0..spec/33128/16.17.0": [],
        "spec/33128/16.17.0..spec/33128/16.18.0": [],
        "spec/33128/16.18.0..spec/33128/16.20.0": [
          "TS33128Payloads.XIRIEvent missing field 'mMSConvertedFromEmail[65]'",
          "TS33128Payloads.XIRIEvent missing field 'mMSConvertedToEmail[66]'",
          "TS33128Payloads.IRIEvent missing field 'mMSConvertedFromEmail[65]'",
          "TS33128Payloads.IRIEvent missing field 'mMSConvertedToEmail[66]'"
        ],
        "spec/33128/16.20.0..spec/33128/16.22.0": [],
        "spec/33128/16.22.0": []
      },
      "compat_files": {
        "33128/r15/TS33128Payloads.asn": [
          "TS33128Payloads.XIRIPayload.relativeOID[1] renamed to 'xIRIPayloadOID[1]'",
@@ -41,11 +135,91 @@
      ]
    },
    "33128/r17/TS33128IdentityAssociation.asn": {
      "compat_commits": {
        "spec/33128/17.0.0..spec/33128/17.1.0": [],
        "spec/33128/17.1.0..spec/33128/17.2.0": [],
        "spec/33128/17.2.0..spec/33128/17.3.0": [],
        "spec/33128/17.3.0..spec/33128/17.4.0": [],
        "spec/33128/17.4.0..spec/33128/17.5.0": [],
        "spec/33128/17.5.0..spec/33128/17.6.0": [],
        "spec/33128/17.6.0..spec/33128/17.7.0": [],
        "spec/33128/17.7.0..spec/33128/17.8.0": [],
        "spec/33128/17.8.0..spec/33128/17.9.0": [],
        "spec/33128/17.9.0..spec/33128/17.10.0": [],
        "spec/33128/17.10.0..spec/33128/17.11.0": [],
        "spec/33128/17.11.0..spec/33128/17.12.0": [],
        "spec/33128/17.12.0..spec/33128/17.13.0": [],
        "spec/33128/17.13.0..spec/33128/17.15.0": [],
        "spec/33128/17.15.0..spec/33128/17.16.0": [],
        "spec/33128/17.16.0..spec/33128/17.17.0": [],
        "spec/33128/17.17.0..spec/33128/17.18.0": [],
        "spec/33128/17.18.0..spec/33128/17.20.0": [],
        "spec/33128/17.20.0": []
      },
      "compat_files": {
        "33128/r16/TS33128IdentityAssociation.asn": []
      }
    },
    "33128/r17/TS33128Payloads.asn": {
      "compat_commits": {
        "spec/33128/17.0.0..spec/33128/17.1.0": [
          "TS33128Payloads.EUTRALocation.ageOfLocatonInfo[3] renamed to 'ageOfLocationInfo[3]'",
          "TS33128Payloads.NRLocation.ageOfLocatonInfo[3] renamed to 'ageOfLocationInfo[3]'",
          "TS33128Payloads.HorizontalWithVerticalVelocityAndUncertainty.hspeed[1] renamed to 'hSpeed[1]'",
          "TS33128Payloads.LALSReport missing field 'pEI[2]'"
        ],
        "spec/33128/17.1.0..spec/33128/17.2.0": [
          "TS33128Payloads.XIRIEvent.aMFIdentifierAssocation[62] renamed to 'aMFIdentifierAssociation[62]'",
          "TS33128Payloads.XIRIEvent.aMFIdentifierAssocation[62] type 'TS33128Payloads.AMFIdentifierAssocation' changed to 'TS33128Payloads.AMFIdentifierAssociation'",
          "TS33128Payloads.XIRIEvent.mMEIdentifierAssocation[63] renamed to 'mMEIdentifierAssociation[63]'",
          "TS33128Payloads.XIRIEvent.mMEIdentifierAssocation[63] type 'TS33128Payloads.MMEIdentifierAssocation' changed to 'TS33128Payloads.MMEIdentifierAssociation'",
          "TS33128Payloads.IRIEvent.aMFIdentifierAssocation[62] renamed to 'aMFIdentifierAssociation[62]'",
          "TS33128Payloads.IRIEvent.aMFIdentifierAssocation[62] type 'TS33128Payloads.AMFIdentifierAssocation' changed to 'TS33128Payloads.AMFIdentifierAssociation'",
          "TS33128Payloads.IRIEvent.mMEIdentifierAssocation[63] renamed to 'mMEIdentifierAssociation[63]'",
          "TS33128Payloads.IRIEvent.mMEIdentifierAssocation[63] type 'TS33128Payloads.MMEIdentifierAssocation' changed to 'TS33128Payloads.MMEIdentifierAssociation'",
          "Type AMFIdentifierAssocation not present",
          "Type MMEIdentifierAssocation not present"
        ],
        "spec/33128/17.2.0..spec/33128/17.3.0": [],
        "spec/33128/17.3.0..spec/33128/17.4.0": [],
        "spec/33128/17.4.0..spec/33128/17.5.0": [
          "TS33128Payloads.InnerRadius constraint 'INTEGER (0..65535)' changed to 'INTEGER (0..327675)'",
          "TS33128Payloads.BarometricPressure constraint 'INTEGER (30000..155000)' changed to 'INTEGER (30000..115000)'"
        ],
        "spec/33128/17.5.0..spec/33128/17.6.0": [
          "TS33128Payloads.PDSummaryReport new field 'perSessionTrigger[14]' is not OPTIONAL"
        ],
        "spec/33128/17.6.0..spec/33128/17.7.0": [],
        "spec/33128/17.7.0..spec/33128/17.8.0": [
          "TS33128Payloads.Location.ePSLocationInfo[4] renamed to 'fourGPositioningInfo[4]'",
          "TS33128Payloads.Location.ePSLocationInfo[4] type 'TS33128Payloads.EPSLocationInfo' changed to 'TS33128Payloads.FourGPositioningInfo'",
          "Type EPSLocationInfo not present"
        ],
        "spec/33128/17.8.0..spec/33128/17.9.0": [
          "TS33128Payloads.TLS12UAStarParams.preMasterSecret[1] constraint 'OCTET STRING (SIZE (6))' changed to 'OCTET STRING (SIZE (48))'",
          "TS33128Payloads.TLS12UAStarParams.masterSecret[2] constraint 'OCTET STRING (SIZE (6))' changed to 'OCTET STRING (SIZE (48))'",
          "TS33128Payloads.TLS12UAStarParams.clientRandom[13] constraint 'OCTET STRING (SIZE (4))' changed to 'OCTET STRING (SIZE (32))'",
          "TS33128Payloads.TLS12UAStarParams.serverRandom[14] constraint 'OCTET STRING (SIZE (4))' changed to 'OCTET STRING (SIZE (32))'",
          "TS33128Payloads.TLS12UAStarParams.tLSExtensions[18] renamed to 'tLSServerExtensions[18]'"
        ],
        "spec/33128/17.9.0..spec/33128/17.10.0": [
          "TS33128Payloads.EPSPDNConnectionModification.bearerConcextsModified[18] renamed to 'bearerContextsModified[18]'"
        ],
        "spec/33128/17.10.0..spec/33128/17.11.0": [],
        "spec/33128/17.11.0..spec/33128/17.12.0": [],
        "spec/33128/17.12.0..spec/33128/17.13.0": [],
        "spec/33128/17.13.0..spec/33128/17.15.0": [],
        "spec/33128/17.15.0..spec/33128/17.16.0": [],
        "spec/33128/17.16.0..spec/33128/17.17.0": [
          "TS33128Payloads.XIRIEvent missing field 'mMSConvertedFromEmail[133]'",
          "TS33128Payloads.XIRIEvent missing field 'mMSConvertedToEmail[134]'",
          "TS33128Payloads.IRIEvent missing field 'mMSConvertedFromEmail[133]'",
          "TS33128Payloads.IRIEvent missing field 'mMSConvertedToEmail[134]'"
        ],
        "spec/33128/17.17.0..spec/33128/17.18.0": [],
        "spec/33128/17.18.0..spec/33128/17.20.0": [],
        "spec/33128/17.20.0": []
      },
      "compat_files": {
        "33128/r16/TS33128Payloads.asn": [
          "TS33128Payloads.EUTRALocation.ageOfLocatonInfo[3] renamed to 'ageOfLocationInfo[3]'",
@@ -97,11 +271,89 @@
      ]
    },
    "33128/r18/TS33128IdentityAssociation.asn": {
      "compat_commits": {
        "spec/33128/18.0.0..spec/33128/18.1.0": [],
        "spec/33128/18.1.0..spec/33128/18.2.0": [],
        "spec/33128/18.2.0..spec/33128/18.3.0": [],
        "spec/33128/18.3.0..spec/33128/18.4.0": [],
        "spec/33128/18.4.0..spec/33128/18.5.0": [],
        "spec/33128/18.5.0..spec/33128/18.6.0": [],
        "spec/33128/18.6.0..spec/33128/18.7.0": [],
        "spec/33128/18.7.0..spec/33128/18.8.0": [],
        "spec/33128/18.8.0..spec/33128/18.9.1": [],
        "spec/33128/18.9.1..spec/33128/18.10.0": [],
        "spec/33128/18.10.0..spec/33128/18.11.0": [],
        "spec/33128/18.11.0..spec/33128/18.12.0": [],
        "spec/33128/18.12.0..spec/33128/18.13.1": [],
        "spec/33128/18.13.1..spec/33128/18.15.0": [],
        "spec/33128/18.15.0": []
      },
      "compat_files": {
        "33128/r17/TS33128IdentityAssociation.asn": []
      }
    },
    "33128/r18/TS33128Payloads.asn": {
      "compat_commits": {
        "spec/33128/18.0.0..spec/33128/18.1.0": [
          "TS33128Payloads.PDSummaryReport new field 'useSessionTrigger[14]' is not OPTIONAL"
        ],
        "spec/33128/18.1.0..spec/33128/18.2.0": [
          "TS33128Payloads.IRIEvent.unsuccessfulRegistrationProcedure[5] renamed to 'unsuccessfulAMProcedure[5]'",
          "TS33128Payloads.IRIEvent.unsuccessfulSessionProcedure[10] renamed to 'unsuccessfulSMProcedure[10]'",
          "TS33128Payloads.IRIEvent.uDMLocationInformationResultRecord[108] renamed to 'uDMLocationInformationResult[108]'"
        ],
        "spec/33128/18.2.0..spec/33128/18.3.0": [
          "TS33128Payloads.EUTRALocation.ageOfLocationInfo[3] type 'INTEGER' changed to 'TS33128Payloads.AgeOfLocation'",
          "TS33128Payloads.EUTRALocation.ageOfLocationInfo[3] constraint 'INTEGER' changed to 'INTEGER (0..32767)'",
          "TS33128Payloads.NRLocation.ageOfLocationInfo[3] type 'INTEGER' changed to 'TS33128Payloads.AgeOfLocation'",
          "TS33128Payloads.NRLocation.ageOfLocationInfo[3] constraint 'INTEGER' changed to 'INTEGER (0..32767)'",
          "TS33128Payloads.N3GALocation.ageOfLocationInfo[11] type 'INTEGER' changed to 'TS33128Payloads.AgeOfLocation'",
          "TS33128Payloads.N3GALocation.ageOfLocationInfo[11] constraint 'INTEGER' changed to 'INTEGER (0..32767)'",
          "TS33128Payloads.LocationData.ageOfLocationEstimate[3] type 'TS33128Payloads.AgeOfLocationEstimate' changed to 'TS33128Payloads.AgeOfLocation'",
          "TS33128Payloads.Location.ePSLocationInfo[4] renamed to 'fourGPositioningInfo[4]'",
          "TS33128Payloads.Location.ePSLocationInfo[4] type 'TS33128Payloads.EPSLocationInfo' changed to 'TS33128Payloads.FourGPositioningInfo'",
          "Type EPSLocationInfo not present",
          "Type AgeOfLocationEstimate not present"
        ],
        "spec/33128/18.3.0..spec/33128/18.4.0": [
          "TS33128Payloads.TLS12UAStarParams.preMasterSecret[1] constraint 'OCTET STRING (SIZE (6))' changed to 'OCTET STRING (SIZE (48))'",
          "TS33128Payloads.TLS12UAStarParams.masterSecret[2] constraint 'OCTET STRING (SIZE (6))' changed to 'OCTET STRING (SIZE (48))'",
          "TS33128Payloads.TLS12UAStarParams.clientRandom[13] constraint 'OCTET STRING (SIZE (4))' changed to 'OCTET STRING (SIZE (32))'",
          "TS33128Payloads.TLS12UAStarParams.serverRandom[14] constraint 'OCTET STRING (SIZE (4))' changed to 'OCTET STRING (SIZE (32))'",
          "TS33128Payloads.TLS12UAStarParams.tLSExtensions[18] renamed to 'tLSServerExtensions[18]'"
        ],
        "spec/33128/18.4.0..spec/33128/18.5.0": [
          "TS33128Payloads.EPSPDNConnectionModification.bearerConcextsModified[18] renamed to 'bearerContextsModified[18]'",
          "TS33128Payloads.XIRIEvent.rcsCapabilityDiscovery[142] renamed to 'rCSCapabilityDiscovery[142]'",
          "TS33128Payloads.IRIEvent.rcsCapabilityDiscovery[142] renamed to 'rCSCapabilityDiscovery[142]'"
        ],
        "spec/33128/18.5.0..spec/33128/18.6.0": [
          "TS33128Payloads.PointUncertaintyCircle.uncertainty[2] renamed to 'deprecatedUncertainty[2]'",
          "TS33128Payloads.UncertaintyEllipse.semiMajor[1] renamed to 'deprecatedSemiMajor[1]'",
          "TS33128Payloads.UncertaintyEllipse.semiMinor[2] renamed to 'deprecatedSemiMinor[2]'",
          "TS33128Payloads.PointAltitudeUncertainty.uncertaintyAltitude[4] renamed to 'deprecatedUncertaintyAltitude[4]'",
          "TS33128Payloads.EllipsoidArc.uncertaintyRadius[3] renamed to 'deprecatedUncertaintyRadius[3]'",
          "TS33128Payloads.AMFLocationUpdate.sMSOverNASIndicator[7] renamed to 'deprecatedSMSOverNASIndicator[7]'",
          "TS33128Payloads.AMFLocationUpdate.oldGUTI[8] renamed to 'deprecatedOldGUTI[8]'",
          "TS33128Payloads.AMFRANTraceReport.traceActivationInfo[6] renamed to 'deprecatedTraceActivationInfo[6]'",
          "TS33128Payloads.AMFUEServiceAccept.uERequestType[7] renamed to 'deprecatedUERequestType[7]'"
        ],
        "spec/33128/18.6.0..spec/33128/18.7.0": [
          "TS33128Payloads.RCSSIPSessionMessage new field 'mSRPPathInfo[4]' is not OPTIONAL",
          "TS33128Payloads.RCSSessionEndpoints.locatlOnly(2) renamed to 'localOnly(2)'"
        ],
        "spec/33128/18.7.0..spec/33128/18.8.0": [],
        "spec/33128/18.8.0..spec/33128/18.9.1": [],
        "spec/33128/18.9.1..spec/33128/18.10.0": [],
        "spec/33128/18.10.0..spec/33128/18.11.0": [],
        "spec/33128/18.11.0..spec/33128/18.12.0": [],
        "spec/33128/18.12.0..spec/33128/18.13.1": [],
        "spec/33128/18.13.1..spec/33128/18.15.0": [
          "TS33128Payloads.IMSSubscriberIDs.iMPI[1] renamed to 'deprecatedIMPI[1]'",
          "TS33128Payloads.IMSSubscriberIDs.iMPU[2] renamed to 'deprecatedIMPU[2]'"
        ],
        "spec/33128/18.15.0": []
      },
      "compat_files": {
        "33128/r17/TS33128Payloads.asn": [
          "TS33128Payloads.EUTRALocation.ageOfLocationInfo[3] type 'INTEGER' changed to 'TS33128Payloads.AgeOfLocation'",
@@ -174,11 +426,35 @@
      ]
    },
    "33128/r19/TS33128IdentityAssociation.asn": {
      "compat_commits": {
        "spec/33128/19.0.1..spec/33128/19.1.0": [],
        "spec/33128/19.1.0..spec/33128/19.2.0": [],
        "spec/33128/19.2.0..spec/33128/19.3.0": [],
        "spec/33128/19.3.0..spec/33128/19.4.0": [],
        "spec/33128/19.4.0..spec/33128/19.5.0": [],
        "spec/33128/19.5.0..spec/33128/19.6.0": [],
        "spec/33128/19.6.0..spec/33128/19.7.0": [],
        "spec/33128/19.7.0": []
      },
      "compat_files": {
        "33128/r18/TS33128IdentityAssociation.asn": []
      }
    },
    "33128/r19/TS33128Payloads.asn": {
      "compat_commits": {
        "spec/33128/19.0.1..spec/33128/19.1.0": [
          "TS33128Payloads.AMFRegistration.nGInformation[20] renamed to 'deprecatedNGInformation[20]'",
          "TS33128Payloads.MMEAttach.s1Information[15] renamed to 'deprecatedS1Information[15]'",
          "TS33128Payloads.MMEStartOfInterceptionWithEPSAttachedUE.s1Information[16] renamed to 'deprecatedS1Information[16]'"
        ],
        "spec/33128/19.1.0..spec/33128/19.2.0": [],
        "spec/33128/19.2.0..spec/33128/19.3.0": [],
        "spec/33128/19.3.0..spec/33128/19.4.0": [],
        "spec/33128/19.4.0..spec/33128/19.5.0": [],
        "spec/33128/19.5.0..spec/33128/19.6.0": [],
        "spec/33128/19.6.0..spec/33128/19.7.0": [],
        "spec/33128/19.7.0": []
      },
      "compat_files": {
        "33128/r18/TS33128Payloads.asn": [
          "TS33128Payloads.AMFRegistration.nGInformation[20] renamed to 'deprecatedNGInformation[20]'",