aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-mac-lte.c
diff options
context:
space:
mode:
authorMartin Mathieson <martin.mathieson@keysight.com>2020-04-16 17:48:16 +0100
committerMartin Mathieson <martin.r.mathieson@googlemail.com>2020-04-17 18:09:13 +0000
commitf0e834dfe862b0c78cdf52d687d18af1c2dda738 (patch)
tree4e54c3cbdf816b196e9f94e666a5eca5d025fa1e /epan/dissectors/packet-mac-lte.c
parent3a1a64eea2dea2047d334f1875fe1f242e0ca40d (diff)
MAC-LTE: Use heuristic for length for DC PHR CE
Knowing how many bytes of C bits (1 or 4) relies upon knowing config that is not currently available to the dissector. Instead, see if the length appears to match 1 byte, otherwise assume 4. Change-Id: I08f21ab23077ef3665d3fb78a1dc2db0b16bc481 Reviewed-on: https://code.wireshark.org/review/36859 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Martin Mathieson <martin.r.mathieson@googlemail.com>
Diffstat (limited to 'epan/dissectors/packet-mac-lte.c')
-rw-r--r--epan/dissectors/packet-mac-lte.c321
1 files changed, 315 insertions, 6 deletions
diff --git a/epan/dissectors/packet-mac-lte.c b/epan/dissectors/packet-mac-lte.c
index 9eb4cb05f2..daa05ec2a3 100644
--- a/epan/dissectors/packet-mac-lte.c
+++ b/epan/dissectors/packet-mac-lte.c
@@ -237,6 +237,31 @@ static int hf_mac_lte_control_dual_conn_power_headroom_c4 = -1;
static int hf_mac_lte_control_dual_conn_power_headroom_c3 = -1;
static int hf_mac_lte_control_dual_conn_power_headroom_c2 = -1;
static int hf_mac_lte_control_dual_conn_power_headroom_c1 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c15 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c14 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c13 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c12 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c11 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c10 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c9 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c8 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c23 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c22 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c21 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c20 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c19 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c18 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c17 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c16 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c31 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c30 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c29 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c28 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c27 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c26 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c25 = -1;
+static int hf_mac_lte_control_dual_conn_power_headroom_c24 = -1;
+
static int hf_mac_lte_control_dual_conn_power_headroom_reserved = -1;
static int hf_mac_lte_control_dual_conn_power_headroom_power_backoff = -1;
static int hf_mac_lte_control_dual_conn_power_headroom_value = -1;
@@ -4341,6 +4366,65 @@ static void lookup_rlc_channel_from_lcid(guint16 ueid,
}
+/* Work out whether there are 1 or 4 bytes of C bits in Dual-Conn PHR CE */
+guint get_dual_conn_phr_num_c_bytes(tvbuff_t *tvb, guint offset,
+ gboolean isSimultPUCCHPUSCHPCell,
+ gboolean isSimultPUCCHPUSCHPSCell,
+ guint subheader_length)
+{
+ if (subheader_length < 4) {
+ /* Can't be 4 */
+ return 1;
+ }
+
+ guint8 scell_bitmap_byte = tvb_get_guint8(tvb, offset);
+ guint i, byte_offset;
+
+ /* Count bits set. */
+ guint byte_bits_set = 0;
+ for (i=1; i <= 7; ++i) {
+ byte_bits_set += (scell_bitmap_byte & (0x1 << i) ? 1 : 0);
+ }
+
+ /* Only work out length for 1-byte case (skip C byte itself). */
+ byte_offset = offset+1;
+
+ /* These 2 fields depend upon seeing correct RRC signalling.. */
+ if (isSimultPUCCHPUSCHPCell) {
+ if ((tvb_get_guint8(tvb, byte_offset) & 0x40) == 0) {
+ byte_offset++;
+ }
+ byte_offset++;
+ }
+ if (isSimultPUCCHPUSCHPSCell) {
+ if ((tvb_get_guint8(tvb, byte_offset) & 0x40) == 0) {
+ byte_offset++;
+ }
+ byte_offset++;
+ }
+
+ /* Now walk number of entries set */
+ for (i=0; i <= byte_bits_set; i++) {
+ /* But take care to not walk past the end. */
+ if ((byte_offset-offset) >= subheader_length) {
+ /* Went off the end - assume 4... */
+ return 4;
+ }
+ if ((tvb_get_guint8(tvb, byte_offset) & 0x40) == 0) {
+ byte_offset++;
+ }
+ byte_offset++;
+ }
+
+ /* Give verdict */
+ if ((byte_offset-offset) == subheader_length) {
+ return 1;
+ }
+ else {
+ return 4;
+ }
+}
+
#define MAX_HEADERS_IN_PDU 1024
@@ -5190,7 +5274,8 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
proto_item *ti;
proto_tree *dcphr_cell_tree;
proto_item *dcphr_cell_ti;
- guint8 scell_bitmap;
+ guint8 scell_bitmap_byte;
+ guint32 scell_bitmap_word;
guint8 byte;
guint i;
guint32 curr_offset = offset;
@@ -5211,8 +5296,17 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
"Dual Connectivity Power Headroom Report");
dcphr_tree = proto_item_add_subtree(dcphr_ti, ett_mac_lte_dual_conn_power_headroom);
- /* TODO: add support for 4 bytes long SCell index */
- scell_bitmap = tvb_get_guint8(tvb, curr_offset);
+ /* Work out (heuristically) whether we have 1 or 4 bytes of C bits.
+ * Should be based upon highest sCellIndex and/or whether UE is in dual-connectivity,
+ * but for now trust subheader length and see which one fits. */
+ guint num_c_bytes = get_dual_conn_phr_num_c_bytes(tvb, curr_offset,
+ p_mac_lte_info->isSimultPUCCHPUSCHPCell,
+ p_mac_lte_info->isSimultPUCCHPUSCHPSCell,
+ pdu_lengths[n]);
+
+ scell_bitmap_byte = tvb_get_guint8(tvb, curr_offset);
+
+ /* Do first byte (C1-C7) */
proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c7,
tvb, curr_offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c6,
@@ -5230,12 +5324,70 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
/* Check Reserved bit */
ti = proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_reserved,
tvb, curr_offset, 1, ENC_BIG_ENDIAN);
- if (scell_bitmap & 0x01) {
+ if (scell_bitmap_byte & 0x01) {
expert_add_info_format(pinfo, ti, &ei_mac_lte_reserved_not_zero,
"Dual Connectivity Power Headroom Report Reserved bit not zero");
}
curr_offset++;
+ if (num_c_bytes == 4) {
+ /* Do other 3 bytes (C8-C31) */
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c15,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c14,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c13,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c12,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c11,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c10,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c9,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c8,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c23,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c22,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c21,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c20,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c19,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c18,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c17,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c16,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c31,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c30,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c29,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c28,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c27,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c26,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c25,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dcphr_tree, hf_mac_lte_control_dual_conn_power_headroom_c24,
+ tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+ }
+
+
if (p_mac_lte_info->isSimultPUCCHPUSCHPCell) {
/* PCell PH Type 2 is present */
byte = tvb_get_guint8(tvb, curr_offset);
@@ -5329,8 +5481,21 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
val_to_str_ext_const((byte&0x3f), &pcmaxc_vals_ext, "Unknown"));
curr_offset++;
}
- for (i = 1, scell_bitmap>>=1; i <= 7; i++, scell_bitmap>>=1) {
- if (scell_bitmap & 0x01) {
+
+ /* Add entry for each set bit. Iterate over 32 entries regardless */
+ if (num_c_bytes == 1) {
+ scell_bitmap_word = scell_bitmap_byte << 24; /* least significant 3 bytes will be 0 */
+ }
+ else {
+ scell_bitmap_word = tvb_get_ntohl(tvb, offset);
+ }
+
+ for (i=1; i < 31; i++) {
+ /* Work out how much shift to adddress this bit */
+ guint byte_shift = (31-i)/8;
+ guint bit_shift = i % 8;
+ /* Is entry for scell i present? */
+ if (scell_bitmap_word & (0x01 << (byte_shift*8 + bit_shift))) {
byte = tvb_get_guint8(tvb, curr_offset);
dcphr_cell_tree = proto_tree_add_subtree_format(dcphr_tree, tvb, curr_offset, (!(byte&0x40)?2:1),
ett_mac_lte_dual_conn_power_headroom_cell, &dcphr_cell_ti, "SCell Index %u PUSCH", i);
@@ -8750,6 +8915,150 @@ void proto_register_mac_lte(void)
TFS(&mac_lte_scell_ph_vals), 0x02, NULL, HFILL
}
},
+ { &hf_mac_lte_control_dual_conn_power_headroom_c15,
+ { "SCell Index 15 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c15", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x80, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c14,
+ { "SCell Index 14 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c14", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x40, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c13,
+ { "SCell Index 13 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c13", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x20, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c12,
+ { "SCell Index 12 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c12", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x10, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c11,
+ { "SCell Index 11 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c11", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x08, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c10,
+ { "SCell Index 10 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c10", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x04, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c9,
+ { "SCell Index 9 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c9", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x02, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c8,
+ { "SCell Index 8 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c8", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x01, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c23,
+ { "SCell Index 23 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c23", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x80, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c22,
+ { "SCell Index 22 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c22", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x40, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c21,
+ { "SCell Index 21 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c21", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x20, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c20,
+ { "SCell Index 20 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c20", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x10, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c19,
+ { "SCell Index 19 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c19", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x08, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c18,
+ { "SCell Index 18 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c18", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x04, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c17,
+ { "SCell Index 17 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c17", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x02, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c16,
+ { "SCell Index 16 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c16", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x01, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c31,
+ { "SCell Index 31 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c31", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x80, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c30,
+ { "SCell Index 30 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c30", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x40, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c29,
+ { "SCell Index 29 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c29", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x20, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c28,
+ { "SCell Index 28 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c28", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x10, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c27,
+ { "SCell Index 27 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c27", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x08, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c26,
+ { "SCell Index 26 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c26", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x04, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c25,
+ { "SCell Index 25 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c25", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x02, NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_control_dual_conn_power_headroom_c24,
+ { "SCell Index 24 Power Headroom",
+ "mac-lte.control.dual-conn-power-headroom.c24", FT_BOOLEAN, 8,
+ TFS(&mac_lte_scell_ph_vals), 0x01, NULL, HFILL
+ }
+ },
{ &hf_mac_lte_control_dual_conn_power_headroom_reserved,
{ "Reserved",
"mac-lte.control.dual-conn-power-headroom.reserved", FT_UINT8, BASE_DEC,