Commit 0fb0b055 authored by Robert Schmidt's avatar Robert Schmidt

NGAP: Correct encoding of AMF Set ID and Pointer

Taking the example of the AMF Set ID, the previous version of the macro
used another macro to encode the number, then marked the last 6 bits in
the bit string (of length 16/2 bytes) as unused. This is wrong, because,
assuming AMF Set ID=3, it basically truncates the number by encoding all
16 bits and cutting off the last 6, like this:

  ------------------- encode 16 bits
  0000 0000 0000 0011
  ------------        take these 10 bits

So what remains is these bit positions of the number:
(16,15,14,13,12,11,10,9,8,7) -- the last 6 bits are cut (and the first 6
are either 0 or garbage, because they don't exist).

Instead, manually encode bits (10,9,8,7,6,5,4,3) in the first byte, and
(2,1) in the second byte of the bit string, like so:

  ------------        encode 10 bits
  0000 0000 1100 0000
  ------------        take these 10 bits

Do the same with the pointer.

The AMF Region ID above is correct, as it is exactly 8 bits.
parent 8d225a7e
......@@ -190,18 +190,22 @@ do { \
(aSN)->bits_unused = 0; \
} while(0)
#define AMF_SETID_TO_BIT_STRING(x, aSN) \
do { \
INT16_TO_OCTET_STRING(x, aSN); \
(aSN)->bits_unused = 6; \
} while(0)
#define AMF_POINTER_TO_BIT_STRING(x, aSN) \
do { \
INT8_TO_OCTET_STRING(x, aSN); \
(aSN)->bits_unused = 2; \
} while(0)
#define AMF_SETID_TO_BIT_STRING(x, aSN) \
do { \
(aSN)->buf = calloc(2, sizeof(uint8_t)); \
(aSN)->buf[0] = ((x) >> 2) & 0xff; \
(aSN)->buf[1] = ((x) & 0x03) << 6; \
(aSN)->size = 2; \
(aSN)->bits_unused = 6; \
} while (0)
#define AMF_POINTER_TO_BIT_STRING(x, aSN) \
do { \
(aSN)->buf = calloc(1, sizeof(uint8_t)); \
(aSN)->buf[0] = ((x) & 0x3f) << 2; \
(aSN)->size = 1; \
(aSN)->bits_unused = 2; \
} while (0)
#define ENCRALG_TO_BIT_STRING(encralg, bitstring) \
do { \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment