From 469719f39d82eaa89646ec8471f91dee884723f6 Mon Sep 17 00:00:00 2001 From: Adrian Simionov Date: Mon, 30 May 2016 23:02:23 +1000 Subject: [docsis->rngrsp] Packet decoded in greater detail Next steps would be to add expert and add missing TLVs. Change-Id: Ia05d81c380d412ab02e55bbfc08363d9153ff1c3 Reviewed-on: https://code.wireshark.org/review/15617 Petri-Dish: Alexis La Goutte Tested-by: Petri Dish Buildbot Reviewed-by: Michael Mann --- plugins/docsis/packet-rngrsp.c | 208 +++++++++++++++++++++-------------------- 1 file changed, 107 insertions(+), 101 deletions(-) (limited to 'plugins') diff --git a/plugins/docsis/packet-rngrsp.c b/plugins/docsis/packet-rngrsp.c index 596efd0f9e..5bd142f689 100644 --- a/plugins/docsis/packet-rngrsp.c +++ b/plugins/docsis/packet-rngrsp.c @@ -39,6 +39,8 @@ void proto_reg_handoff_docsis_rngrsp(void); /* Initialize the protocol and registered fields */ static int proto_docsis_rngrsp = -1; +static int hf_docsis_rngrsp_type = -1; +static int hf_docsis_rngrsp_length = -1; static int hf_docsis_rngrsp_upstream_chid = -1; static int hf_docsis_rngrsp_sid = -1; static int hf_docsis_rngrsp_timing_adj = -1; @@ -58,6 +60,18 @@ static const value_string rng_stat_vals[] = { /* Initialize the subtree pointers */ static gint ett_docsis_rngrsp = -1; +static gint ett_docsis_rngrsptlv = -1; + +static const value_string rngrsp_tlv_vals[] = { + {RNGRSP_TIMING, "Timing Adjust (6.25us/64)"}, + {RNGRSP_PWR_LEVEL_ADJ, "Power Level Adjust (0.25dB units)"}, + {RNGRSP_OFFSET_FREQ_ADJ, "Offset Freq Adjust (Hz)"}, + {RNGRSP_TRANSMIT_EQ_ADJ, "Transmit Equalisation Adjust"}, + {RNGRSP_RANGING_STATUS, "Ranging Status"}, + {RNGRSP_DOWN_FREQ_OVER, "Downstream Frequency Override (Hz)"}, + {RNGRSP_UP_CHID_OVER, "Upstream Channel ID Override"}, + {0, NULL} +}; /* Code to actually dissect the packets */ static int @@ -65,13 +79,13 @@ dissect_rngrsp (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* da { proto_item *it; proto_tree *rngrsp_tree; + proto_item *rngrsptlv_item; + proto_tree *rngrsptlv_tree; guint8 tlvtype, tlvlen; int pos; gint length; guint8 upchid; guint16 sid; - gint8 pwr; - gint32 tim; sid = tvb_get_ntohs (tvb, 0); upchid = tvb_get_guint8 (tvb, 2); @@ -83,121 +97,112 @@ 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); - - - if (tree) + 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) { - 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_remaining (tvb, 0); - pos = 3; - while (pos < length) + 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) { - tlvtype = tvb_get_guint8 (tvb, pos++); - tlvlen = tvb_get_guint8 (tvb, pos++); - switch (tlvtype) - { - case RNGRSP_TIMING: - if (tlvlen == 4) - { - tim = tvb_get_ntohl (tvb, pos); - proto_tree_add_int (rngrsp_tree, - hf_docsis_rngrsp_timing_adj, tvb, pos, - tlvlen, tim); - } - else - { - THROW (ReportedBoundsError); - } - break; - case RNGRSP_PWR_LEVEL_ADJ: - if (tlvlen == 1) - { - pwr = tvb_get_guint8 (tvb, pos); - proto_tree_add_int (rngrsp_tree, hf_docsis_rngrsp_power_adj, - tvb, pos, tlvlen, pwr); - } - else - { - THROW (ReportedBoundsError); - } - break; - case RNGRSP_OFFSET_FREQ_ADJ: - if (tlvlen == 2) - { - proto_tree_add_item (rngrsp_tree, hf_docsis_rngrsp_freq_adj, - tvb, pos, tlvlen, ENC_BIG_ENDIAN); - } - else - { - THROW (ReportedBoundsError); - } - break; - case RNGRSP_TRANSMIT_EQ_ADJ: - proto_tree_add_item (rngrsp_tree, hf_docsis_rngrsp_xmit_eq_adj, - tvb, pos, tlvlen, ENC_NA); - break; - case RNGRSP_RANGING_STATUS: - if (tlvlen == 1) - proto_tree_add_item (rngrsp_tree, - hf_docsis_rngrsp_ranging_status, tvb, - pos, tlvlen, ENC_BIG_ENDIAN); - else - { - THROW (ReportedBoundsError); - } - break; - case RNGRSP_DOWN_FREQ_OVER: - if (tlvlen == 4) - proto_tree_add_item (rngrsp_tree, - hf_docsis_rngrsp_down_freq_over, tvb, - pos, tlvlen, ENC_BIG_ENDIAN); - else - { - THROW (ReportedBoundsError); - } - break; - case RNGRSP_UP_CHID_OVER: - if (tlvlen == 1) - proto_tree_add_item (rngrsp_tree, - hf_docsis_rngrsp_upstream_ch_over, tvb, - pos, tlvlen, ENC_BIG_ENDIAN); - else - { - THROW (ReportedBoundsError); - } - break; - - } /* switch(tlvtype) */ - pos = pos + tlvlen; - } /* while (pos < length) */ - } /* if (tree) */ - return tvb_captured_length(tvb); + 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; } - - - /* Register the protocol with Wireshark */ /* this format is require because a script is used to build the C function that calls all the protocol registration. */ - void proto_register_docsis_rngrsp (void) { /* Setup list of header fields See Section 1.6.1 for details*/ static hf_register_info hf[] = { + {&hf_docsis_rngrsp_type, + {"Type", "docsis_rngrsp.type", + FT_UINT8, BASE_DEC, VALS(rngrsp_tlv_vals), 0x0, + "TLV Type", HFILL} + }, + {&hf_docsis_rngrsp_length, + {"Length", "docsis_rngrsp.length", + FT_UINT8, BASE_DEC, NULL, 0x0, + "TLV Length", HFILL} + }, {&hf_docsis_rngrsp_sid, {"Service Identifier", "docsis_rngrsp.sid", FT_UINT16, BASE_DEC, NULL, 0x0, @@ -249,6 +254,7 @@ proto_register_docsis_rngrsp (void) /* Setup protocol subtree array */ static gint *ett[] = { &ett_docsis_rngrsp, + &ett_docsis_rngrsptlv, }; /* Register the protocol name and description */ -- cgit v1.2.3