USB HID: Parse bit fields with correct bit order

Implement little endian support for tvb_get_bits family of functions.
The big/little endian refers to bit numbering within an octet. In big
endian, the most significant bit is considered bit 0, while in little
endian the least significant bit is considered bit 0.

Add encoding parameters to proto tree bits format family functions.
Specify ENC_BIG_ENDIAN in all dissectors using these functions except in
USB HID that requires ENC_LITTLE_ENDIAN to work correctly.

When formatting bits values, always display most significant bit on the
leftmost position regardless of the encoding. This results in no gaps
between octets and makes the displayed value comprehensible.

Close #4478
Fix #17014
This commit is contained in:
Tomasz Moń 2021-09-15 21:32:56 +02:00
parent d87e6e58fa
commit 7b82110092
28 changed files with 330 additions and 162 deletions

View File

@ -1833,6 +1833,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
tvb_new_child_real_data@Base 1.9.1
tvb_new_composite@Base 1.9.1
tvb_new_octet_aligned@Base 1.9.1
tvb_new_octet_right_aligned@Base 3.5.1
tvb_new_real_data@Base 1.9.1
tvb_new_subset_length@Base 1.9.1
tvb_new_subset_length_caplen@Base 2.3.0

View File

@ -1297,10 +1297,10 @@ AlmanacBDS-AlmanacSet-r12/bdsAlmA1-r12 DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(lpp_b
bits = tvb_get_bits16(bdsSvHealth_tvb, 0, 9,ENC_BIG_ENDIAN);
if (bits == 0x1ff) {
proto_tree_add_boolean_bits_format_value(subtree, hf_lpp_bdsSvHealth_r12_sat_clock, bdsSvHealth_tvb, 0, 1, 1,
"Satellite is in failure or permanently shut off (1)");
ENC_BIG_ENDIAN, "Satellite is in failure or permanently shut off (1)");
} else if (bits == 0x100) {
proto_tree_add_boolean_bits_format_value(subtree, hf_lpp_bdsSvHealth_r12_sat_clock, bdsSvHealth_tvb, 0, 1, 1,
"Satellite clock is unavailable (1)");
ENC_BIG_ENDIAN, "Satellite clock is unavailable (1)");
} else {
proto_tree_add_bits_item(subtree, hf_lpp_bdsSvHealth_r12_sat_clock, bdsSvHealth_tvb, 0, 1, ENC_BIG_ENDIAN);
proto_tree_add_bits_item(subtree, hf_lpp_bdsSvHealth_r12_b1i, bdsSvHealth_tvb, 1, 1, ENC_BIG_ENDIAN);

View File

@ -3192,7 +3192,7 @@ dissect_6lowpan_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
else {
guint8 pattern = tvb_get_guint8(tvb, 0);
proto_tree_add_uint_bits_format_value(tree, hf_6lowpan_pattern, tvb, 0, 8, pattern, "Unknown (0x%02x)", pattern);
proto_tree_add_uint_bits_format_value(tree, hf_6lowpan_pattern, tvb, 0, 8, pattern, ENC_BIG_ENDIAN, "Unknown (0x%02x)", pattern);
}
/* Create a tvbuff subset for the remaining data. */

View File

@ -562,20 +562,20 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
/* TIME_REF_CDMA */
value = tvb_get_bits16(tvb, bit_offset, 14, ENC_BIG_ENDIAN);
proto_tree_add_uint_bits_format_value(tree, hf_ansi_801_time_ref_cdma, tvb, bit_offset, 14, value * 50,
"%u frames (0x%04x)", value * 50, value);
ENC_BIG_ENDIAN, "%u frames (0x%04x)", value * 50, value);
bit_offset += 14;
/* LAT */
value = tvb_get_bits32(tvb, bit_offset, 25, ENC_BIG_ENDIAN);
fl_value = (float)(-90.0 + ((float)value * 180 / 33554432));
proto_tree_add_float_bits_format_value(tree, hf_ansi_801_lat, tvb, bit_offset, 25, fl_value,
proto_tree_add_float_bits_format_value(tree, hf_ansi_801_lat, tvb, bit_offset, 25, fl_value, ENC_BIG_ENDIAN,
"%.5f degrees %s (0x%08x)", fabs(fl_value), fl_value < 0 ? "South" : "North", value);
bit_offset += 25;
/* LONG */
value = tvb_get_bits32(tvb, bit_offset, 26, ENC_BIG_ENDIAN);
fl_value = (float)(-180.0 + ((float)value * 180 / 33554432));
proto_tree_add_float_bits_format_value(tree, hf_ansi_801_long, tvb, bit_offset, 26, fl_value,
proto_tree_add_float_bits_format_value(tree, hf_ansi_801_long, tvb, bit_offset, 26, fl_value, ENC_BIG_ENDIAN,
"%.5f degrees %s (0x%08x)", fabs(fl_value), fl_value < 0 ? "West" : "East", value);
bit_offset += 26;
@ -583,7 +583,7 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
value = tvb_get_bits8(tvb, bit_offset, 4);
fl_value = (float)(5.625 * value);
proto_tree_add_float_bits_format_value(tree, hf_ansi_801_loc_uncrtnty_ang, tvb, bit_offset, 4, fl_value,
"%.5f degrees (0x%02x)", fl_value, value);
ENC_BIG_ENDIAN, "%.5f degrees (0x%02x)", fl_value, value);
bit_offset += 4;
/* LOC_UNCRTNTY_A */
@ -599,7 +599,7 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
str = wmem_strdup_printf(pinfo->pool, "%.2f meters", fl_value);
}
proto_tree_add_uint_bits_format_value(tree, hf_ansi_801_loc_uncrtnty_a, tvb, bit_offset, 5, value,
"%s (0x%02x)", str, value);
ENC_BIG_ENDIAN, "%s (0x%02x)", str, value);
bit_offset += 5;
/* LOC_UNCRTNTY_P */
@ -615,7 +615,7 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
str = wmem_strdup_printf(pinfo->pool, "%.2f meters", fl_value);
}
proto_tree_add_uint_bits_format_value(tree, hf_ansi_801_loc_uncrtnty_p, tvb, bit_offset, 5, value,
"%s (0x%02x)", str, value);
ENC_BIG_ENDIAN, "%s (0x%02x)", str, value);
bit_offset += 5;
/* FIX_TYPE */
@ -631,14 +631,14 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
value = tvb_get_bits16(tvb, bit_offset, 9, ENC_BIG_ENDIAN);
fl_value = (float)(0.25 * value);
proto_tree_add_float_bits_format_value(tree, hf_ansi_801_velocity_hor, tvb, bit_offset, 9, fl_value,
"%.2f m/s (0x%04x)", fl_value, value);
ENC_BIG_ENDIAN, "%.2f m/s (0x%04x)", fl_value, value);
bit_offset += 9;
/* HEADING */
value = tvb_get_bits16(tvb, bit_offset, 10, ENC_BIG_ENDIAN);
fl_value = (float)value * 360 / 1024;
proto_tree_add_float_bits_format_value(tree, hf_ansi_801_heading, tvb, bit_offset, 10, fl_value,
"%.3f degrees (0x%04x)", fl_value, value);
ENC_BIG_ENDIAN, "%.3f degrees (0x%04x)", fl_value, value);
bit_offset += 10;
if(fix_type)
@ -647,7 +647,7 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
value = tvb_get_bits8(tvb, bit_offset, 8);
fl_value = (float)(-64 + 0.5 * value);
proto_tree_add_float_bits_format_value(tree, hf_ansi_801_velocity_ver, tvb, bit_offset, 8, fl_value,
"%.1f m/s (0x%02x)", fl_value, value);
ENC_BIG_ENDIAN, "%.1f m/s (0x%02x)", fl_value, value);
bit_offset += 8;
}
}
@ -660,13 +660,13 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
/* CLOCK_BIAS */
value = tvb_get_bits32(tvb, bit_offset, 18, ENC_BIG_ENDIAN);
proto_tree_add_int_bits_format_value(tree, hf_ansi_801_clock_bias, tvb, bit_offset, 18, (gint32)value - 13000,
"%d ns (0x%06x)", (gint32)value - 13000, value);
ENC_BIG_ENDIAN, "%d ns (0x%06x)", (gint32)value - 13000, value);
bit_offset += 18;
/* CLOCK_DRIFT */
value = tvb_get_bits16(tvb, bit_offset, 16, ENC_BIG_ENDIAN);
proto_tree_add_int_bits_format_value(tree, hf_ansi_801_clock_drift, tvb, bit_offset, 16, (gint16)value,
"%d ppb (ns/s) (0x%04x)", (gint16)value, value);
ENC_BIG_ENDIAN, "%d ppb (ns/s) (0x%04x)", (gint16)value, value);
bit_offset += 16;
}
@ -678,7 +678,7 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
/* HEIGHT */
value = tvb_get_bits16(tvb, bit_offset, 14, ENC_BIG_ENDIAN);
proto_tree_add_int_bits_format_value(tree, hf_ansi_801_height, tvb, bit_offset, 14, (gint32)value - 500,
"%d m (0x%04x)", (gint32)value - 500, value);
ENC_BIG_ENDIAN, "%d m (0x%04x)", (gint32)value - 500, value);
bit_offset += 14;
/* LOC_UNCRTNTY_V */
@ -694,7 +694,7 @@ pr_loc_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint len,
str = wmem_strdup_printf(pinfo->pool, "%.2f meters", fl_value);
}
proto_tree_add_uint_bits_format_value(tree, hf_ansi_801_loc_uncrtnty_v, tvb, bit_offset, 5, value,
"%s (0x%02x)", str, value);
ENC_BIG_ENDIAN, "%s (0x%02x)", str, value);
bit_offset += 5;
}
@ -736,7 +736,7 @@ for_pr_gps_sat_health(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
/* NUM_BAD_SV */
num_bad_sv = tvb_get_bits8(tvb, bit_offset, 4) + 1;
proto_tree_add_uint_bits_format_value(tree, hf_ansi_801_num_bad_sv, tvb, bit_offset, 4, num_bad_sv,
"%u", num_bad_sv);
ENC_BIG_ENDIAN, "%u", num_bad_sv);
bit_offset += 4;
for (i=0; i < num_bad_sv; i++)
@ -744,7 +744,7 @@ for_pr_gps_sat_health(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
/* BAD_SV_PRN_NUM */
bad_sv_prn_num = tvb_get_bits8(tvb, bit_offset, 5) + 1;
proto_tree_add_uint_bits_format_value(tree, hf_ansi_801_bad_sv_prn_num, tvb, bit_offset, 5, bad_sv_prn_num,
"%u", bad_sv_prn_num);
ENC_BIG_ENDIAN, "%u", bad_sv_prn_num);
bit_offset += 5;
}
}

View File

@ -123,7 +123,7 @@ dissect_cl3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
/* CL3 version agnostic fields: (pretty much just the first byte; like ipv4, version + length) */
proto_tree_add_item(cl3_tree, hf_cl3_version, tvb, 0, 1, ENC_NA);
proto_tree_add_uint_bits_format_value(cl3_tree, hf_cl3_headerlen, tvb, 0 + 4, 4, header_length,
"%u bytes (%u)", header_length, header_length >> 2);
ENC_BIG_ENDIAN, "%u bytes (%u)", header_length, header_length >> 2);
/* validate the header length... */
if ((header_length < 1) || (header_length > tvb_captured_length(tvb))) {

View File

@ -279,7 +279,7 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
*pui8 = ui8 + (guint8)pDescr->descr.value;
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits,
*pui8, "%u (Raw %u + Offset %u)", *pui8, ui8,
*pui8, ENC_BIG_ENDIAN, "%u (Raw %u + Offset %u)", *pui8, ui8,
(guint8) pDescr->descr.value);
}
else if (no_of_bits <= 16)
@ -289,7 +289,7 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
*pui16 = ui16 + (guint16)pDescr->descr.value;
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits,
*pui16, "%u (Raw %u + Offset %u)", *pui16, ui16,
*pui16, ENC_BIG_ENDIAN, "%u (Raw %u + Offset %u)", *pui16, ui16,
(guint16) pDescr->descr.value);
}
else if (no_of_bits <= 32)
@ -299,7 +299,7 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
*pui32 = ui32 + (guint16)pDescr->descr.value;
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits,
*pui32, "%u (Raw %u + Offset %u)", *pui32, ui32,
*pui32, ENC_BIG_ENDIAN, "%u (Raw %u + Offset %u)", *pui32, ui32,
(guint16) pDescr->descr.value);
}
else
@ -417,7 +417,7 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
do
{
*pui8++ = tvb_get_bits8(tvb, bit_offset, no_of_bits);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, *pui8, " (Count %d)", i++);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, *pui8, ENC_BIG_ENDIAN, " (Count %d)", i++);
bit_offset += no_of_bits;
} while (--nCount > 0);
}
@ -697,7 +697,7 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
/* Now get the bits to extract the index */
Bits = ixBitsTab[count];
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, Bits, tvb_get_bits8(tvb, bit_offset, Bits), " (Union)");
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, Bits, tvb_get_bits8(tvb, bit_offset, Bits), ENC_BIG_ENDIAN, " (Union)");
t_index = 0;
while (Bits > 0)
@ -807,21 +807,21 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
guint8 ui8 = tvb_get_bits8(tvb, bit_offset, no_of_bits);
pui8 = pui8DATA(data, pDescr->offset);
*pui8 = ui8 + (guint8)pDescr->descr.value;
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, ui8, "%d", ui8);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, ui8, ENC_BIG_ENDIAN, "%d", ui8);
}
else if (no_of_bits <= 16)
{
guint16 ui16 = tvb_get_bits16(tvb, bit_offset, no_of_bits, ENC_BIG_ENDIAN);
pui16 = pui16DATA(data, pDescr->offset);
*pui16 = ui16 + (guint16)pDescr->descr.value;
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, ui16, "%d", ui16);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, ui16, ENC_BIG_ENDIAN, "%d", ui16);
}
else if (no_of_bits <= 32)
{
guint32 ui32 = tvb_get_bits32(tvb, bit_offset, no_of_bits, ENC_BIG_ENDIAN);
pui32 = pui32DATA(data, pDescr->offset);
*pui32 = ui32 + (guint16)pDescr->descr.value;
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, ui32, "%d", ui32);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, ui32, ENC_BIG_ENDIAN, "%d", ui32);
}
else
{
@ -889,7 +889,7 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
while (nCount > 0)
{
*pui8 = tvb_get_bits8(tvb, bit_offset, no_of_bits);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, *pui8, " (Count %d)", i++);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, *pui8, ENC_BIG_ENDIAN, " (Count %d)", i++);
pui8++;
bit_offset += no_of_bits;
nCount--;
@ -902,7 +902,7 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
while (nCount > 0)
{
*pui16 = tvb_get_bits16(tvb, bit_offset, no_of_bits, ENC_BIG_ENDIAN);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, *pui16, " (Count %d)", i++);
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, no_of_bits, *pui16, ENC_BIG_ENDIAN, " (Count %d)", i++);
bit_offset += no_of_bits;
nCount--;
}
@ -1459,7 +1459,7 @@ csnStreamDissector(proto_tree *tree, csnStream_t* ar, const CSN_DESCR* pDescr, t
}
/* control of next element's tag */
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, 1, tvb_get_bits8(tvb, bit_offset, 1), "%s[%d]",
proto_tree_add_uint_bits_format_value(tree, *(pDescr->hf_ptr), tvb, bit_offset, 1, tvb_get_bits8(tvb, bit_offset, 1), ENC_BIG_ENDIAN, "%s[%d]",
proto_registrar_get_name(*(pDescr->hf_ptr)), ElementCount);
EndOfList = !(existNextElement(tvb, bit_offset, Tag));

View File

