aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-pw-cesopsn.c
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss@ulticom.com>2009-09-10 15:30:10 +0000
committerJeff Morriss <jeff.morriss@ulticom.com>2009-09-10 15:30:10 +0000
commit037f83cb884dd848b35b03f18d94070b78994a9f (patch)
treedf669e0023146b079797991688077bf5126b5ee1 /epan/dissectors/packet-pw-cesopsn.c
parent48069c2b011bd76cac68f7dfe292c2b94fed206e (diff)
From Artem Tamazov via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=3903 :
Decoding of UDP-multiplexed CESoPSN and SAToP traffic. svn path=/trunk/; revision=29842
Diffstat (limited to 'epan/dissectors/packet-pw-cesopsn.c')
-rw-r--r--epan/dissectors/packet-pw-cesopsn.c83
1 files changed, 59 insertions, 24 deletions
diff --git a/epan/dissectors/packet-pw-cesopsn.c b/epan/dissectors/packet-pw-cesopsn.c
index 5a4a39926f..9b3fe549d2 100644
--- a/epan/dissectors/packet-pw-cesopsn.c
+++ b/epan/dissectors/packet-pw-cesopsn.c
@@ -24,8 +24,9 @@
*
* History:
* ---------------------------------
- * 16.03.2009 initial implementation
- * Not supported:
+ * 16.03.2009 initial implementation for MPLS
+ * 14.08.2009 added: support for IP/UDP demultiplexing
+ * Not supported yet:
* - All PW modes, except Basic NxDS0 mode.
* - <Optional> RTP Headers (RFC3550)
* - Decoding of PW payload
@@ -78,7 +79,12 @@ static const value_string vals_cw_lm[] = {
{ 0, NULL }
};
-static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, proto_tree * tree )
+
+static
+void dissect_pw_cesopsn( tvbuff_t * tvb_original
+ ,packet_info * pinfo
+ ,proto_tree * tree
+ ,pwc_demux_type_t demux)
{
const int encaps_size = 4; /*RTP header in encapsulation is not supported yet*/
gint packet_size;
@@ -87,6 +93,7 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
pwc_packet_properties_t properties;
packet_size = tvb_reported_length_remaining(tvb_original, 0);
+
/*
* FIXME
* "4" below should be replaced by something like "min_packet_size_this_dissector"
@@ -110,8 +117,18 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
return;
}
- if (dissect_try_cw_first_nibble(tvb_original, pinfo, tree))
+ switch (demux)
{
+ case PWC_DEMUX_MPLS:
+ if (dissect_try_cw_first_nibble(tvb_original, pinfo, tree))
+ {
+ return;
+ }
+ break;
+ case PWC_DEMUX_UDP:
+ break;
+ default:
+ DISSECTOR_ASSERT_NOT_REACHED();
return;
}
@@ -155,7 +172,7 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
*/
payload_size = payload_size_from_packet;
padding_size = 0;
-
+
if (payload_size_from_cw < 0)
{
properties |= PWC_CW_BAD_PAYLEN_LT_0;
@@ -180,7 +197,7 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
padding_size = 0;
}
}
-
+
{
guint8 cw_lm;
cw_lm = tvb_get_guint8(tvb_original, 0) & 0x0b /*l+mod*/;
@@ -235,13 +252,13 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
}
col_append_fstr(pinfo->cinfo, COL_INFO, "TDM octets:%d", (int)payload_size);
-
+
if (padding_size != 0)
{
col_append_fstr(pinfo->cinfo, COL_INFO, ", Padding:%d", (int)padding_size);
}
}
-
+
if (tree)
{
proto_item* item;
@@ -268,16 +285,16 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
expert_add_info_format(pinfo, item, PI_MALFORMED, PI_ERROR
,"Bits 0..3 of Control Word must be 0");
}
-
+
item = proto_tree_add_item(tree, hf_cw_lm, tvb, 0, 1, FALSE);
if (properties & PWC_CW_SUSPECT_LM)
{
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN
,"Reserved combination of L and Modifier bits");
}
-
+
(void)proto_tree_add_item(tree, hf_cw_r, tvb, 0, 1, FALSE);
-
+
item = proto_tree_add_item(tree, hf_cw_frg, tvb, 1, 1, FALSE);
if (properties & PWC_CW_BAD_FRAG)
{
@@ -285,7 +302,7 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
,"Fragmentation of payload is not allowed"
" for basic CESoPSN mode");
}
-
+
item = proto_tree_add_item(tree, hf_cw_len, tvb, 1, 1, FALSE);
if (properties & PWC_CW_BAD_PAYLEN_LT_0)
{
@@ -305,9 +322,9 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
,"Bad Length: must be 0 if CESoPSN packet size (%d) is > 64"
,(int)packet_size);
}
-
+
proto_tree_add_item(tree, hf_cw_seq, tvb, 2, 2, FALSE);
-
+
}
}
}
@@ -349,7 +366,7 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
PROTO_ITEM_SET_HIDDEN(item);
}
}
-
+
/* padding */
if (padding_size > 0)
{
@@ -360,11 +377,28 @@ static void dissect_pw_cesopsn( tvbuff_t * tvb_original, packet_info * pinfo, pr
tvb = tvb_new_subset(tvb_original, PWC_SIZEOF_CW + payload_size, padding_size, -1);
call_dissector(pw_padding_handle, tvb, pinfo, tree);
}
- }
+ }
}
return;
}
+
+static
+void dissect_pw_cesopsn_mpls( tvbuff_t * tvb_original, packet_info * pinfo, proto_tree * tree)
+{
+ dissect_pw_cesopsn(tvb_original,pinfo,tree,PWC_DEMUX_MPLS);
+ return;
+}
+
+
+static
+void dissect_pw_cesopsn_udp( tvbuff_t * tvb_original, packet_info * pinfo, proto_tree * tree)
+{
+ dissect_pw_cesopsn(tvb_original,pinfo,tree,PWC_DEMUX_UDP);
+ return;
+}
+
+
void proto_register_pw_cesopsn(void)
{
static hf_register_info hf[] = {
@@ -372,7 +406,7 @@ void proto_register_pw_cesopsn(void)
,FT_NONE ,BASE_NONE ,NULL
,0 ,NULL ,HFILL }}
,{&hf_cw_bits03,{"Bits 0 to 3" ,"pwcesopsn.cw.bits03"
- ,FT_UINT8 ,BASE_DEC ,NULL
+ ,FT_UINT8 ,BASE_DEC ,NULL
,0xf0 ,NULL ,HFILL }}
,{ &hf_cw_lm, {"L+M bits" ,"pwcesopsn.cw.lm"
,FT_UINT8 ,BASE_HEX ,VALS(vals_cw_lm)
@@ -389,14 +423,14 @@ void proto_register_pw_cesopsn(void)
,{&hf_cw_seq, {"Sequence number" ,"pwcesopsn.cw.seqno"
,FT_UINT16 ,BASE_DEC ,NULL
,0 ,NULL ,HFILL }}
- ,{&hf_payload ,{"TDM payload" ,"pwcesopsn.payload"
- ,FT_BYTES ,BASE_NONE ,NULL
+ ,{&hf_payload ,{"TDM payload" ,"pwcesopsn.payload"
+ ,FT_BYTES ,BASE_NONE ,NULL
,0 ,NULL ,HFILL }}
,{&hf_payload_l ,{"TDM payload length" ,"pwcesopsn.payload.len"
,FT_INT32 ,BASE_DEC ,NULL
,0 ,NULL ,HFILL }}
};
-
+
static gint *ett_array[] = {
&ett
};
@@ -404,16 +438,17 @@ void proto_register_pw_cesopsn(void)
proto = proto_register_protocol(pwc_longname_pw_cesopsn, shortname, "pwcesopsn");
proto_register_field_array(proto, hf, array_length(hf));
proto_register_subtree_array(ett_array, array_length(ett_array));
- register_dissector("pw_cesopsn", dissect_pw_cesopsn, proto);
+ register_dissector("pw_cesopsn_mpls", dissect_pw_cesopsn_mpls, proto);
+ register_dissector("pw_cesopsn_udp", dissect_pw_cesopsn_udp, proto);
return;
}
+
void proto_reg_handoff_pw_cesopsn(void)
{
- dissector_handle_t h;
- h = find_dissector("pw_cesopsn");
data_handle = find_dissector("data");
pw_padding_handle = find_dissector("pw_padding");
- dissector_add("mpls.label", LABEL_INVALID, h);
+ dissector_add("mpls.label", LABEL_INVALID, find_dissector("pw_cesopsn_mpls"));
+ dissector_add_handle("udp.port", find_dissector("pw_cesopsn_udp")); /* For Decode-As */
return;
}