diff options
author | Anders Broman <anders.broman@ericsson.com> | 2009-04-04 11:48:19 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2009-04-04 11:48:19 +0000 |
commit | e0cf1679e3e1f469de2f727e3628b4f40f4e4b5c (patch) | |
tree | d7875a22f53e952fd0d0771632ce56b0549e4356 /epan/dissectors/packet-pw-eth.c | |
parent | 978f771a8d7c73d44585ae64a46874f643467edf (diff) |
From Francesco Fondelli:
New ATM PW (with/without CW) dissector, RFC 4717
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=3375
svn path=/trunk/; revision=27955
Diffstat (limited to 'epan/dissectors/packet-pw-eth.c')
-rw-r--r-- | epan/dissectors/packet-pw-eth.c | 235 |
1 files changed, 121 insertions, 114 deletions
diff --git a/epan/dissectors/packet-pw-eth.c b/epan/dissectors/packet-pw-eth.c index a54d3e9325..fa9ce27253 100644 --- a/epan/dissectors/packet-pw-eth.c +++ b/epan/dissectors/packet-pw-eth.c @@ -1,6 +1,5 @@ /* packet-pw-eth.c - * Routines for ethernet PW dissection: - * it should be conformance to RFC 4448. + * Routines for ethernet PW dissection: it should be conform to RFC 4448. * * Copyright 2008 _FF_ * @@ -50,87 +49,58 @@ static int hf_pw_eth = -1; static int hf_pw_eth_cw = -1; static int hf_pw_eth_cw_sequence_number = -1; -static hf_register_info hf[] = { - { - &hf_pw_eth, - { - "PW (ethernet)", - "pweth", FT_BOOLEAN, - 0, NULL, 0x0, NULL, HFILL - } - }, - { - &hf_pw_eth_cw, - { - "PW Control Word (ethernet)", - "pweth.cw", FT_BOOLEAN, - 0, NULL, 0x0, NULL, HFILL - } - }, - { - &hf_pw_eth_cw_sequence_number, - { - "PW sequence number (ethernet)", - "pweth.cw.sequence_number", FT_UINT16, - BASE_DEC, NULL, 0x0, NULL, HFILL - } - } -}; - -static gint *ett[] = { - &ett_pw_eth -}; - static dissector_handle_t eth_withoutfcs_handle; static void dissect_pw_eth_cw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_tree *pw_eth_tree = NULL; - proto_item *ti = NULL; - tvbuff_t *next_tvb = NULL; - guint16 sequence_number = 0; - - if (tvb_reported_length_remaining(tvb, 0) < 4) { - if (tree) - proto_tree_add_text(tree, tvb, 0, -1, - "Error processing Message"); - return; - } - - if ( dissect_try_cw_first_nibble( tvb, pinfo, tree )) - return; - - sequence_number = tvb_get_ntohs(tvb, 2); - if (tree) { - ti = proto_tree_add_boolean(tree, hf_pw_eth_cw, tvb, 0, 0, TRUE); - PROTO_ITEM_SET_HIDDEN(ti); - ti = proto_tree_add_item(tree, proto_pw_eth_cw, tvb, 0, 4, FALSE); - pw_eth_tree = proto_item_add_subtree(ti, ett_pw_eth); - if (pw_eth_tree == NULL) - return; - proto_tree_add_uint_format(pw_eth_tree, - hf_pw_eth_cw_sequence_number, - tvb, 2, 2, sequence_number, - "Sequence Number: %d", - sequence_number); - } - next_tvb = tvb_new_subset(tvb, 4, -1, -1); - call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, tree); + proto_tree *pw_eth_tree = NULL; + proto_item *ti = NULL; + tvbuff_t *next_tvb = NULL; + guint16 sequence_number = 0; + + if (tvb_reported_length_remaining(tvb, 0) < 4) { + if (tree) + proto_tree_add_text(tree, tvb, 0, -1, + "Error processing Message"); + return; + } + + if (dissect_try_cw_first_nibble(tvb, pinfo, tree)) + return; + + sequence_number = tvb_get_ntohs(tvb, 2); + if (tree) { + ti = proto_tree_add_boolean(tree, hf_pw_eth_cw, + tvb, 0, 0, TRUE); + PROTO_ITEM_SET_HIDDEN(ti); + ti = proto_tree_add_item(tree, proto_pw_eth_cw, + tvb, 0, 4, FALSE); + pw_eth_tree = proto_item_add_subtree(ti, ett_pw_eth); + if (pw_eth_tree == NULL) + return; + proto_tree_add_uint_format(pw_eth_tree, + hf_pw_eth_cw_sequence_number, + tvb, 2, 2, sequence_number, + "Sequence Number: %d", + sequence_number); + } + next_tvb = tvb_new_subset(tvb, 4, -1, -1); + call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, tree); } static void dissect_pw_eth_nocw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - tvbuff_t *next_tvb = NULL; - proto_item *ti = NULL; - - if (tree) { - ti = proto_tree_add_boolean(tree, hf_pw_eth, tvb, 0, 0, TRUE); - PROTO_ITEM_SET_HIDDEN(ti); - } - next_tvb = tvb_new_subset(tvb, 0, -1, -1); - call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, tree); + tvbuff_t *next_tvb = NULL; + proto_item *ti = NULL; + + if (tree) { + ti = proto_tree_add_boolean(tree, hf_pw_eth, tvb, 0, 0, TRUE); + PROTO_ITEM_SET_HIDDEN(ti); + } + next_tvb = tvb_new_subset(tvb, 0, -1, -1); + call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, tree); } /* @@ -140,66 +110,103 @@ dissect_pw_eth_nocw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static gboolean looks_like_plain_eth(tvbuff_t *tvb _U_) { - const gchar *manuf_name_da = NULL; - const gchar *manuf_name_sa = NULL; + const gchar *manuf_name_da = NULL; + const gchar *manuf_name_sa = NULL; - if (tvb_reported_length_remaining(tvb, 0) < 14) { - return FALSE; - } + if (tvb_reported_length_remaining(tvb, 0) < 14) { + return FALSE; + } - manuf_name_da = get_manuf_name_if_known(tvb_get_ptr(tvb, 0, 6)); - manuf_name_sa = get_manuf_name_if_known(tvb_get_ptr(tvb, 6, 6)); + manuf_name_da = get_manuf_name_if_known(tvb_get_ptr(tvb, 0, 6)); + manuf_name_sa = get_manuf_name_if_known(tvb_get_ptr(tvb, 6, 6)); - if (manuf_name_da && manuf_name_sa) { - return TRUE; - } + if (manuf_name_da && manuf_name_sa) { + return TRUE; + } - return FALSE; + return FALSE; } -static void dissect_pw_eth_heuristic(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +static void +dissect_pw_eth_heuristic(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - if (looks_like_plain_eth(tvb)) { - call_dissector( find_dissector("pw_eth_nocw"), tvb, pinfo, tree); - } else { - call_dissector( find_dissector("pw_eth_cw"), tvb, pinfo, tree); - } + if (looks_like_plain_eth(tvb)) { + call_dissector(find_dissector("pw_eth_nocw"), tvb, pinfo, tree); + } else { + call_dissector(find_dissector("pw_eth_cw"), tvb, pinfo, tree); + } } void proto_register_pw_eth(void) { - proto_pw_eth_cw = proto_register_protocol("PW Ethernet Control Word", - "Ethernet PW (with CW)", - "pwethcw"); - proto_pw_eth_nocw = proto_register_protocol("Ethernet PW (no CW)", /*not displayed*/ - "Ethernet PW (no CW)", - "pwethnocw"); - proto_pw_eth_heuristic = proto_register_protocol("Ethernet PW (CW heuristic)", /*not displayed*/ - "Ethernet PW (CW heuristic)", - "pwethheuristic"); - proto_register_field_array(proto_pw_eth_cw, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - register_dissector("pw_eth_cw", dissect_pw_eth_cw, proto_pw_eth_cw); - register_dissector("pw_eth_nocw", dissect_pw_eth_nocw, proto_pw_eth_nocw); - register_dissector("pw_eth_heuristic", dissect_pw_eth_heuristic, proto_pw_eth_heuristic ); + static hf_register_info hf[] = { + { + &hf_pw_eth, + { + "PW (ethernet)", + "pweth", FT_BOOLEAN, + 0, NULL, 0x0, NULL, HFILL + } + }, + { + &hf_pw_eth_cw, + { + "PW Control Word (ethernet)", + "pweth.cw", FT_BOOLEAN, + 0, NULL, 0x0, NULL, HFILL + } + }, + { + &hf_pw_eth_cw_sequence_number, + { + "PW sequence number (ethernet)", + "pweth.cw.sequence_number", FT_UINT16, + BASE_DEC, NULL, 0x0, NULL, HFILL + } + } + }; + + static gint *ett[] = { + &ett_pw_eth + }; + + proto_pw_eth_cw = + proto_register_protocol("PW Ethernet Control Word", + "Ethernet PW (with CW)", + "pwethcw"); + proto_pw_eth_nocw = + proto_register_protocol("Ethernet PW (no CW)", /* not displayed */ + "Ethernet PW (no CW)", + "pwethnocw"); + proto_pw_eth_heuristic = + proto_register_protocol("Ethernet PW (CW heuristic)", /* not disp. */ + "Ethernet PW (CW heuristic)", + "pwethheuristic"); + proto_register_field_array(proto_pw_eth_cw, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + register_dissector("pw_eth_cw", dissect_pw_eth_cw, proto_pw_eth_cw); + register_dissector("pw_eth_nocw", dissect_pw_eth_nocw, + proto_pw_eth_nocw); + register_dissector("pw_eth_heuristic", dissect_pw_eth_heuristic, + proto_pw_eth_heuristic); } void proto_reg_handoff_pw_eth(void) { - dissector_handle_t pw_eth_handle_cw; - dissector_handle_t pw_eth_handle_nocw; - dissector_handle_t pw_eth_handle_heuristic; + dissector_handle_t pw_eth_handle_cw; + dissector_handle_t pw_eth_handle_nocw; + dissector_handle_t pw_eth_handle_heuristic; - eth_withoutfcs_handle = find_dissector("eth_withoutfcs"); + eth_withoutfcs_handle = find_dissector("eth_withoutfcs"); - pw_eth_handle_cw = find_dissector("pw_eth_cw"); - dissector_add("mpls.label", LABEL_INVALID, pw_eth_handle_cw); + pw_eth_handle_cw = find_dissector("pw_eth_cw"); + dissector_add("mpls.label", LABEL_INVALID, pw_eth_handle_cw); - pw_eth_handle_nocw = find_dissector("pw_eth_nocw"); - dissector_add("mpls.label", LABEL_INVALID, pw_eth_handle_nocw); + pw_eth_handle_nocw = find_dissector("pw_eth_nocw"); + dissector_add("mpls.label", LABEL_INVALID, pw_eth_handle_nocw); - pw_eth_handle_heuristic = find_dissector("pw_eth_heuristic"); - dissector_add("mpls.label", LABEL_INVALID, pw_eth_handle_heuristic); + pw_eth_handle_heuristic = find_dissector("pw_eth_heuristic"); + dissector_add("mpls.label", LABEL_INVALID, pw_eth_handle_heuristic); } |