aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/docsis/packet-rngrsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/docsis/packet-rngrsp.c')
-rw-r--r--plugins/docsis/packet-rngrsp.c150
1 files changed, 66 insertions, 84 deletions
diff --git a/plugins/docsis/packet-rngrsp.c b/plugins/docsis/packet-rngrsp.c
index 3971e65e3c..7dfc51b015 100644
--- a/plugins/docsis/packet-rngrsp.c
+++ b/plugins/docsis/packet-rngrsp.c
@@ -83,14 +83,16 @@ dissect_rngrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* da
proto_tree *rngrsp_tree;
proto_item *rngrsptlv_item;
proto_tree *rngrsptlv_tree;
- guint8 tlvtype, tlvlen;
+ guint8 tlvtype;
int pos;
- gint length;
- guint8 upchid;
- guint16 sid;
+ guint tlvlen;
+ guint32 sid, upchid;
- sid = tvb_get_ntohs (tvb, 0);
- upchid = tvb_get_guint8 (tvb, 2);
+ it = proto_tree_add_item(tree, proto_docsis_rngrsp, tvb, 0, -1, ENC_NA);
+ rngrsp_tree = proto_item_add_subtree (it, ett_docsis_rngrsp);
+
+ proto_tree_add_item_ret_uint (rngrsp_tree, hf_docsis_rngrsp_sid, tvb, 0, 2, ENC_BIG_ENDIAN, &sid);
+ proto_tree_add_item_ret_uint (rngrsp_tree, hf_docsis_rngrsp_upstream_chid, tvb, 2, 1, ENC_BIG_ENDIAN, &upchid);
if (upchid > 0)
col_add_fstr (pinfo->cinfo, COL_INFO,
@@ -99,88 +101,68 @@ dissect_rngrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* da
else
col_add_fstr (pinfo->cinfo, COL_INFO,
"Ranging Response: SID = %u, Telephony Return", sid);
- it = proto_tree_add_protocol_format (tree, proto_docsis_rngrsp, tvb, 0, -1,
- "Ranging Response");
- rngrsp_tree = proto_item_add_subtree (it, ett_docsis_rngrsp);
- proto_tree_add_item (rngrsp_tree, hf_docsis_rngrsp_sid, tvb, 0, 2,
- ENC_BIG_ENDIAN);
- proto_tree_add_item (rngrsp_tree, hf_docsis_rngrsp_upstream_chid, tvb,
- 2, 1, ENC_BIG_ENDIAN);
- length = tvb_reported_length (tvb);
+
pos = 3;
- while (pos < length)
- {
- tlvtype = tvb_get_guint8 (tvb, pos);
- rngrsptlv_tree = proto_tree_add_subtree(rngrsp_tree, tvb, pos, -1,
+ while (tvb_reported_length_remaining(tvb, pos) > 0)
+ {
+ tlvtype = tvb_get_guint8 (tvb, pos);
+ rngrsptlv_tree = proto_tree_add_subtree(rngrsp_tree, tvb, pos, -1,
ett_docsis_rngrsptlv, &rngrsptlv_item,
val_to_str(tlvtype, rngrsp_tlv_vals,
"Unknown TLV (%u)"));
- proto_tree_add_uint (rngrsptlv_tree, hf_docsis_rngrsp_type,
- tvb, pos, 1, tlvtype);
- pos++;
- tlvlen = tvb_get_guint8 (tvb, pos);
- proto_tree_add_uint (rngrsptlv_tree, hf_docsis_rngrsp_length,
- tvb, pos, 1, tlvlen);
- pos++;
- proto_item_set_len(rngrsptlv_item, tlvlen + 2);
- switch (tlvtype)
- {
- case RNGRSP_TIMING:
- if (tlvlen == 4)
- {
- proto_tree_add_item (rngrsptlv_tree,
- hf_docsis_rngrsp_timing_adj, tvb, pos,
- tlvlen, ENC_BIG_ENDIAN);
- }
- pos = pos + tlvlen;
- break;
- case RNGRSP_PWR_LEVEL_ADJ:
- if (tlvlen == 1)
- {
- proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_power_adj,
- tvb, pos, tlvlen, ENC_NA);
- }
- pos = pos + tlvlen;
- break;
- case RNGRSP_OFFSET_FREQ_ADJ:
- if (tlvlen == 2)
- {
- proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_freq_adj,
- tvb, pos, tlvlen, ENC_BIG_ENDIAN);
- }
- pos = pos + tlvlen;
- break;
- case RNGRSP_TRANSMIT_EQ_ADJ:
- proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_xmit_eq_adj,
- tvb, pos, tlvlen, ENC_NA);
- pos = pos + tlvlen;
- break;
- case RNGRSP_RANGING_STATUS:
- if (tlvlen == 1)
- proto_tree_add_item (rngrsptlv_tree,
- hf_docsis_rngrsp_ranging_status, tvb,
- pos, tlvlen, ENC_BIG_ENDIAN);
- pos = pos + tlvlen;
- break;
- case RNGRSP_DOWN_FREQ_OVER:
- if (tlvlen == 4)
- proto_tree_add_item (rngrsptlv_tree,
- hf_docsis_rngrsp_down_freq_over, tvb,
- pos, tlvlen, ENC_BIG_ENDIAN);
- pos = pos + tlvlen;
- break;
- case RNGRSP_UP_CHID_OVER:
- if (tlvlen == 1)
- proto_tree_add_item (rngrsptlv_tree,
- hf_docsis_rngrsp_upstream_ch_over, tvb,
- pos, tlvlen, ENC_BIG_ENDIAN);
- pos = pos + tlvlen;
- break;
- default:
- pos = pos + tlvlen;
- } /* switch(tlvtype) */
- } /* while (pos < length) */
- return length;
+ proto_tree_add_uint (rngrsptlv_tree, hf_docsis_rngrsp_type, tvb, pos, 1, tlvtype);
+ pos++;
+ proto_tree_add_item_ret_uint (rngrsptlv_tree, hf_docsis_rngrsp_length,
+ tvb, pos, 1, ENC_NA, &tlvlen);
+ pos++;
+ proto_item_set_len(rngrsptlv_item, tlvlen + 2);
+ switch (tlvtype)
+ {
+ case RNGRSP_TIMING:
+ if (tlvlen == 4)
+ {
+ proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_timing_adj, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
+ }
+ break;
+ case RNGRSP_PWR_LEVEL_ADJ:
+ if (tlvlen == 1)
+ {
+ proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_power_adj, tvb, pos, tlvlen, ENC_NA);
+ }
+ break;
+ case RNGRSP_OFFSET_FREQ_ADJ:
+ if (tlvlen == 2)
+ {
+ proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_freq_adj, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
+ }
+ break;
+ case RNGRSP_TRANSMIT_EQ_ADJ:
+ proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_xmit_eq_adj, tvb, pos, tlvlen, ENC_NA);
+ break;
+ case RNGRSP_RANGING_STATUS:
+ if (tlvlen == 1)
+ {
+ proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_ranging_status, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
+ }
+ break;
+ case RNGRSP_DOWN_FREQ_OVER:
+ if (tlvlen == 4)
+ {
+ proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_down_freq_over, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
+ }
+ break;
+ case RNGRSP_UP_CHID_OVER:
+ if (tlvlen == 1)
+ {
+ proto_tree_add_item (rngrsptlv_tree, hf_docsis_rngrsp_upstream_ch_over, tvb, pos, tlvlen, ENC_BIG_ENDIAN);
+ }
+ break;
+ default:
+ ;
+ } /* switch(tlvtype) */
+ pos += tlvlen;
+ } /* while (tvb_reported_length_remaining(tvb, pos) > 0) */
+ return tvb_captured_length(tvb);
}
/* Register the protocol with Wireshark */