@ -600,7 +600,7 @@ dissect_evs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
/* LP-CNG SID frame */
/* Bandwidth indicator 1 bit */
oct = tvb_get_bits8(tvb, bit_offset, 1);
proto_tree_add_uint_bits_format_value(vd_tree, hf_evs_bw, tvb, bit_offset, 1, 1,"BW: %s (%u)",
proto_tree_add_uint_bits_format_value(vd_tree, hf_evs_bw, tvb, bit_offset, 1, 1, ENC_BIG_ENDIAN, "BW: %s (%u)",
val_to_str_const(oct << 1, evs_bw_values, "Unknown value"),
oct << 1);
bit_offset++;

View File

@ -1213,7 +1213,7 @@ dissect_sec_var_len(tvbuff_t *tvb, gint *offset, packet_info *pinfo, proto_tree
ti = proto_tree_add_item(tree, hf_sgeonw_var_len, tvb, start, (*offset) - start, ENC_NA); // Length cannot be determined now
subtree = proto_item_add_subtree(ti, ett_sgeonw_var_len);
proto_tree_add_bits_item(subtree, hf_sgeonw_var_len_det, tvb, start << 3, (*offset) - start, ENC_NA);
proto_tree_add_uint_bits_format_value(subtree, hf_sgeonw_var_len_val, tvb, (start << 3) + (*offset) - start, (((*offset) - start) << 3) - ((*offset) - start),var_len,"%u",var_len);
proto_tree_add_uint_bits_format_value(subtree, hf_sgeonw_var_len_val, tvb, (start << 3) + (*offset) - start, (((*offset) - start) << 3) - ((*offset) - start),var_len,ENC_BIG_ENDIAN,"%u",var_len);
// EI Error if !mask (more than 32 bits)
if (!mask)
expert_add_info(pinfo, ti, &ei_sgeonw_len_unsupported);
@ -1248,11 +1248,11 @@ dissect_sec_intx(tvbuff_t *tvb, gint *offset, packet_info *pinfo, proto_tree *tr
proto_tree_add_bits_item(subtree, hf_sgeonw_var_len_det, tvb, start << 3, (*offset) - start, ENC_NA);
if ((hf != hf_sgeonw_app_id) || ((*offset) - start) > 4) {
proto_tree_add_uint64_bits_format_value(subtree, hf, tvb, (start << 3) + (*offset) - start,
(((*offset) - start) << 3) - ((*offset) - start), tmp_val, "%" G_GUINT64_FORMAT, tmp_val);
(((*offset) - start) << 3) - ((*offset) - start), tmp_val, ENC_BIG_ENDIAN, "%" G_GUINT64_FORMAT, tmp_val);
}
else {
proto_tree_add_uint_bits_format_value(subtree, hf, tvb, (start << 3) + (*offset) - start,
(((*offset) - start) << 3) - ((*offset) - start), (guint32)tmp_val, "%s(%u)", val64_to_str_const(tmp_val, ieee1609dot2_Psid_vals, "Unknown") , (guint32)tmp_val);
(((*offset) - start) << 3) - ((*offset) - start), (guint32)tmp_val, ENC_BIG_ENDIAN, "%s(%u)", val64_to_str_const(tmp_val, ieee1609dot2_Psid_vals, "Unknown") , (guint32)tmp_val);
}
// ETSI TS 103 097 V1.2.1: The encoding of the length shall use at most 7 bits set to 1.
if (!mask)

View File

@ -649,14 +649,14 @@ Seg3A_LAI_Dissector(proto_tree *tree, csnStream_t* ar, tvbuff_t *tvb, void* data
LAI->MSC_ID = (LAI->LAC >> 10) & 0x3f;
LAI->Spot_Beam_ID = LAI->LAC & 0x03ff;
proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_mcc, tvb, ar->bit_offset, 16, (guint32)LAI->MCC, "%d", LAI->MCC);
proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_mnc, tvb, ar->bit_offset+16, 8, (guint32)LAI->MNC, "%d", LAI->MNC);
proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_mcc, tvb, ar->bit_offset, 16, (guint32)LAI->MCC, ENC_BIG_ENDIAN, "%d", LAI->MCC);
proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_mnc, tvb, ar->bit_offset+16, 8, (guint32)LAI->MNC, ENC_BIG_ENDIAN, "%d", LAI->MNC);
lac_item = proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_lac, tvb, ar->bit_offset+24, 16, (guint32)LAI->LAC, "0x%04x", LAI->LAC);
lac_item = proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_lac, tvb, ar->bit_offset+24, 16, (guint32)LAI->LAC, ENC_BIG_ENDIAN, "0x%04x", LAI->LAC);
lac_tree = proto_item_add_subtree(lac_item, ett_csn1);
proto_tree_add_uint_bits_format_value(lac_tree, hf_seg3a_lai_msc_id, tvb, ar->bit_offset+24, 6, (guint32)LAI->MSC_ID, "%d", LAI->MSC_ID);
proto_tree_add_uint_bits_format_value(lac_tree, hf_seg3a_lai_spot_beam_id, tvb, ar->bit_offset+30, 10, (guint32)LAI->Spot_Beam_ID, "%d", LAI->Spot_Beam_ID);
proto_tree_add_uint_bits_format_value(lac_tree, hf_seg3a_lai_msc_id, tvb, ar->bit_offset+24, 6, (guint32)LAI->MSC_ID, ENC_BIG_ENDIAN, "%d", LAI->MSC_ID);
proto_tree_add_uint_bits_format_value(lac_tree, hf_seg3a_lai_spot_beam_id, tvb, ar->bit_offset+30, 10, (guint32)LAI->Spot_Beam_ID, ENC_BIG_ENDIAN, "%d", LAI->Spot_Beam_ID);
ar->remaining_bits_len -= 5*8;
ar->bit_offset += 5*8;

View File

@ -3959,7 +3959,7 @@ de_tp_epc_ellipsoid_point_with_alt(tvbuff_t *tvb, proto_tree *tree, packet_info
curr_offset += 3;
longitude = tvb_get_ntoh24(tvb, curr_offset);
proto_tree_add_int_format(tree, hf_gsm_a_dtap_epc_degrees_longitude, tvb, curr_offset, 3, longitude,
"%s = %s: %d", decode_bits_in_field(curr_offset<<3, 24, longitude),
"%s = %s: %d", decode_bits_in_field(curr_offset<<3, 24, longitude, ENC_BIG_ENDIAN),
proto_registrar_get_name(hf_gsm_a_dtap_epc_degrees_longitude), longitude-8388608);
curr_offset += 3;
proto_tree_add_bits_item(tree, hf_gsm_a_dtap_epc_altitude_dir, tvb, curr_offset<<3, 1, ENC_BIG_ENDIAN);

View File

@ -1880,7 +1880,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui
/* decode_bits_in_field(gint bit_offset, gint no_of_bits, guint64 value)*/
proto_tree_add_uint_format(tf_tree, hf_gsm_a_gm_rf_power_capability, tvb, curr_offset-1-add_octets, 1+add_octets, value,
"%s RF Power Capability, GMSK Power Class: %s (%u)", decode_bits_in_field(bit_offset, 3, value), str, value);
"%s RF Power Capability, GMSK Power Class: %s (%u)", decode_bits_in_field(bit_offset, 3, value, ENC_BIG_ENDIAN), str, value);
bit_offset += 3;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
@ -1948,7 +1948,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui
str = "Not specified??";
proto_tree_add_uint_format(tf_tree, hf_gsm_a_gm_rf_power_capability, tvb, curr_offset-1-add_octets, 1+add_octets, value,
"%s RF Power Capability, GMSK Power Class: %s (%u)", decode_bits_in_field(bit_offset, 3, value), str, value);
"%s RF Power Capability, GMSK Power Class: %s (%u)", decode_bits_in_field(bit_offset, 3, value, ENC_BIG_ENDIAN), str, value);
bit_offset += 3;
curr_bits_length -= bits_needed;

View File

@ -1599,7 +1599,7 @@ static void dissect_channel_list_n_range(tvbuff_t *tvb, proto_tree *tree, packet
for (i=1; i<=imax; i++) {
w[i] = (gint) tvb_get_bits(tvb, bit_offset, wsize, FALSE);
proto_tree_add_bytes_format(subtree, hf_gsm_a_rr_w_elements, tvb, bit_offset>>3, ((bit_offset+wsize-1)>>3) - (bit_offset>>3) + 1 , NULL, "%s W(%d): %d",
decode_bits_in_field(bit_offset, wsize, w[i]),
decode_bits_in_field(bit_offset, wsize, w[i], ENC_BIG_ENDIAN),
i,
w[i]);
bit_offset += wsize;

View File

@ -24270,7 +24270,7 @@ dissect_pvb_encoded_block_bitmap(tvbuff_t *tvb, packet_info *pinfo _U_,
proto_tree_add_uint_bits_format_value(sb_tree,
hf_ieee80211_s1g_block_bitmap_sta_aid13,
tvb, offset * 8 + (7 - bit_pos), 1, 1,
" 0x%0x", aid13);
ENC_BIG_ENDIAN, " 0x%0x", aid13);
}
bit_pos += 1;
@ -24342,7 +24342,7 @@ dissect_pvb_encoded_olb(tvbuff_t *tvb, packet_info *pinfo _U_,
proto_tree_add_uint_bits_format_value(sb_tree,
hf_ieee80211_s1g_block_bitmap_sta_aid13,
tvb, offset * 8 + (7 - bit_pos), 1, 1,
" 0x%0x", aid13);
ENC_BIG_ENDIAN, " 0x%0x", aid13);
}
bit_pos += 1;
@ -24383,11 +24383,11 @@ dissect_pvb_encoded_ade(tvbuff_t *tvb, packet_info *pinfo _U_,
proto_tree_add_uint_bits_format_value(cntl_tree,
hf_ieee80211_s1g_block_bitmap_ewl,
tvb, offset *8, 3, ewl,
"EWL: %u", ewl);
ENC_BIG_ENDIAN, "EWL: %u", ewl);
proto_tree_add_uint_bits_format_value(cntl_tree,
hf_ieee80211_s1g_block_bitmap_len,
tvb, offset * 8 + 3, 5, ade_bytes,
"Length: %u", ade_bytes);
ENC_BIG_ENDIAN, "Length: %u", ade_bytes);
offset += 1;
/* TODO: Add each subblock */

View File

@ -1889,7 +1889,7 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void*
"Bogus IP header length (%u, must be at least %u)",
hlen, IPH_MIN_LEN);
tf = proto_tree_add_uint_bits_format_value(ip_tree, hf_ip_hdr_len, tvb, (offset<<3)+4, 4, hlen,
"%u bytes (%u)", hlen, hlen>>2);
ENC_BIG_ENDIAN, "%u bytes (%u)", hlen, hlen>>2);
expert_add_info_format(pinfo, tf, &ei_ip_bogus_header_length,
"Bogus IP header length (%u, must be at least %u)", hlen, IPH_MIN_LEN);
return tvb_captured_length(tvb);
@ -1897,7 +1897,7 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void*
// This should be consistent with tcp.hdr_len.
proto_tree_add_uint_bits_format_value(ip_tree, hf_ip_hdr_len, tvb, (offset<<3)+4, 4, hlen,
"%u bytes (%u)", hlen, hlen>>2);
ENC_BIG_ENDIAN, "%u bytes (%u)", hlen, hlen>>2);
iph->ip_tos = tvb_get_guint8(tvb, offset + 1);
if (g_ip_dscp_actif) {

View File

@ -469,7 +469,7 @@ static int dissect_iso14443_atqb(tvbuff_t *tvb, gint offset,
max_frame_size_code = (tvb_get_guint8(tvb, offset) & 0xF0) >> 4;
proto_tree_add_uint_bits_format_value(prot_inf_tree,
hf_iso14443_max_frame_size_code,
tvb, offset*8, 4, max_frame_size_code, "%d",
tvb, offset*8, 4, max_frame_size_code, ENC_BIG_ENDIAN, "%d",
max_frame_size_code);
if (max_frame_size_code < LEN_CODE_MAX) {
pi = proto_tree_add_uint(prot_inf_tree, hf_iso14443_max_frame_size,
@ -487,7 +487,7 @@ static int dissect_iso14443_atqb(tvbuff_t *tvb, gint offset,
offset++;
fwi = (tvb_get_guint8(tvb, offset) & 0xF0) >> 4;
proto_tree_add_uint_bits_format_value(prot_inf_tree, hf_iso14443_fwi,
tvb, offset*8, 4, fwi, "%d", fwi);
tvb, offset*8, 4, fwi, ENC_BIG_ENDIAN, "%d", fwi);
iso14443_adc = tvb_get_guint8(tvb, offset) & 0x04;
proto_tree_add_item(prot_inf_tree, hf_iso14443_adc,
tvb, offset, 1, ENC_BIG_ENDIAN);
@ -508,11 +508,11 @@ static int dissect_iso14443_atqb(tvbuff_t *tvb, gint offset,
nad_supported = tvb_get_guint8(tvb, offset) & 0x02;
proto_tree_add_boolean_bits_format_value(prot_inf_tree,
hf_iso14443_nad_supported, tvb, 8*offset+6, 1, nad_supported,
"%s", tfs_get_string(nad_supported, &tfs_supported_not_supported));
ENC_BIG_ENDIAN, "%s", tfs_get_string(nad_supported, &tfs_supported_not_supported));
cid_supported = tvb_get_guint8(tvb, offset) & 0x01;
proto_tree_add_boolean_bits_format_value(prot_inf_tree,
hf_iso14443_cid_supported, tvb, 8*offset+7, 1, cid_supported,
"%s", tfs_get_string(cid_supported, &tfs_supported_not_supported));
ENC_BIG_ENDIAN, "%s", tfs_get_string(cid_supported, &tfs_supported_not_supported));
offset++;
/* XXX - extended ATQB */
@ -559,7 +559,7 @@ dissect_iso14443_cmd_type_wupb(tvbuff_t *tvb, packet_info *pinfo,
proto_item_append_text(ti, ": %s", msg_type);
proto_tree_add_uint_bits_format_value(tree, hf_iso14443_n,
tvb, offset*8+5, 3, pow2(guint32, param&0x07),
"%u", pow2(guint32, param&0x07));
ENC_BIG_ENDIAN, "%u", pow2(guint32, param&0x07));
offset++;
if (!crc_dropped) {
@ -740,10 +740,10 @@ static int dissect_iso14443_ats(tvbuff_t *tvb, gint offset,
tb1_tree = proto_item_add_subtree(tb1_it, ett_iso14443_ats_tb1);
fwi = (tvb_get_guint8(tvb, offset) & 0xF0) >> 4;
proto_tree_add_uint_bits_format_value(tb1_tree, hf_iso14443_fwi,
tvb, offset*8, 4, fwi, "%d", fwi);
tvb, offset*8, 4, fwi, ENC_BIG_ENDIAN, "%d", fwi);
sfgi = tvb_get_guint8(tvb, offset) & 0x0F;
proto_tree_add_uint_bits_format_value(tb1_tree, hf_iso14443_sfgi,
tvb, offset*8+4, 4, sfgi, "%d", sfgi);
tvb, offset*8+4, 4, sfgi, ENC_BIG_ENDIAN, "%d", sfgi);
offset++;
}
if (t0 & HAVE_TC1) {
@ -754,11 +754,11 @@ static int dissect_iso14443_ats(tvbuff_t *tvb, gint offset,
cid_supported = tvb_get_guint8(tvb, offset) & 0x02;
proto_tree_add_boolean_bits_format_value(tc1_tree,
hf_iso14443_cid_supported, tvb, 8*offset+6, 1, cid_supported,
"%s", tfs_get_string(cid_supported, &tfs_supported_not_supported));
ENC_BIG_ENDIAN, "%s", tfs_get_string(cid_supported, &tfs_supported_not_supported));
nad_supported = tvb_get_guint8(tvb, offset) & 0x01;
proto_tree_add_boolean_bits_format_value(tc1_tree,
hf_iso14443_nad_supported, tvb, 8*offset+7, 1, nad_supported,
"%s", tfs_get_string(nad_supported, &tfs_supported_not_supported));
ENC_BIG_ENDIAN, "%s", tfs_get_string(nad_supported, &tfs_supported_not_supported));
offset++;
}
hist_len = tl - (offset - offset_tl);
@ -798,7 +798,7 @@ dissect_iso14443_cmd_type_ats(tvbuff_t *tvb, packet_info *pinfo,
offset++;
fsdi = tvb_get_guint8(tvb, offset) >> 4;
proto_tree_add_uint_bits_format_value(tree, hf_iso14443_fsdi,
tvb, offset*8, 4, fsdi, "%d", fsdi);
tvb, offset*8, 4, fsdi, ENC_BIG_ENDIAN, "%d", fsdi);
if (fsdi < LEN_CODE_MAX) {
pi = proto_tree_add_uint(tree, hf_iso14443_fsd,
tvb, offset, 1, code_to_len[fsdi]);
@ -806,7 +806,7 @@ dissect_iso14443_cmd_type_ats(tvbuff_t *tvb, packet_info *pinfo,
}
cid = tvb_get_guint8(tvb, offset) & 0x0F;
proto_tree_add_uint_bits_format_value(tree, hf_iso14443_cid,
tvb, offset*8+4, 4, cid, "%d", cid);
tvb, offset*8+4, 4, cid, ENC_BIG_ENDIAN, "%d", cid);
offset++;
if (!crc_dropped) {
proto_tree_add_checksum(tree, tvb, offset,
@ -866,7 +866,7 @@ static int dissect_iso14443_attrib(tvbuff_t *tvb, gint offset,
max_frame_size_code = tvb_get_guint8(tvb, offset) & 0x0F;
proto_tree_add_uint_bits_format_value(p2_tree,
hf_iso14443_max_frame_size_code,
tvb, offset*8+4, 4, max_frame_size_code, "%d",
tvb, offset*8+4, 4, max_frame_size_code, ENC_BIG_ENDIAN, "%d",
max_frame_size_code);
if (max_frame_size_code < LEN_CODE_MAX) {
pi = proto_tree_add_uint(p2_tree, hf_iso14443_max_frame_size,
@ -889,7 +889,7 @@ static int dissect_iso14443_attrib(tvbuff_t *tvb, gint offset,
p4_tree = proto_item_add_subtree(p4_it, ett_iso14443_attr_p4);
cid = tvb_get_guint8(tvb, offset) & 0x0F;
proto_tree_add_uint_bits_format_value(p4_tree, hf_iso14443_cid,
tvb, offset*8+4, 4, cid, "%d", cid);
tvb, offset*8+4, 4, cid, ENC_BIG_ENDIAN, "%d", cid);
offset++;
hl_inf_len = crc_dropped ?
@ -934,10 +934,10 @@ dissect_iso14443_cmd_type_attrib(tvbuff_t *tvb, packet_info *pinfo,
mbli = tvb_get_guint8(tvb, offset) >> 4;
proto_tree_add_uint_bits_format_value(tree, hf_iso14443_mbli,
tvb, offset*8, 4, mbli, "%d", mbli);
tvb, offset*8, 4, mbli, ENC_BIG_ENDIAN, "%d", mbli);
cid = tvb_get_guint8(tvb, offset) & 0x0F;
proto_tree_add_uint_bits_format_value(tree, hf_iso14443_cid,
tvb, offset*8+4, 4, cid, "%d", cid);
tvb, offset*8+4, 4, cid, ENC_BIG_ENDIAN, "%d", cid);
offset++;
hl_resp_len = crc_dropped ?

View File

@ -4045,7 +4045,7 @@ dissect_isup_range_and_status_parameter(tvbuff_t *parameter_tvb, packet_info *pi
range_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, offset, -1, ett_isup_range, NULL, "Status subfield");
if (range<9) {
proto_tree_add_uint_bits_format_value(range_tree, hf_isup_bitbucket, parameter_tvb, (offset*8)+(8-range), range,
tvb_get_guint8(parameter_tvb, offset), "%u bit 1", range);
tvb_get_guint8(parameter_tvb, offset), ENC_BIG_ENDIAN, "%u bit 1", range);
}
} else {
expert_add_info(pinfo, parameter_item, &ei_isup_status_subfield_not_present);

View File

@ -14583,10 +14583,10 @@ dissect_lpp_T_bdsSvHealth_r12(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *act
bits = tvb_get_bits16(bdsSvHealth_tvb, 0, 9,ENC_BIG_ENDIAN);
if (bits == 0x1ff) {
proto_tree_add_boolean_bits_format_value(subtree, hf_lpp_bdsSvHealth_r12_sat_clock, bdsSvHealth_tvb, 0, 1, 1,
"Satellite is in failure or permanently shut off (1)");
ENC_BIG_ENDIAN, "Satellite is in failure or permanently shut off (1)");
} else if (bits == 0x100) {
proto_tree_add_boolean_bits_format_value(subtree, hf_lpp_bdsSvHealth_r12_sat_clock, bdsSvHealth_tvb, 0, 1, 1,
"Satellite clock is unavailable (1)");
ENC_BIG_ENDIAN, "Satellite clock is unavailable (1)");
} else {
proto_tree_add_bits_item(subtree, hf_lpp_bdsSvHealth_r12_sat_clock, bdsSvHealth_tvb, 0, 1, ENC_BIG_ENDIAN);
proto_tree_add_bits_item(subtree, hf_lpp_bdsSvHealth_r12_b1i, bdsSvHealth_tvb, 1, 1, ENC_BIG_ENDIAN);

View File

@ -1331,10 +1331,10 @@ DEBUG_ENTRY("dissect_per_constrained_integer");
val_start = (offset)>>3;
val_length = length;
val = (guint32)tvb_get_bits64(tvb,offset,num_bits, ENC_BIG_ENDIAN);
val = (guint32)tvb_get_bits64(tvb,offset,num_bits,ENC_BIG_ENDIAN);
if (display_internal_per_fields){
str = decode_bits_in_field((offset&0x07),num_bits,val);
str = decode_bits_in_field((offset&0x07),num_bits,val,ENC_BIG_ENDIAN);
proto_tree_add_uint(tree, hf_per_internal_min, tvb, val_start,val_length, min);
proto_tree_add_uint64(tree, hf_per_internal_range, tvb, val_start, val_length, range);
proto_tree_add_uint(tree, hf_per_internal_num_bits, tvb, val_start, val_length, num_bits);
@ -2134,7 +2134,7 @@ static tvbuff_t *dissect_per_bit_string_display(tvbuff_t *tvb, guint32 offset, a
value = tvb_get_bits64(out_tvb, 0, length, ENC_BIG_ENDIAN);
}
proto_item_append_text(actx->created_item, ", %s decimal value %" G_GINT64_MODIFIER "u",
decode_bits_in_field(0, length, value), value);
decode_bits_in_field(0, length, value, ENC_BIG_ENDIAN), value);
if (named_bits) {
const guint32 named_bits_bytelen = (num_named_bits + 7) / 8;
proto_tree *subtree = proto_item_add_subtree(actx->created_item, ett_per_named_bits);

View File

@ -6752,7 +6752,7 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
tcph->th_hlen, TCPH_MIN_LEN);
if (tree) {
tf = proto_tree_add_uint_bits_format_value(tcp_tree, hf_tcp_hdr_len, tvb, (offset + 12) << 3, 4, tcph->th_hlen,
"%u bytes (%u)", tcph->th_hlen, tcph->th_hlen >> 2);
ENC_BIG_ENDIAN, "%u bytes (%u)", tcph->th_hlen, tcph->th_hlen >> 2);
expert_add_info_format(pinfo, tf, &ei_tcp_bogus_header_length,
"Bogus TCP header length (%u, must be at least %u)", tcph->th_hlen, TCPH_MIN_LEN);
}
@ -6851,7 +6851,7 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
if (tree) {
// This should be consistent with ip.hdr_len.
proto_tree_add_uint_bits_format_value(tcp_tree, hf_tcp_hdr_len, tvb, (offset + 12) << 3, 4, tcph->th_hlen,
"%u bytes (%u)", tcph->th_hlen, tcph->th_hlen>>2);
ENC_BIG_ENDIAN, "%u bytes (%u)", tcph->th_hlen, tcph->th_hlen>>2);
tf = proto_tree_add_uint_format(tcp_tree, hf_tcp_flags, tvb, offset + 12, 2,
tcph->th_flags, "Flags: 0x%03x (%s)", tcph->th_flags, flags_str);
field_tree = proto_item_add_subtree(tf, ett_tcp_flags);

View File

@ -5016,41 +5016,15 @@ dissect_usb_hid_control_class_intf(tvbuff_t *tvb, packet_info *pinfo,
/* unpack a HID logical report field */
static int hid_unpack_logical(tvbuff_t *tvb, int bit_offset, guint32 size, gint32 min, gint32 *val)
{
size_t bytes_length;
guint8 *bytes = tvb_get_bits_array(NULL, tvb, bit_offset, size, &bytes_length);
if (size > 32)
return -1;
switch (size / 8)
{
case 0:
case 1:
*val = bytes[0];
break;
case 2:
*val = pletoh16(bytes);
break;
case 3:
*val = pletoh24(bytes);
break;
case 4:
*val = pletoh32(bytes);
break;
default:
goto err;
}
*val = tvb_get_bits32(tvb, bit_offset, size, ENC_LITTLE_ENDIAN);
if (min < 0)
*val = ws_sign_ext32(*val, size);
wmem_free(NULL, bytes);
return 0;
err:
wmem_free(NULL, bytes);
return -1;
}
static gint
@ -5062,7 +5036,7 @@ dissect_usb_hid_int_dynamic_value_variable(tvbuff_t *tvb, proto_tree *tree, hid_
if (hid_unpack_logical(tvb, bit_offset, field->report_size, field->logical_min, &val))
return -1;
proto_tree_add_int_bits_format_value(tree, hf, tvb, bit_offset, field->report_size, val, "%d", val);
proto_tree_add_int_bits_format_value(tree, hf, tvb, bit_offset, field->report_size, val, ENC_LITTLE_ENDIAN, "%d", val);
return 0;
}
@ -5155,7 +5129,7 @@ dissect_usb_hid_keyboard_page(tvbuff_t *tvb, packet_info _U_ *pinfo,
DISSECTOR_ASSERT(USAGE_PAGE(usage) == KEYBOARD_KEYPAD_PAGE);
usage = USAGE_ID(usage);
proto_tree_add_boolean_bits_format_value(tree, hf_usbhid_key, tvb, bit_offset, field->report_size, val,
proto_tree_add_boolean_bits_format_value(tree, hf_usbhid_key, tvb, bit_offset, field->report_size, val, ENC_LITTLE_ENDIAN,
"%s (0x%02x) = %s", val_to_str_ext(usage, &keycode_vals_ext, "Unknown"), usage, val ? "DOWN" : "UP");
return 0;
}
@ -5174,7 +5148,7 @@ dissect_usb_hid_button_page(tvbuff_t *tvb, packet_info _U_ *pinfo,
if (hid_unpack_logical(tvb, bit_offset, field->report_size, field->logical_min, &val))
return -1;
ti = proto_tree_add_boolean_bits_format_value(tree, hf_usbhid_button, tvb, bit_offset, field->report_size, val, "%u", usage);
ti = proto_tree_add_boolean_bits_format_value(tree, hf_usbhid_button, tvb, bit_offset, field->report_size, val, ENC_LITTLE_ENDIAN, "%u", usage);
if (usage == 0)
proto_item_append_text(ti, " (No button pressed)");
@ -5197,7 +5171,7 @@ dissect_hid_variable(tvbuff_t* tvb, packet_info _U_* pinfo, proto_tree* tree, hi
/* vendor data (0xff00 - 0xffff) */
if ((USAGE_PAGE(usage) & 0xff00) == 0xff00) {
proto_tree_add_bits_item(tree, hf_usbhid_vendor_data, tvb, bit_offset, field->report_size, ENC_NA);
proto_tree_add_bits_item(tree, hf_usbhid_vendor_data, tvb, bit_offset, field->report_size, ENC_LITTLE_ENDIAN);
return;
}
@ -5222,7 +5196,7 @@ dissect_hid_variable(tvbuff_t* tvb, packet_info _U_* pinfo, proto_tree* tree, hi
if (ret) {
proto_tree_add_uint_bits_format_value(tree, hf_usb_hid_localitem_usage, tvb, bit_offset, field->report_size,
usage, "%s", get_usage_page_item_string(pinfo->pool, USAGE_PAGE(usage), USAGE_ID(usage)));
usage, ENC_LITTLE_ENDIAN, "%s", get_usage_page_item_string(pinfo->pool, USAGE_PAGE(usage), USAGE_ID(usage)));
}
}
@ -5248,7 +5222,7 @@ dissect_hid_field(tvbuff_t *tvb, packet_info _U_ *pinfo, proto_tree *tree, hid_f
proto_tree *array_tree;
array_ti = proto_tree_add_bits_item(tree, hf_usbhid_array, tvb, bit_offset,
field->report_size * field->report_count, ENC_NA);
field->report_size * field->report_count, ENC_LITTLE_ENDIAN);
array_tree = proto_item_add_subtree(array_ti, ett_usb_hid_array);
for(unsigned int j = 0; j < field->report_count; j++) {
@ -5261,11 +5235,11 @@ dissect_hid_field(tvbuff_t *tvb, packet_info _U_ *pinfo, proto_tree *tree, hid_f
}
if (in_range) {
proto_tree_add_boolean_bits_format_value(array_tree, hf_usbhid_array_usage, tvb, bit_offset, field->report_size,
val, "%s (0x%04x, 0x%04x)", get_usage_page_item_string(pinfo->pool, USAGE_PAGE(val), USAGE_ID(val)),
val, ENC_LITTLE_ENDIAN, "%s (0x%04x, 0x%04x)", get_usage_page_item_string(pinfo->pool, USAGE_PAGE(val), USAGE_ID(val)),
USAGE_PAGE(val), USAGE_ID(val));
} else {
proto_tree_add_boolean_bits_format_value(array_tree, hf_usbhid_array_usage, tvb, bit_offset, field->report_size,
val, "No controls asserted");
val, ENC_LITTLE_ENDIAN, "No controls asserted");
}
bit_offset += field->report_size;
}
@ -5282,7 +5256,7 @@ dissect_hid_field(tvbuff_t *tvb, packet_info _U_ *pinfo, proto_tree *tree, hid_f
}
if (field->report_count > count) {
gint remaining_bits = (field->report_count - count) * field->report_size;
proto_tree_add_bits_item(tree, hf_usbhid_padding, tvb, bit_offset, remaining_bits, ENC_NA);
proto_tree_add_bits_item(tree, hf_usbhid_padding, tvb, bit_offset, remaining_bits, ENC_LITTLE_ENDIAN);
bit_offset += remaining_bits;
}
}
@ -5330,7 +5304,7 @@ dissect_usb_hid_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *
/* if the item has no usages, it is padding - HID spec 6.2.2.9 */
if (wmem_array_get_count(field->usages) == 0) {
proto_tree_add_bits_item(hid_tree, hf_usbhid_padding, tvb, hid_bit_offset, data_size, ENC_NA);
proto_tree_add_bits_item(hid_tree, hf_usbhid_padding, tvb, hid_bit_offset, data_size, ENC_LITTLE_ENDIAN);
hid_bit_offset += data_size;
continue;
}

View File

@ -162,7 +162,7 @@ dissect_wsmp_psid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int o
proto_tree_add_bits_item(tree, hf_wsmp_var_len_det, tvb, offset << 3, psidLen, ENC_NA);
proto_tree_add_uint_bits_format_value(tree, hf_wsmp_psid, tvb, (offset << 3) + psidLen,
(psidLen << 3) - psidLen,*psid,"%s(%u)", val64_to_str_const(*psid, ieee1609dot2_Psid_vals, "Unknown"), *psid);
(psidLen << 3) - psidLen,*psid,ENC_BIG_ENDIAN,"%s(%u)", val64_to_str_const(*psid, ieee1609dot2_Psid_vals, "Unknown"), *psid);
offset += psidLen;
return offset;

View File

@ -12272,7 +12272,7 @@ _proto_tree_add_bits_ret_val(proto_tree *tree, const int hfindex, tvbuff_t *tvb,
CHECK_FOR_NULL_TREE(tree);
TRY_TO_FAKE_THIS_ITEM(tree, hfindex, hf_field);
bf_str = decode_bits_in_field(bit_offset, no_of_bits, value);
bf_str = decode_bits_in_field(bit_offset, no_of_bits, value, encoding);
switch (hf_field->type) {
case FT_BOOLEAN:
@ -12323,7 +12323,7 @@ _proto_tree_add_bits_ret_val(proto_tree *tree, const int hfindex, tvbuff_t *tvb,
break;
case FT_BYTES:
bytes = tvb_get_bits_array(PNODE_POOL(tree), tvb, bit_offset, no_of_bits, &bytes_length);
bytes = tvb_get_bits_array(PNODE_POOL(tree), tvb, bit_offset, no_of_bits, &bytes_length, encoding);
pi = proto_tree_add_bytes_with_length(tree, hfindex, tvb, offset, length, bytes, (gint) bytes_length);
proto_item_fill_label(PITEM_FINFO(pi), lbl_str);
proto_item_set_text(pi, "%s", lbl_str);
@ -12541,7 +12541,8 @@ proto_tree_add_split_bits_crumb(proto_tree *tree, const int hfindex, tvbuff_t *t
tvb_get_bits(tvb,
bit_offset,
crumb_spec[crumb_index].crumb_bit_length,
ENC_BIG_ENDIAN)),
ENC_BIG_ENDIAN),
ENC_BIG_ENDIAN),
crumb_index,
hfinfo->name);
}
@ -12566,7 +12567,7 @@ static proto_item *
_proto_tree_add_bits_format_value(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, void *value_ptr,
gchar *value_str)
const guint encoding, gchar *value_str)
{
gint offset;
guint length;
@ -12603,14 +12604,14 @@ _proto_tree_add_bits_format_value(proto_tree *tree, const int hfindex,
length++;
if (no_of_bits < 65) {
value = tvb_get_bits64(tvb, bit_offset, no_of_bits, ENC_BIG_ENDIAN);
value = tvb_get_bits64(tvb, bit_offset, no_of_bits, encoding);
} else {
REPORT_DISSECTOR_BUG("field %s passed to proto_tree_add_bits_format_value() has a bit width of %u > 65",
hf_field->abbrev, no_of_bits);
return NULL;
}
str = decode_bits_in_field(bit_offset, no_of_bits, value);
str = decode_bits_in_field(bit_offset, no_of_bits, value, encoding);
(void) g_strlcat(str, " = ", 256+64);
(void) g_strlcat(str, hf_field->name, 256+64);
@ -12680,13 +12681,13 @@ static proto_item *
proto_tree_add_bits_format_value(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, void *value_ptr,
gchar *value_str)
const guint encoding, gchar *value_str)
{
proto_item *item;
if ((item = _proto_tree_add_bits_format_value(tree, hfindex,
tvb, bit_offset, no_of_bits,
value_ptr, value_str))) {
value_ptr, encoding, value_str))) {
FI_SET_FLAG(PNODE_FINFO(item), FI_BITS_OFFSET(bit_offset));
FI_SET_FLAG(PNODE_FINFO(item), FI_BITS_SIZE(no_of_bits));
}
@ -12702,6 +12703,7 @@ proto_item *
proto_tree_add_uint_bits_format_value(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, guint32 value,
const guint encoding,
const char *format, ...)
{
va_list ap;
@ -12728,13 +12730,14 @@ proto_tree_add_uint_bits_format_value(proto_tree *tree, const int hfindex,
CREATE_VALUE_STRING(tree, dst, format, ap);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, dst);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, encoding, dst);
}
proto_item *
proto_tree_add_uint64_bits_format_value(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, guint64 value,
const guint encoding,
const char *format, ...)
{
va_list ap;
@ -12761,13 +12764,14 @@ proto_tree_add_uint64_bits_format_value(proto_tree *tree, const int hfindex,
CREATE_VALUE_STRING(tree, dst, format, ap);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, dst);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, encoding, dst);
}
proto_item *
proto_tree_add_float_bits_format_value(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, float value,
const guint encoding,
const char *format, ...)
{
va_list ap;
@ -12782,13 +12786,14 @@ proto_tree_add_float_bits_format_value(proto_tree *tree, const int hfindex,
CREATE_VALUE_STRING(tree, dst, format, ap);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, dst);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, encoding, dst);
}
proto_item *
proto_tree_add_int_bits_format_value(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, gint32 value,
const guint encoding,
const char *format, ...)
{
va_list ap;
@ -12815,13 +12820,14 @@ proto_tree_add_int_bits_format_value(proto_tree *tree, const int hfindex,
CREATE_VALUE_STRING(tree, dst, format, ap);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, dst);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, encoding, dst);
}
proto_item *
proto_tree_add_int64_bits_format_value(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, gint64 value,
const guint encoding,
const char *format, ...)
{
va_list ap;
@ -12848,13 +12854,14 @@ proto_tree_add_int64_bits_format_value(proto_tree *tree, const int hfindex,
CREATE_VALUE_STRING(tree, dst, format, ap);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, dst);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, encoding, dst);
}
proto_item *
proto_tree_add_boolean_bits_format_value(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, guint32 value,
const guint encoding,
const char *format, ...)
{
va_list ap;
@ -12869,13 +12876,14 @@ proto_tree_add_boolean_bits_format_value(proto_tree *tree, const int hfindex,
CREATE_VALUE_STRING(tree, dst, format, ap);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, dst);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, encoding, dst);
}
proto_item *
proto_tree_add_boolean_bits_format_value64(proto_tree *tree, const int hfindex,
tvbuff_t *tvb, const guint bit_offset,
const gint no_of_bits, guint64 value,
const guint encoding,
const char *format, ...)
{
va_list ap;
@ -12890,7 +12898,7 @@ proto_tree_add_boolean_bits_format_value64(proto_tree *tree, const int hfindex,
CREATE_VALUE_STRING(tree, dst, format, ap);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, dst);
return proto_tree_add_bits_format_value(tree, hfindex, tvb, bit_offset, no_of_bits, &value, encoding, dst);
}
proto_item *

