forked from osmocom/wireshark
From Vincent Helfre:
I change the void * descr field as an union to either store a pointer or a value. Hope it solves the problem. svn path=/trunk/; revision=36092
This commit is contained in:
parent
ee5202f2d8
commit
7f604b779d
|
@ -287,7 +287,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
{
|
||||
guint8 ui8 = tvb_get_bits8(tvb, bit_offset, no_of_bits);
|
||||
pui8 = pui8DATA(data, pDescr->offset);
|
||||
*pui8 = ui8 + (guint8)(guint32)pDescr->descr;
|
||||
*pui8 = ui8 + (guint8)pDescr->descr.value;
|
||||
|
||||
item = proto_tree_add_text(tree, tvb, bit_offset>>3, (no_of_bits>>3)+1, "%s %s",
|
||||
decode_bits_in_field(bit_offset, no_of_bits, ui8),
|
||||
|
@ -298,7 +298,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
{
|
||||
guint16 ui16 = tvb_get_bits16(tvb, bit_offset, no_of_bits, FALSE);
|
||||
pui16 = pui16DATA(data, pDescr->offset);
|
||||
*pui16 = ui16 + (guint16)(guint32)pDescr->descr;
|
||||
*pui16 = ui16 + (guint16)pDescr->descr.value;
|
||||
|
||||
item = proto_tree_add_text(tree, tvb, bit_offset>>3, (no_of_bits>>3)+1, "%s %s",
|
||||
decode_bits_in_field(bit_offset, no_of_bits, ui16),
|
||||
|
@ -308,7 +308,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
{
|
||||
guint32 ui32 = tvb_get_bits32(tvb, bit_offset, no_of_bits, FALSE);
|
||||
pui32 = pui32DATA(data, pDescr->offset);
|
||||
*pui32 = ui32 + (guint16)(guint32)pDescr->descr;
|
||||
*pui32 = ui32 + (guint16)pDescr->descr.value;
|
||||
|
||||
item = proto_tree_add_text(tree, tvb, bit_offset>>3, (no_of_bits>>3)+1, "%s %s",
|
||||
decode_bits_in_field(bit_offset, no_of_bits, ui32),
|
||||
|
@ -366,7 +366,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
case CSN_UINT_ARRAY:
|
||||
{
|
||||
guint8 no_of_bits = (guint8) pDescr->i;
|
||||
guint16 nCount = (guint16)(guint32)pDescr->descr; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */
|
||||
guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */
|
||||
int i =0;
|
||||
|
||||
if (pDescr->serialize != 0)
|
||||
|
@ -444,7 +444,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
test_tree = proto_item_add_subtree(ti, ett_csn1);
|
||||
|
||||
csnStreamInit(&arT, bit_offset, remaining_bits_len);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr, tvb, pui8, ett_csn1);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr.ptr, tvb, pui8, ett_csn1);
|
||||
if (Status >= 0)
|
||||
{
|
||||
pui8 += nSize;
|
||||
|
@ -494,7 +494,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
test_tree = proto_item_add_subtree(ti, ett_csn1);
|
||||
|
||||
csnStreamInit(&arT, bit_offset, remaining_bits_len);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr, tvb, pvDATA(data, pDescr->offset), ett_csn1);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr.ptr, tvb, pvDATA(data, pDescr->offset), ett_csn1);
|
||||
|
||||
if (Status >= 0)
|
||||
{
|
||||
|
@ -516,7 +516,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
{
|
||||
gint16 count = pDescr->i;
|
||||
guint8 i = 0;
|
||||
CSN_ChoiceElement_t* pChoice = pDescr->descr;
|
||||
CSN_ChoiceElement_t* pChoice = (CSN_ChoiceElement_t*) pDescr->descr.ptr;
|
||||
|
||||
while (count > 0)
|
||||
{
|
||||
|
@ -749,7 +749,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
{
|
||||
guint8 ui8 = tvb_get_bits8(tvb, bit_offset, no_of_bits);
|
||||
pui8 = pui8DATA(data, pDescr->offset);
|
||||
*pui8 = ui8 + (guint8)(guint32)pDescr->descr;
|
||||
*pui8 = ui8 + (guint8)pDescr->descr.value;
|
||||
item = proto_tree_add_text(tree, tvb, bit_offset>>3, (no_of_bits>>3)+1, "%s %s",
|
||||
decode_bits_in_field(bit_offset, no_of_bits, ui8),
|
||||
pDescr->sz);
|
||||
|
@ -758,7 +758,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
{
|
||||
guint16 ui16 = tvb_get_bits16(tvb, bit_offset, no_of_bits, FALSE);
|
||||
pui16 = pui16DATA(data, pDescr->offset);
|
||||
*pui16 = ui16 + (guint16)(guint32)pDescr->descr;
|
||||
*pui16 = ui16 + (guint16)pDescr->descr.value;
|
||||
item = proto_tree_add_text(tree, tvb, bit_offset>>3, (no_of_bits>>3)+1, "%s %s",
|
||||
decode_bits_in_field(bit_offset, no_of_bits, ui16),
|
||||
pDescr->sz);
|
||||
|
@ -767,7 +767,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
{
|
||||
guint32 ui32 = tvb_get_bits32(tvb, bit_offset, no_of_bits, FALSE);
|
||||
pui32 = pui32DATA(data, pDescr->offset);
|
||||
*pui32 = ui32 + (guint16)(guint32)pDescr->descr;
|
||||
*pui32 = ui32 + (guint16)pDescr->descr.value;
|
||||
item = proto_tree_add_text(tree, tvb, bit_offset>>3, (no_of_bits>>3)+1, "%s %s",
|
||||
decode_bits_in_field(bit_offset, no_of_bits, ui32),
|
||||
pDescr->sz);
|
||||
|
@ -820,7 +820,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
case CSN_UINT_ARRAY:
|
||||
{
|
||||
guint8 no_of_bits = (guint8) pDescr->i;
|
||||
guint16 nCount = (guint16)(guint32)pDescr->descr; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */
|
||||
guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */
|
||||
gint i = 0;
|
||||
|
||||
if (pDescr->serialize != 0)
|
||||
|
@ -912,7 +912,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
test_tree = proto_item_add_subtree(ti, ett_csn1);
|
||||
|
||||
csnStreamInit(&arT, bit_offset, remaining_bits_len);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr, tvb, pui8, ett_csn1);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr.ptr, tvb, pui8, ett_csn1);
|
||||
if (Status >= 0)
|
||||
{
|
||||
pui8 += nSize;
|
||||
|
@ -963,7 +963,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
test_tree = proto_item_add_subtree(ti, ett_csn1);
|
||||
|
||||
csnStreamInit(&arT, bit_offset, remaining_bits_len);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr, tvb, pvDATA(data, pDescr->offset), ett_csn1);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr.ptr, tvb, pvDATA(data, pDescr->offset), ett_csn1);
|
||||
if (Status >= 0)
|
||||
{
|
||||
proto_item_set_len(ti,((arT.bit_offset - bit_offset)>>3)+1);
|
||||
|
@ -1029,7 +1029,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
pui8 = pui8DATA(data, pDescr->offset);
|
||||
|
||||
/* this if-statement represents the M_NEXT_EXIST_OR_NULL description element */
|
||||
if ((pDescr->descr != 0) && (remaining_bits_len == 0))
|
||||
if ((pDescr->descr.ptr != NULL) && (remaining_bits_len == 0))
|
||||
{ /* no more bits to decode is fine here - end of message detected and allowed */
|
||||
|
||||
/* Skip i entries + this entry */
|
||||
|
@ -1077,7 +1077,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
pui8 = pui8DATA(data, pDescr->offset);
|
||||
|
||||
/* this if-statement represents the M_NEXT_EXIST_OR_NULL_LH description element */
|
||||
if ((pDescr->descr != 0) && (remaining_bits_len == 0))
|
||||
if ((pDescr->descr.ptr != NULL) && (remaining_bits_len == 0))
|
||||
{ /* no more bits to decode is fine here - end of message detected and allowed */
|
||||
|
||||
/* skip 'i' entries + this entry */
|
||||
|
@ -1088,7 +1088,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
{ /* substract one more bit from remaining_bits_len to make the "not enough bits" error to be triggered */
|
||||
remaining_bits_len--;
|
||||
}
|
||||
|
||||
|
||||
/* set the data member to "not exist" */
|
||||
*pui8 = 0;
|
||||
break;
|
||||
|
@ -1118,7 +1118,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
case CSN_VARIABLE_BITMAP_1:
|
||||
{ /* Bitmap from here and to the end of message */
|
||||
|
||||
*pui8DATA(data, (gint16)(gint32)pDescr->descr) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */
|
||||
*pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */
|
||||
|
||||
/*no break -
|
||||
* with a length set we have a regular variable length bitmap so we continue */
|
||||
|
@ -1130,7 +1130,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
* Bit array with length (in bits) specified in parameter (pDescr->descr)
|
||||
* The result is right aligned!
|
||||
*/
|
||||
gint16 no_of_bits = *pui8DATA(data, (gint16)(gint32)pDescr->descr);
|
||||
gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);
|
||||
|
||||
no_of_bits += pDescr->i; /* adjusted by offset */
|
||||
|
||||
|
@ -1171,7 +1171,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
case CSN_LEFT_ALIGNED_VAR_BMP_1:
|
||||
{ /* Bitmap from here and to the end of message */
|
||||
|
||||
*pui8DATA(data, (gint16)(gint32)pDescr->descr) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */
|
||||
*pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */
|
||||
|
||||
/* no break -
|
||||
* with a length set we have a regular left aligned variable length bitmap so we continue
|
||||
|
@ -1183,7 +1183,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
* <N: bit (5)> <bitmap: bit(N + offset)>
|
||||
* bit array with length (in bits) specified in parameter (pDescr->descr)
|
||||
*/
|
||||
gint16 no_of_bits = *pui8DATA(data, (gint16)(gint32)pDescr->descr);/* Size of bitmap */
|
||||
gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);/* Size of bitmap */
|
||||
|
||||
no_of_bits += pDescr->i;/* size adjusted by offset */
|
||||
|
||||
|
@ -1212,7 +1212,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
* <count: bit (x)>
|
||||
* <list: octet(count + offset)>
|
||||
*/
|
||||
gint16 count = *pui8DATA(data, (gint16)(gint32)pDescr->descr);
|
||||
gint16 count = *pui8DATA(data, (gint16)pDescr->descr.value);
|
||||
|
||||
count += pDescr->i; /* Adjusted by offset */
|
||||
|
||||
|
@ -1288,7 +1288,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
bit_offset++;
|
||||
|
||||
/* Store the counted number of elements of the array */
|
||||
*pui8DATA(data, (gint16)(gint32)pDescr->descr) = ElementCount;
|
||||
*pui8DATA(data, (gint16)pDescr->descr.value) = ElementCount;
|
||||
|
||||
pDescr++;
|
||||
break;
|
||||
|
@ -1324,7 +1324,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
test_tree = proto_item_add_subtree(ti, ett_csn1);
|
||||
|
||||
csnStreamInit(&arT, bit_offset, remaining_bits_len);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr, tvb, pvDATA(data, pDescr->offset), ett_csn1);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr.ptr, tvb, pvDATA(data, pDescr->offset), ett_csn1);
|
||||
|
||||
if (Status >= 0)
|
||||
{ /* successful completion */
|
||||
|
@ -1384,7 +1384,7 @@ gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pD
|
|||
test_tree = proto_item_add_subtree(ti, ett_csn1);
|
||||
|
||||
csnStreamInit(&arT, bit_offset, remaining_bits_len);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr, tvb, pvDATA(data, pDescr->offset), ett_csn1);
|
||||
Status = csnStreamDissector(test_tree, &arT, pDescr->descr.ptr, tvb, pvDATA(data, pDescr->offset), ett_csn1);
|
||||
|
||||
if (Status >= 0)
|
||||
{ /* successful completion */
|
||||
|
|
|
@ -76,43 +76,6 @@ typedef struct
|
|||
|
||||
typedef gint16 (*StreamSerializeFcn_t)(proto_tree *tree, csnStream_t* ar, tvbuff_t *tvb, void* data, int ett_csn1);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gint16 type;
|
||||
gint16 i;
|
||||
void* descr;
|
||||
size_t offset;
|
||||
const char* sz;
|
||||
StreamSerializeFcn_t serialize;
|
||||
} CSN_DESCR;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
guint8 bits;
|
||||
guint8 value;
|
||||
CSN_DESCR descr;
|
||||
} CSN_ChoiceElement_t;
|
||||
|
||||
void csnStreamInit(csnStream_t* ar,gint BitOffset,gint BitCount);
|
||||
|
||||
/******************************************************************************
|
||||
* FUNCTION: csnStreamDissector
|
||||
* DESCRIPTION:
|
||||
* UnPacks data from bit stream. According to CSN description.
|
||||
* ARGS:
|
||||
* ar stream will hold the parameters to the pack function
|
||||
* ar->remaining_bits_len [IN] Number of bits to unpack [OUT] number of bits left to unpack.
|
||||
* ar->bit_offset [IN/OUT] is the current bit where to proceed with the next bit to unpack.
|
||||
|
||||
* pDescr CSN description.
|
||||
* tvb buffer containing the bit stream to unpack.
|
||||
* data unpacked data.
|
||||
* ett_csn1 tree
|
||||
*
|
||||
* RETURNS: int Number of bits left to be unpacked. Negative Error code if failed to unpack all bits
|
||||
******************************************************************************/
|
||||
gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, tvbuff_t *tvb, void* data, int ett_csn1);
|
||||
|
||||
enum
|
||||
{
|
||||
CSN_END = 0,
|
||||
|
@ -149,6 +112,103 @@ enum
|
|||
CSN_TRAP_ERROR
|
||||
};
|
||||
|
||||
/******************************************************************************************
|
||||
* CSN_DESCR structure:
|
||||
*
|
||||
* type:
|
||||
* This is the CSN type. All existing types are specified in the section above.
|
||||
*
|
||||
* i:
|
||||
* Depending on the contents of the type parameter, the parameter "i" may have following meaning:
|
||||
* - specifies the number of bits for the CSN_UINT type
|
||||
* - the offset for an array size by which the size is incremented
|
||||
* for the CSN_VAR_ARRAY type
|
||||
* - the length of each element of an array for the CSN_REC_ARRAY type
|
||||
* - the number of the elements in an array for the CSN_TYPE_ARRAY type
|
||||
* - the offset to the variable keeping the number of elements of an array for in the CSN_VAR_TARRAY type
|
||||
* - the number of different data types in a union for the CSN_UNION, CSN_UNION_LH, and for the CSN_CHOICE types
|
||||
* - the length in bits of the fixed number defined for the CSN_FIXED type
|
||||
* - the number of lines to skip in the CSN_DESCR type specified for the CSN_NEXT_EXIST, CSN_NEXT_EXIST_LH,
|
||||
* CSN_NEXT_EXIST_OR_NULL, and CSN_NEXT_EXIST_OR_NULL_LH types
|
||||
* - the number of bits in a bitmap for the CSN_BITMAP type
|
||||
* - the value by which the number of bits in a bitmap has to be incremented or decremented for the CSN_VAR_BITMAP, CSN_LEFT_VAR_BMP, and CSN_LEFT_BMP_1 types
|
||||
* - the offset to param1 for the CSN_CALLBACK type
|
||||
* - ERRORCODE used by the CSN_ERROR type
|
||||
*
|
||||
* descr
|
||||
* This parameter has different meaning depending on the value of the type parameter:
|
||||
* - the offset for the CSN_UINT_OFFSET type
|
||||
* - the number of the elements in an array of the CSN_UINT_ARRAY type
|
||||
* - the offset to the parameter where the size of the array has to be stored for the CSN_REC_ARRAY type
|
||||
* - the address of the internal structure, describing the member type (by means of the CSN_DESCR type) in the CSN_TYPE_ARRAY, CSN_VAR_TARRAY, and CSN_TYPE types
|
||||
* - the address of the variable of type CSN_ChoiceElement_t describing all elements in the CSN_CHOICE type union
|
||||
* - the offset to the variable where the number of bits has to be or is stored for the CSN_VAR_BITMAP, CSN_LEFT_VAR_BMP, and CSN_LEFT_BMP_1 types
|
||||
* - the function number (case number) for the CSN_CALLBACK and CSN_CALLBACK_NO_ARGS types
|
||||
* - the free text used by the CSN_TRAP_ERROR
|
||||
*
|
||||
* offset
|
||||
* This is an offset to the _MEMBER parameter counting from the beginning of struct
|
||||
* where the unpacked or packed value shall be stored or fetched. The meaning of the _MEMBER parameter
|
||||
* varies depending on the type which is specified and so is the meaning of the offset parameter.
|
||||
* Some types (and corresponding macros) do not have the _MEMBER parameter and then the offset parameter is not used
|
||||
* or is different from the offset to the _MEMBER.
|
||||
* - the fixed value for the CSN_FIXED type
|
||||
* - an offset to the variable UnionType for CSN_UNION and CSN_UNION_LH types
|
||||
* - an offset to the variable Exist for CSN_NEXT_EXIST and CSN_NEXT_EXIST_LH types
|
||||
* - an offset to param2 in the CSN_CALLBACK type
|
||||
*
|
||||
* sz
|
||||
* - is the name of the parameter within the descr where their unpacked or packed value shall be stored or fetched.
|
||||
* This paramater is pointed out by the offset parameter in the same CSN_DESCR variable as the sz.
|
||||
* - the free text used by the CSN_TRAP_ERROR (the same as parameter "i")
|
||||
*
|
||||
* serialize
|
||||
* - stores the size of _MEMBER type in case of the M_TYPE_ARRAY and M_VAR_TARRAY,
|
||||
* - the address of the function which is provided by the M_SERIALIZE type.
|
||||
******************************************************************************************/
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gint16 type;
|
||||
gint16 i;
|
||||
union
|
||||
{
|
||||
void* ptr;
|
||||
guint32 value;
|
||||
} descr;
|
||||
size_t offset;
|
||||
const char* sz;
|
||||
StreamSerializeFcn_t serialize;
|
||||
} CSN_DESCR;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
guint8 bits;
|
||||
guint8 value;
|
||||
CSN_DESCR descr;
|
||||
} CSN_ChoiceElement_t;
|
||||
|
||||
void csnStreamInit(csnStream_t* ar,gint BitOffset,gint BitCount);
|
||||
|
||||
/******************************************************************************
|
||||
* FUNCTION: csnStreamDissector
|
||||
* DESCRIPTION:
|
||||
* UnPacks data from bit stream. According to CSN description.
|
||||
* ARGS:
|
||||
* ar stream will hold the parameters to the pack function
|
||||
* ar->remaining_bits_len [IN] Number of bits to unpack [OUT] number of bits left to unpack.
|
||||
* ar->bit_offset [IN/OUT] is the current bit where to proceed with the next bit to unpack.
|
||||
|
||||
* pDescr CSN description.
|
||||
* tvb buffer containing the bit stream to unpack.
|
||||
* data unpacked data.
|
||||
* ett_csn1 tree
|
||||
*
|
||||
* RETURNS: int Number of bits left to be unpacked. Negative Error code if failed to unpack all bits
|
||||
******************************************************************************/
|
||||
gint16 csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, tvbuff_t *tvb, void* data, int ett_csn1);
|
||||
|
||||
/* CSN struct macro's */
|
||||
#define CSN_DESCR_BEGIN(_STRUCT)\
|
||||
CSN_DESCR CSNDESCR_##_STRUCT[] = {
|
||||
|
|
|
@ -2775,7 +2775,7 @@ CSN_DESCR_END (RepeatedEUTRAN_NeighbourCells_t)
|
|||
const
|
||||
CSN_DESCR_BEGIN(PCID_Pattern_t)
|
||||
M_UINT (PCID_Pattern_t, PCID_Pattern_length, 3),
|
||||
M_VAR_BITMAP (PCID_Pattern_t, PCID_Pattern, PCID_Pattern_length, 1), /* offset 1, 44.060 12.57 */
|
||||
M_VAR_BITMAP (PCID_Pattern_t, PCID_Pattern, PCID_Pattern_length, 1), // offset 1, 44.060 12.57
|
||||
M_UINT (PCID_Pattern_t, PCID_Pattern_sense, 1),
|
||||
CSN_DESCR_END (PCID_Pattern_t)
|
||||
|
||||
|
@ -3830,7 +3830,7 @@ dissect_gsm_rlcmac_uplink(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
|
|||
proto_item *ti;
|
||||
proto_tree *rlcmac_tree = NULL;
|
||||
guint8 payload_type = tvb_get_bits8(tvb, 0, 2);
|
||||
RlcMacUplink_t * data = (RlcMacUplink_t *)ep_alloc(sizeof(RlcMacUplink_t));
|
||||
RlcMacUplink_t * data = (RlcMacUplink_t *)malloc(sizeof(RlcMacUplink_t));
|
||||
|
||||
if (payload_type == PAYLOAD_TYPE_DATA)
|
||||
{
|
||||
|
@ -3850,7 +3850,10 @@ dissect_gsm_rlcmac_uplink(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
|
|||
ti = proto_tree_add_text(tree, tvb, 0, 1, "%s (Uplink)", MT_UL_TextGet(data->u.MESSAGE_TYPE_v));
|
||||
rlcmac_tree = proto_item_add_subtree(ti, ett_gsm_rlcmac);
|
||||
|
||||
col_add_str(pinfo->cinfo, COL_INFO, MT_UL_TextGet(data->u.MESSAGE_TYPE_v));
|
||||
if (check_col(pinfo->cinfo, COL_INFO))
|
||||
{
|
||||
col_add_str(pinfo->cinfo, COL_INFO, MT_UL_TextGet(data->u.MESSAGE_TYPE_v));
|
||||
}
|
||||
|
||||
switch (data->u.MESSAGE_TYPE_v)
|
||||
{
|
||||
|
@ -3934,6 +3937,7 @@ dissect_gsm_rlcmac_uplink(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
|
|||
ret = -1;
|
||||
break;
|
||||
}
|
||||
free(data);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -3942,7 +3946,7 @@ dissect_gsm_rlcmac_downlink(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
|
|||
csnStream_t ar;
|
||||
proto_item *ti;
|
||||
proto_tree *rlcmac_tree = NULL;
|
||||
RlcMacDownlink_t * data =(RlcMacDownlink_t *) ep_alloc(sizeof(RlcMacDownlink_t));
|
||||
RlcMacDownlink_t * data =(RlcMacDownlink_t *) malloc(sizeof(RlcMacDownlink_t));
|
||||
MSGGPRS_Status_t ret;
|
||||
|
||||
/* See RLC/MAC downlink control block structure in TS 44.060 / 10.3.1 */
|
||||
|
@ -3984,7 +3988,10 @@ dissect_gsm_rlcmac_downlink(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
|
|||
ti = proto_tree_add_text(tree, tvb, 0, 1, "%s (downlink)", MT_DL_TextGet(data->u.MESSAGE_TYPE_v));
|
||||
rlcmac_tree = proto_item_add_subtree(ti, ett_gsm_rlcmac);
|
||||
|
||||
col_add_str(pinfo->cinfo, COL_INFO, MT_DL_TextGet(data->u.MESSAGE_TYPE_v));
|
||||
if (check_col(pinfo->cinfo, COL_INFO))
|
||||
{
|
||||
col_add_str(pinfo->cinfo, COL_INFO, MT_DL_TextGet(data->u.MESSAGE_TYPE_v));
|
||||
}
|
||||
|
||||
/* Dissect the MAC header */
|
||||
proto_tree_add_bits_item(rlcmac_tree, hf_dl_ctrl_payload_type, tvb, 0, 2, FALSE);
|
||||
|
@ -4126,6 +4133,7 @@ dissect_gsm_rlcmac_downlink(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
|
|||
default: ret = -1;
|
||||
break;
|
||||
}
|
||||
free(data);
|
||||
}
|
||||
|
||||
|
||||
|
@ -4142,98 +4150,98 @@ proto_register_gsm_rlcmac(void)
|
|||
{ "Payload Type",
|
||||
"gsm_rlcmac_dl.pt",
|
||||
FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"Payload Type", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_rrbp,
|
||||
{ "RRBP",
|
||||
"gsm_rlcmac_dl.rrbp",
|
||||
FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"RRBP", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_s_p,
|
||||
{ "S/P",
|
||||
"gsm_rlcmac_dl.s_p",
|
||||
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"S/P", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_usf,
|
||||
{ "USF",
|
||||
"gsm_rlcmac_dl.usf",
|
||||
FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"USF", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_rbsn,
|
||||
{ "RBSN",
|
||||
"gsm_rlcmac_dl.rbsn",
|
||||
FT_BOOLEAN,BASE_NONE, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"RBSN", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_rti,
|
||||
{ "RTI",
|
||||
"gsm_rlcmac_dl.rti",
|
||||
FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"RTI", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_fs,
|
||||
{ "FS",
|
||||
"gsm_rlcmac_dl.fs",
|
||||
FT_BOOLEAN,BASE_NONE, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"FS", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_ac,
|
||||
{ "AC",
|
||||
"gsm_rlcmac_dl.ac",
|
||||
FT_BOOLEAN,BASE_NONE, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"AC", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_pr,
|
||||
{ "PR",
|
||||
"gsm_rlcmac_dl.pr",
|
||||
FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"PR", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_tfi,
|
||||
{ "TFI",
|
||||
"gsm_rlcmac_dl.tfi",
|
||||
FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"TFI", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_d,
|
||||
{ "D",
|
||||
"gsm_rlcmac_dl.d",
|
||||
FT_BOOLEAN,BASE_NONE, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"D", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_rbsn_e,
|
||||
{ "RBSNe",
|
||||
"gsm_rlcmac_dl.rbsn_e",
|
||||
FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"RBSNe", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_fs_e,
|
||||
{ "FSe",
|
||||
"gsm_rlcmac_dl.fs_e",
|
||||
FT_BOOLEAN,BASE_NONE, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"FSe", HFILL
|
||||
}
|
||||
},
|
||||
{ &hf_dl_ctrl_spare,
|
||||
{ "spare",
|
||||
"gsm_rlcmac_dl.spare",
|
||||
FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL
|
||||
"spare", HFILL
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue