summaryrefslogtreecommitdiff
path: root/plugins/docsis
diff options
context:
space:
mode:
authorAdrian Simionov <daniel.simionov@gmail.com>2016-05-30 23:02:23 +1000
committerMichael Mann <mmann78@netscape.net>2016-05-31 20:33:53 +0000
commit469719f39d82eaa89646ec8471f91dee884723f6 (patch)
tree2d05deeea12e42d34dd13bf5f1b11ba204cc51ce /plugins/docsis
parent99d9e4ae71a9c9d050a669bfb62fe605da18c641 (diff)
downloadwireshark-469719f39d82eaa89646ec8471f91dee884723f6.tar.gz
[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 <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'plugins/docsis')
-rw-r--r--plugins/docsis/packet-rngrsp.c208
1 files changed, 107 insertions, 101 deletions
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 */