View File

@ -3112,12 +3112,14 @@ proto_tree_add_bits_ret_val(proto_tree *tree, const int hf_index, tvbuff_t *tvb,
@param bit_offset start of data in tvb expressed in bits
@param no_of_bits length of data in tvb expressed in bit
@param value data to display
@param encoding data encoding
@param format printf like format string
@return the newly created item */
WS_DLL_PUBLIC proto_item *
proto_tree_add_uint_bits_format_value(proto_tree *tree, const int hf_index, tvbuff_t *tvb,
const guint bit_offset, const gint no_of_bits, guint32 value, const char *format, ...)
G_GNUC_PRINTF(7,8);
const guint bit_offset, const gint no_of_bits, guint32 value, const guint encoding,
const char *format, ...)
G_GNUC_PRINTF(8,9);
/** Add bits for a FT_UINT8, FT_UINT16, FT_UINT24 or FT_UINT32
header field to a proto_tree, with the format generating the
@ -3128,12 +3130,14 @@ proto_tree_add_uint_bits_format_value(proto_tree *tree, const int hf_index, tvbu
@param bit_offset start of data in tvb expressed in bits
@param no_of_bits length of data in tvb expressed in bit
@param value data to display
@param encoding data encoding
@param format printf like format string
@return the newly created item */
WS_DLL_PUBLIC proto_item *
proto_tree_add_uint64_bits_format_value(proto_tree *tree, const int hf_index, tvbuff_t *tvb,
const guint bit_offset, const gint no_of_bits, guint64 value, const char *format, ...)
G_GNUC_PRINTF(7,8);
const guint bit_offset, const gint no_of_bits, guint64 value, const guint encoding,
const char *format, ...)
G_GNUC_PRINTF(8,9);
/** Add bits for a FT_BOOLEAN header field to a proto_tree, with
the format generating the string for the value and with the field
@ -3144,13 +3148,15 @@ proto_tree_add_uint64_bits_format_value(proto_tree *tree, const int hf_index, tv
@param bit_offset start of data in tvb expressed in bits
@param no_of_bits length of data in tvb expressed in bit
@param value data to display
@param encoding data encoding
@param format printf like format string
@param ... printf like parameters
@return the newly created item */
proto_item *
proto_tree_add_boolean_bits_format_value(proto_tree *tree, const int hf_index, tvbuff_t *tvb,
const guint bit_offset, const gint no_of_bits, guint32 value, const char *format, ...)
G_GNUC_PRINTF(7,8);
const guint bit_offset, const gint no_of_bits, guint32 value, const guint encoding,
const char *format, ...)
G_GNUC_PRINTF(8,9);
/** Add bits for a FT_BOOLEAN header field to a proto_tree, with
the format generating the string for the value and with the field
@ -3161,13 +3167,15 @@ proto_tree_add_boolean_bits_format_value(proto_tree *tree, const int hf_index, t
@param bit_offset start of data in tvb expressed in bits
@param no_of_bits length of data in tvb expressed in bit
@param value data to display
@param encoding data encoding
@param format printf like format string
@param ... printf like parameters
@return the newly created item */
proto_item *
proto_tree_add_boolean_bits_format_value64(proto_tree *tree, const int hf_index, tvbuff_t *tvb,
const guint bit_offset, const gint no_of_bits, guint64 value, const char *format, ...)
G_GNUC_PRINTF(7,8);
const guint bit_offset, const gint no_of_bits, guint64 value, const guint encoding,
const char *format, ...)
G_GNUC_PRINTF(8,9);
/** Add bits for a FT_INT8, FT_INT16, FT_INT24 or FT_INT32
header field to a proto_tree, with the format generating the
@ -3178,13 +3186,15 @@ proto_tree_add_boolean_bits_format_value64(proto_tree *tree, const int hf_index,
@param bit_offset start of data in tvb expressed in bits
@param no_of_bits length of data in tvb expressed in bit
@param value data to display
@param encoding data encoding
@param format printf like format string
@param ... printf like parameters
@return the newly created item */
proto_item *
proto_tree_add_int_bits_format_value(proto_tree *tree, const int hf_index, tvbuff_t *tvb,
const guint bit_offset, const gint no_of_bits, gint32 value, const char *format, ...)
G_GNUC_PRINTF(7,8);
const guint bit_offset, const gint no_of_bits, gint32 value, const guint encoding,
const char *format, ...)
G_GNUC_PRINTF(8,9);
/** Add bits for a FT_INT8, FT_INT16, FT_INT24 or FT_INT32
header field to a proto_tree, with the format generating the
@ -3195,13 +3205,15 @@ proto_tree_add_int_bits_format_value(proto_tree *tree, const int hf_index, tvbuf
@param bit_offset start of data in tvb expressed in bits
@param no_of_bits length of data in tvb expressed in bit
@param value data to display
@param encoding data encoding
@param format printf like format string
@param ... printf like parameters
@return the newly created item */
proto_item *
proto_tree_add_int64_bits_format_value(proto_tree *tree, const int hf_index, tvbuff_t *tvb,
const guint bit_offset, const gint no_of_bits, gint64 value, const char *format, ...)
G_GNUC_PRINTF(7,8);
const guint bit_offset, const gint no_of_bits, gint64 value, const guint encoding,
const char *format, ...)
G_GNUC_PRINTF(8,9);
/** Add bits for a FT_FLOAT header field to a proto_tree, with
the format generating the string for the value and with the field
@ -3212,13 +3224,15 @@ proto_tree_add_int64_bits_format_value(proto_tree *tree, const int hf_index, tvb
@param bit_offset start of data in tvb expressed in bits
@param no_of_bits length of data in tvb expressed in bit
@param value data to display
@param encoding data encoding
@param format printf like format string
@param ... printf like parameters
@return the newly created item */
proto_item *
proto_tree_add_float_bits_format_value(proto_tree *tree, const int hf_index, tvbuff_t *tvb,
const guint bit_offset, const gint no_of_bits, float value, const char *format, ...)
G_GNUC_PRINTF(7,8);
const guint bit_offset, const gint no_of_bits, float value, const guint encoding,
const char *format, ...)
G_GNUC_PRINTF(8,9);
/** Add a FT_STRING with ENC_3GPP_TS_23_038_7BITS_PACKED encoding to a

View File

@ -645,19 +645,30 @@ rel_time_to_secs_str(wmem_allocator_t *scope, const nstime_t *rel_time)
*/
char *
decode_bits_in_field(const guint bit_offset, const gint no_of_bits, const guint64 value)
decode_bits_in_field(const guint bit_offset, const gint no_of_bits, const guint64 value, const guint encoding)
{
guint64 mask;
char *str;
int bit, str_p = 0;
int i;
int max_bits = MIN(64, no_of_bits);
int no_leading_dots;
mask = G_GUINT64_CONSTANT(1) << (max_bits-1);
if(encoding & ENC_LITTLE_ENDIAN){
/* Bits within octet are numbered from LSB (0) to MSB (7).
* The value in string is from most significant bit to lowest.
* Calculate how many dots have to be printed at the beginning of string.
*/
no_leading_dots = (8 - ((bit_offset + no_of_bits) % 8)) % 8;
} else {
no_leading_dots = bit_offset % 8;
}
/* Prepare the string, 256 pos for the bits and zero termination, + 64 for the spaces */
str=(char *)wmem_alloc0(wmem_packet_scope(), 256+64);
for(bit=0;bit<((int)(bit_offset&0x07));bit++){
for(bit=0;bit<no_leading_dots;bit++){
if(bit&&(!(bit%4))){
str[str_p] = ' ';
str_p++;

View File

@ -149,7 +149,7 @@ WS_DLL_PUBLIC gchar *guid_to_str_buf(const e_guid_t *, gchar *, int);
WS_DLL_PUBLIC gchar *guid_to_str(wmem_allocator_t *scope, const e_guid_t *);
WS_DLL_PUBLIC char *decode_bits_in_field(const guint bit_offset, const gint no_of_bits, const guint64 value);
WS_DLL_PUBLIC char *decode_bits_in_field(const guint bit_offset, const gint no_of_bits, const guint64 value, const guint encoding);
#ifdef __cplusplus
}

View File

@ -56,6 +56,9 @@
static guint64
_tvb_get_bits64(tvbuff_t *tvb, guint bit_offset, const gint total_no_of_bits);
static guint64
_tvb_get_bits64_le(tvbuff_t *tvb, guint bit_offset, const gint total_no_of_bits);
static inline gint
_tvb_captured_length_remaining(const tvbuff_t *tvb, const gint offset);
@ -434,6 +437,72 @@ tvb_new_octet_aligned(tvbuff_t *tvb, guint32 bit_offset, gint32 no_of_bits)
return sub_tvb;
}
tvbuff_t *
tvb_new_octet_right_aligned(tvbuff_t *tvb, guint32 bit_offset, gint32 no_of_bits)
{
tvbuff_t *sub_tvb = NULL;
guint32 byte_offset;
gint src_len, dst_len, i;
guint8 left, right, remaining_bits, *buf;
const guint8 *data;
DISSECTOR_ASSERT(tvb && tvb->initialized);
byte_offset = bit_offset / 8;
/* right shift to put bits in place and discard least significant bits */
right = bit_offset % 8;
/* left shift to get most significant bits from next octet */
left = 8 - right;
if (no_of_bits == -1) {
dst_len = _tvb_captured_length_remaining(tvb, byte_offset);
remaining_bits = 0;
} else {
dst_len = no_of_bits / 8;
remaining_bits = no_of_bits % 8;
if (remaining_bits) {
dst_len++;
}
}
/* already aligned -> shortcut */
if ((right == 0) && (remaining_bits == 0)) {
return tvb_new_subset_length_caplen(tvb, byte_offset, dst_len, dst_len);
}
DISSECTOR_ASSERT(dst_len>0);
if (_tvb_captured_length_remaining(tvb, byte_offset) > dst_len) {
/* last octet will get data from trailing octet */
src_len = dst_len + 1;
} else {
/* last octet will be zero padded */
src_len = dst_len;
}
data = ensure_contiguous(tvb, byte_offset, src_len); /* tvb_get_ptr */
/* Do this allocation AFTER tvb_get_ptr() (which could throw an exception) */
buf = (guint8 *)g_malloc(dst_len);
for (i = 0; i < (dst_len - 1); i++)
buf[i] = (data[i] >> right) | (data[i+1] << left);
/* Special handling for last octet */
buf[i] = (data[i] >> right);
/* Shift most significant bits from trailing octet if available */
if (src_len > dst_len)
buf[i] |= (data[i+1] << left);
/* Preserve only remaining bits in last octet if not multiple of 8 */
if (remaining_bits)
buf[i] &= ((1 << remaining_bits) - 1);
sub_tvb = tvb_new_child_real_data(tvb, buf, dst_len, dst_len);
tvb_set_free_cb(sub_tvb, g_free);
return sub_tvb;
}
static tvbuff_t *
tvb_generic_clone_offset_len(tvbuff_t *tvb, guint offset, guint len)
{
@ -2007,12 +2076,20 @@ static const guint8 bit_mask8[] = {
/* Get a variable ammount of bits
*
* Return a byte array with bit limited data. The data is aligned to the right.
* Return a byte array with bit limited data.
* When encoding is ENC_BIG_ENDIAN, the data is aligned to the left.
* When encoding is ENC_LITTLE_ENDIAN, the data is aligned to the right.
*/
guint8 *
tvb_get_bits_array(wmem_allocator_t *scope, tvbuff_t *tvb, const gint bit_offset, size_t no_of_bits, size_t *data_length)
tvb_get_bits_array(wmem_allocator_t *scope, tvbuff_t *tvb, const gint bit_offset,
size_t no_of_bits, size_t *data_length, const guint encoding)
{
tvbuff_t *sub_tvb = tvb_new_octet_aligned(tvb, bit_offset, (gint32) no_of_bits);
tvbuff_t *sub_tvb;
if (encoding & ENC_LITTLE_ENDIAN) {
sub_tvb = tvb_new_octet_right_aligned(tvb, bit_offset, (gint32) no_of_bits);
} else {
sub_tvb = tvb_new_octet_aligned(tvb, bit_offset, (gint32) no_of_bits);
}
*data_length = tvb_reported_length(sub_tvb);
return (guint8*)tvb_memdup(scope, sub_tvb, 0, *data_length);
}
@ -2024,33 +2101,37 @@ tvb_get_bits8(tvbuff_t *tvb, guint bit_offset, const gint no_of_bits)
return (guint8)_tvb_get_bits64(tvb, bit_offset, no_of_bits);
}
/* Get 9 - 16 bits */
/* Get 1 - 16 bits */
guint16
tvb_get_bits16(tvbuff_t *tvb, guint bit_offset, const gint no_of_bits,const guint encoding _U_)
tvb_get_bits16(tvbuff_t *tvb, guint bit_offset, const gint no_of_bits, const guint encoding)
{
/* note that encoding has no meaning here, as the tvb is considered to contain an octet array */
return (guint16)_tvb_get_bits64(tvb, bit_offset, no_of_bits);
return (guint16)tvb_get_bits64(tvb, bit_offset, no_of_bits, encoding);
}
/* Get 1 - 32 bits */
guint32
tvb_get_bits32(tvbuff_t *tvb, guint bit_offset, const gint no_of_bits, const guint encoding _U_)
tvb_get_bits32(tvbuff_t *tvb, guint bit_offset, const gint no_of_bits, const guint encoding)
{
/* note that encoding has no meaning here, as the tvb is considered to contain an octet array */
return (guint32)_tvb_get_bits64(tvb, bit_offset, no_of_bits);
return (guint32)tvb_get_bits64(tvb, bit_offset, no_of_bits, encoding);
}
/* Get 1 - 64 bits */
guint64
tvb_get_bits64(tvbuff_t *tvb, guint bit_offset, const gint no_of_bits, const guint encoding _U_)
tvb_get_bits64(tvbuff_t *tvb, guint bit_offset, const gint no_of_bits, const guint encoding)
{
/* note that encoding has no meaning here, as the tvb is considered to contain an octet array */
return _tvb_get_bits64(tvb, bit_offset, no_of_bits);
/* encoding determines bit numbering within octet array */
if (encoding & ENC_LITTLE_ENDIAN) {
return _tvb_get_bits64_le(tvb, bit_offset, no_of_bits);
} else {
return _tvb_get_bits64(tvb, bit_offset, no_of_bits);
}
}
/*
* This function will dissect a sequence of bits that does not need to be byte aligned; the bits
* set will be shown in the tree as ..10 10.. and the integer value returned if return_value is set.
* Offset should be given in bits from the start of the tvb.
* Bits within octet are numbered from MSB (0) to LSB (7). Bit at bit_offset is return value most significant bit.
* The function tolerates requests for more than 64 bits, but will only return the least significant 64 bits.
*/
static guint64
@ -2126,12 +2207,84 @@ _tvb_get_bits64(tvbuff_t *tvb, guint bit_offset, const gint total_no_of_bits)
}
return value;
}
/*
* Offset should be given in bits from the start of the tvb.
* Bits within octet are numbered from LSB (0) to MSB (7). Bit at bit_offset is return value least significant bit.
* The function tolerates requests for more than 64 bits, but will only return the least significant 64 bits.
*/
static guint64
_tvb_get_bits64_le(tvbuff_t *tvb, guint bit_offset, const gint total_no_of_bits)
{
guint64 value = 0;
guint octet_offset = bit_offset / 8;
gint remaining_bits = total_no_of_bits;
gint shift = 0;
if (remaining_bits > 64)
{
remaining_bits = 64;
}
if (bit_offset % 8)
{
/* not aligned, extract bits from first octet */
shift = 8 - (bit_offset % 8);
value = tvb_get_guint8(tvb, octet_offset) >> (bit_offset % 8);
if (shift > total_no_of_bits)
{
/* keep only the requested bits */
value &= (G_GUINT64_CONSTANT(1) << total_no_of_bits) - 1;
remaining_bits = 0;
}
else
{
remaining_bits = total_no_of_bits - shift;
}
octet_offset++;
}
while (remaining_bits > 0)
{
/* take the biggest words, shorts or octets that we can */
if (remaining_bits >= 32)
{
value |= ((guint64)tvb_get_letohl(tvb, octet_offset) << shift);
shift += 32;
remaining_bits -= 32;
octet_offset += 4;
}
else if (remaining_bits >= 16)
{
value |= ((guint64)tvb_get_letohs(tvb, octet_offset) << shift);
shift += 16;
remaining_bits -= 16;
octet_offset += 2;
}
else if (remaining_bits >= 8)
{
value |= ((guint64)tvb_get_guint8(tvb, octet_offset) << shift);
shift += 8;
remaining_bits -= 8;
octet_offset += 1;
}
else
{
guint mask = (1 << remaining_bits) - 1;
value |= (((guint64)tvb_get_guint8(tvb, octet_offset) & mask) << shift);
shift += remaining_bits;
remaining_bits = 0;
octet_offset += 1;
}
}
return value;
}
/* Get 1 - 32 bits (should be deprecated as same as tvb_get_bits32??) */
guint32
tvb_get_bits(tvbuff_t *tvb, const guint bit_offset, const gint no_of_bits, const guint encoding _U_)
tvb_get_bits(tvbuff_t *tvb, const guint bit_offset, const gint no_of_bits, const guint encoding)
{
/* note that encoding has no meaning here, as the tvb is considered to contain an octet array */
return (guint32)_tvb_get_bits64(tvb, bit_offset, no_of_bits);
return (guint32)tvb_get_bits64(tvb, bit_offset, no_of_bits, encoding);
}
static gint

View File

@ -104,10 +104,17 @@ typedef void (*tvbuff_free_cb_t)(void*);
/** Extracts 'number of bits' starting at 'bit offset'.
* Returns a pointer to a newly initialized g_malloc'd REAL_DATA
* tvbuff with the bits octet aligned.
* Bits are counted from MSB (0) to LSB (7) within octets.
*/
WS_DLL_PUBLIC tvbuff_t *tvb_new_octet_aligned(tvbuff_t *tvb,
guint32 bit_offset, gint32 no_of_bits);
/** Extracts 'number of bits' starting at 'bit offset'.
* Bits are counted from LSB (0) to MSB (7) within octets.
*/
WS_DLL_PUBLIC tvbuff_t *tvb_new_octet_right_aligned(tvbuff_t *tvb,
guint32 bit_offset, gint32 no_of_bits);
WS_DLL_PUBLIC tvbuff_t *tvb_new_chain(tvbuff_t *parent, tvbuff_t *backing);
WS_DLL_PUBLIC tvbuff_t *tvb_clone(tvbuff_t *tvb);
@ -414,7 +421,7 @@ WS_DLL_PUBLIC void tvb_get_guid(tvbuff_t *tvb, const gint offset,
/* Fetches a byte array given a bit offset in a tvb */
WS_DLL_PUBLIC guint8* tvb_get_bits_array(wmem_allocator_t *scope, tvbuff_t *tvb,
const gint offset, size_t length, size_t *data_length);
const gint offset, size_t length, size_t *data_length, const guint encoding);
/* Fetch a specified number of bits from bit offset in a tvb. All of these
* functions are equivalent, except for the type of the return value. Note

View File

@ -608,7 +608,7 @@ sub check_proto_tree_add_XXX($$)
#Check for accidental usage of ENC_ parameter
if ($args =~ /,\s*ENC_/xos) {
if (!($func =~ /proto_tree_add_(time|item|bitmask|bits_item|bits_ret_val|item_ret_int|item_ret_uint|bytes_item|checksum)/xos)
if (!($func =~ /proto_tree_add_(time|item|bitmask|[a-z0-9]+_bits_format_value|bits_item|bits_ret_val|item_ret_int|item_ret_uint|bytes_item|checksum)/xos)
) {
print STDERR "Error: ".$filename." uses $func with ENC_*.\n";
$errorCount++;