1. 02 Feb, 2024 2 commits
  2. 24 Jan, 2024 1 commit
  3. 23 Jan, 2024 2 commits
  4. 22 Jan, 2024 1 commit
  5. 17 Jan, 2024 3 commits
  6. 16 Jan, 2024 1 commit
  7. 15 Jan, 2024 1 commit
  8. 14 Jan, 2024 1 commit
  9. 13 Jan, 2024 1 commit
  10. 12 Jan, 2024 1 commit
  11. 09 Jan, 2024 1 commit
  12. 08 Jan, 2024 1 commit
  13. 07 Jan, 2024 2 commits
  14. 04 Jan, 2024 2 commits
  15. 26 Dec, 2023 7 commits
  16. 25 Dec, 2023 1 commit
  17. 22 Dec, 2023 1 commit
  18. 20 Dec, 2023 4 commits
  19. 19 Dec, 2023 1 commit
    • Cedric Roux's avatar
      APER: fix non negative normally small whole numbers · ee6458b2
      Cedric Roux authored
      aper_put_nsnnwn() and aper_get_nsnnwn() were wrong. All the places
      where they were used are modified, if needed.
      
      The functions aper_get_constrained_whole_number() and
      aper_put_constrained_whole_number() are introduced.
      They don't cover all cases, very big numbers are not supported.
      
      The sample ASN.1 file and C program at the end show some issues.
      
      For sequence-of, APER decoding fails and the XER output after
      APER encode/decode is:
      
      -----------
      xer after encode/decode:
      <ListOfInt>
          <INTEGER>1</INTEGER>
          <INTEGER>259</INTEGER>
      </ListOfInt>
      -----------
      
      instead of:
      
      -----------
      xer after encode/decode:
      <ListOfInt>
          <INTEGER>1</INTEGER>
          <INTEGER>2</INTEGER>
          <INTEGER>3</INTEGER>
      </ListOfInt>
      -----------
      
      For the enum test, we have:
      
      -----------
      aper ue lost[1]: d4
      -----------
      
      instead of:
      
      -----------
      aper ue lost[1]: 95
      -----------
      
      And APER decoding fails.
      
      For the choice test, we see:
      
      -----------
      aper snssai[3]: 80 01 00
      -----------
      
      instead of:
      
      -----------
      aper snssai[3]: 84 01 00
      -----------
      
      And XER after encode/decode is wrong.
      
      To generate C code from the ASN.1 file, asn1c is run as:
      asn1c -pdu=all -fno-include-deps -fcompound-names -gen-UPER -no-gen-BER -no-gen-JER -no-gen-OER -gen-APER -no-gen-example
      
      ASN.1 file:
      
      -----------
      Test DEFINITIONS AUTOMATIC TAGS ::=
      
      BEGIN
      
      TestCond-Type ::= CHOICE{
              gBR                                     ENUMERATED {true, ...},
              aMBR                            ENUMERATED {true, ...},
              isStat                          ENUMERATED {true, ...},
              isCatM                          ENUMERATED {true, ...},
              rSRP                            ENUMERATED {true, ...},
              rSRQ                            ENUMERATED {true, ...},
              ...,
              ul-rSRP                         ENUMERATED {true, ...},
              cQI                                     ENUMERATED {true, ...},
              fiveQI                          ENUMERATED {true, ...},
              qCI                                     ENUMERATED {true, ...},
              sNSSAI                          ENUMERATED {true, ...}
      }
      
      CauseRadioNetwork ::= ENUMERATED {
              handover-desirable-for-radio-reasons,
              time-critical-handover,
              resource-optimisation-handover,
              reduce-load-in-serving-cell,
              partial-handover,
              unknown-new-eNB-UE-X2AP-ID,
              unknown-old-eNB-UE-X2AP-ID,
              unknown-pair-of-UE-X2AP-ID,
              ho-target-not-allowed,
              tx2relocoverall-expiry,
              trelocprep-expiry,
              cell-not-available,
              no-radio-resources-available-in-target-cell,
              invalid-MME-GroupID,
              unknown-MME-Code,
              encryption-and-or-integrity-protection-algorithms-not-supported,
              reportCharacteristicsEmpty,
              noReportPeriodicity,
              existingMeasurementID,
              unknown-eNB-Measurement-ID,
              measurement-temporarily-not-available,
              unspecified,
              ...,
              load-balancing,
              handover-optimisation,
              value-out-of-allowed-range,
              multiple-E-RAB-ID-instances,
              switch-off-ongoing,
              not-supported-QCI-value,
              measurement-not-supported-for-the-object,
              tDCoverall-expiry,
              tDCprep-expiry,
              action-desirable-for-radio-reasons,
              reduce-load,
              resource-optimisation,
              time-critical-action,
              target-not-allowed,
              no-radio-resources-available,
              invalid-QoS-combination,
              encryption-algorithms-not-supported,
              procedure-cancelled,
              rRM-purpose,
              improve-user-bit-rate,
              user-inactivity,
              radio-connection-with-UE-lost,
              failure-in-the-radio-interface-procedure,
              bearer-option-not-supported,
              mCG-Mobility,
              sCG-Mobility,
              count-reaches-max-value,
              unknown-old-en-gNB-UE-X2AP-ID,
              pDCP-Overload
      }
      
      ListOfInt ::= SEQUENCE (SIZE (3)) OF INTEGER
      
      END
      -----------
      
      C program:
      
      -----------
      
      void test(void *v, int is_aper, char *name, void *t)
      {
        unsigned char b[128];
        asn_enc_rval_t r = asn_encode_to_buffer(NULL,
                             is_aper ? ATS_ALIGNED_BASIC_PER
                                     : ATS_UNALIGNED_BASIC_PER,
                             t, v, b, sizeof(b));
        if (r.encoded <= 0) printf("error\n"); else printf("ok\n");
        printf("%s %s[%ld]:", is_aper ? "aper" : "uper", name, r.encoded);
        for (int i = 0; i < r.encoded; i++) printf(" %2.2x", b[i]);
        printf("\n");
      
        void *ret = NULL;
        asn_dec_rval_t d = asn_decode(NULL,
                             is_aper ? ATS_ALIGNED_BASIC_PER
                                     : ATS_UNALIGNED_BASIC_PER,
                             t, &ret, b, r.encoded);
        if (d.consumed != r.encoded) printf("error\n"); else printf("ok\n");
        printf("xer of input:\n");
        xer_fprint(stdout, t, v);
        printf("xer after encode/decode:\n");
        xer_fprint(stdout, t, ret);
      }
      
      int main(void)
      {
        /* test sequence of */
        ListOfInt_t l = { 0 };
        long val[3] = { 1, 2, 3 };
        asn_sequence_add(&l.list, &val[0]);
        asn_sequence_add(&l.list, &val[1]);
        asn_sequence_add(&l.list, &val[2]);
        test(&l, 1, "sequence-of (size 3)", &asn_DEF_ListOfInt);
        test(&l, 0, "sequence-of (size 3)", &asn_DEF_ListOfInt);
      
        /* test enum */
        CauseRadioNetwork_t v;
        v = CauseRadioNetwork_radio_connection_with_UE_lost;
      
        test(&v, 1, "ue lost", &asn_DEF_CauseRadioNetwork);
        test(&v, 0, "ue lost", &asn_DEF_CauseRadioNetwork);
      
        v = CauseRadioNetwork_cell_not_available;
      
        test(&v, 1, "no cell", &asn_DEF_CauseRadioNetwork);
        test(&v, 0, "no cell", &asn_DEF_CauseRadioNetwork);
      
        /* test choice */
        TestCond_Type_t w;
        w.present = TestCond_Type_PR_sNSSAI;
        w.choice.sNSSAI = TestCond_Type__sNSSAI_true;
      
        test(&w, 1, "snssai", &asn_DEF_TestCond_Type);
        test(&w, 0, "snssai", &asn_DEF_TestCond_Type);
      
        w.present = TestCond_Type_PR_gBR;
        w.choice.sNSSAI = TestCond_Type__gBR_true;
      
        test(&w, 1, "gbr", &asn_DEF_TestCond_Type);
        test(&w, 0, "gbr", &asn_DEF_TestCond_Type);
      
        return 0;
      }
      -----------
      ee6458b2
  20. 16 Dec, 2023 6 commits