diff options
author | Anders Broman <anders.broman@ericsson.com> | 2012-12-11 07:01:43 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2012-12-11 07:01:43 +0000 |
commit | c5c24d22778592cea4f2a79d109d051b6718be9d (patch) | |
tree | 74eb027fc177ff86dce1ac86f71a070adfbfa6a3 /epan/dissectors/packet-per.c | |
parent | 70eecf2392d4909e7238b11ba08841812a0c1218 (diff) |
Only construct bit string if show internal per fields is set. Use tvb_get_bits
svn path=/trunk/; revision=46496
Diffstat (limited to 'epan/dissectors/packet-per.c')
-rw-r--r-- | epan/dissectors/packet-per.c | 55 |
1 files changed, 9 insertions, 46 deletions
diff --git a/epan/dissectors/packet-per.c b/epan/dissectors/packet-per.c index 188db4f182..add5e387d4 100644 --- a/epan/dissectors/packet-per.c +++ b/epan/dissectors/packet-per.c @@ -1129,7 +1129,6 @@ dissect_per_constrained_integer(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, nstime_t timeval; header_field_info *hfi; int num_bits; - gboolean tmp; DEBUG_ENTRY("dissect_per_constrained_integer"); if(has_extension){ @@ -1185,8 +1184,7 @@ DEBUG_ENTRY("dissect_per_constrained_integer"); * number of bits necessary to represent the range. */ char *str; - int str_index = 0; - int i, bit, length, str_length; + int i, length; guint32 mask,mask2; /* We only handle 32 bit integers */ mask = 0x80000000; @@ -1206,52 +1204,17 @@ DEBUG_ENTRY("dissect_per_constrained_integer"); num_bits=1; } - /* prepare the string (max number of bits + quartet separators + field name + ": ") */ - str_length = 256+64+(int)strlen(hfi->name)+2; - str=ep_alloc(str_length+1); - - /* Avoiding g_snprintf() here */ - g_strlcpy(str, hfi->name, str_length); - str_index = (int)strlen(hfi->name); - str[str_index++] = ':'; - str[str_index++] = ' '; + val_start = (offset)>>3; + val_length = length; + val = (guint32)tvb_get_bits64(tvb,offset,num_bits, ENC_BIG_ENDIAN); - for(bit=0;bit<((int)(offset&0x07));bit++){ - if(bit&&(!(bit%4))){ - if (str_index < str_length) str[str_index++] = ' '; - } - if (str_index < str_length) str[str_index++] = '.'; - } - /* read the bits for the int */ - for(i=0;i<num_bits;i++){ - if(bit&&(!(bit%4))){ - if (str_index < str_length) str[str_index++] = ' '; - } - if(bit&&(!(bit%8))){ - length+=1; - if (str_index < str_length) str[str_index++] = ' '; - } - bit++; - offset=dissect_per_boolean(tvb, offset, actx, tree, -1, &tmp); - val<<=1; - if(tmp){ - val|=1; - if (str_index < str_length) str[str_index++] = '1'; - } else { - if (str_index < str_length) str[str_index++] = '0'; - } - } - for(;bit%8;bit++){ - if(bit&&(!(bit%4))){ - if (str_index < str_length) str[str_index++] = ' '; - } - if (str_index < str_length) str[str_index++] = '.'; + if (display_internal_per_fields){ + str = decode_bits_in_field((offset&0x07),num_bits,val); + proto_tree_add_text(tree, tvb, val_start,val_length,"MIN %u Range = %u Bitfield length %u, %s: %s value: %u",min, range, num_bits, hfi->name, str, val+min); } - str[str_index] = '\0'; /* Terminate string */ - val_start = (offset-num_bits)>>3; val_length = length; + /* The actual value */ val+=min; - if (display_internal_per_fields) - proto_tree_add_text(tree, tvb, val_start,val_length,"Range = %u Bitfield length %u, %s", range, num_bits, str); + offset = offset+num_bits; } else if(range==256){ /* 10.5.7.2 */ |