from Shobhank Sharma:

- Removed some mpls preferences which are no longer relevant/needed like 
  decode PWAC payloads as PPP traffic and assume all channel types except 0x21
are raw BFD. 
- MPLS extension from PW-ACH to MPLS Generic Associated Channel as per RFC 5586 
- Updated Pseudowire Associated Channel Types as per
http://www.iana.org/assignments/pwe3-parameters
- Updated the VCCV bitmaps as per RFC 5885

https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6574

svn path=/trunk/; revision=40026
This commit is contained in:
Anders Broman 2011-11-28 17:05:35 +00:00
parent 4a00a8ac58
commit 947399180f
4 changed files with 91 additions and 65 deletions

View File

@ -3356,6 +3356,10 @@ Ivan Lawrow <ivan.lawrow [AT] jennic.com> {
Kari Vatjus-Anttila <kari.vatjus-anttila [AT] cie.fi> {
kNet (KristalliNet) dissector
}
Shobhank Sharma <ssharma5 [AT] ncsu.edu>{
MPLS Enhancement - Generic Associated Channel, as per RFC 5586
}
and by:

View File

@ -8,6 +8,10 @@
* CRLDP (RFC3212) is now supported
* - (c) 2002 Michael Rozhavsky <mike[AT]tochna.technion.ac.il>
*
* (c) Copyright 2011, Shobhank Sharma <ssharma5@ncsu.edu>
* - update the VCCV bitmaps as per RFC 5885
*
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1999 Gerald Combs
@ -176,7 +180,10 @@ static int hf_ldp_tlv_fec_vc_intparam_vccv_cctype_mplsra = -1;
static int hf_ldp_tlv_fec_vc_intparam_vccv_cctype_ttl1 = -1;
static int hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_icmpping = -1;
static int hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_lspping = -1;
static int hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd = -1;
static int hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd1 = -1;
static int hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd2 = -1;
static int hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd3 = -1;
static int hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd4 = -1;
static int hf_ldp_tlv_lspid_act_flg = -1;
static int hf_ldp_tlv_lspid_cr_lsp = -1;
static int hf_ldp_tlv_lspid_ldpid = -1;
@ -867,7 +874,10 @@ dissect_tlv_fec(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem)
&hf_ldp_tlv_fec_vc_intparam_vccv_cctype_ttl1 ,
&hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_icmpping ,
&hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_lspping ,
&hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd
&hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd1,
&hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd2,
&hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd3,
&hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd4
};
proto_tree *ti, *val_tree, *fec_tree=NULL;
@ -2747,7 +2757,10 @@ dissect_subtlv_interface_parameters(tvbuff_t *tvb, guint offset, proto_tree *tre
29 - hf_ldp_tlv_fec_vc_intparam_vccv_cctype_ttl1 ,
30 - hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_icmpping ,
31 - hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_lspping ,
32 - hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd
32 - hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd1,
33 - hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd2,
34 - hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd3,
35 - hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd4
};
#endif
proto_tree *ti = proto_tree_add_text(tree, tvb, offset, rem, "Interface Parameter");
@ -3532,9 +3545,21 @@ proto_register_ldp(void)
{ "LSP Ping", "ldp.msg.tlv.fec.vc.intparam.vccv.cvtype_lspping", FT_BOOLEAN, 8,
NULL, 0x02, "VC FEC Interface Param VCCV CV Type LSP Ping", HFILL }},
{ &hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd,
{ "BFD", "ldp.msg.tlv.fec.vc.intparam.vccv.cvtype_bfd", FT_BOOLEAN, 8,
NULL, 0x04, "VC FEC Interface Param VCCV CV Type BFD", HFILL }},
{ &hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd1,
{ "BFD IP/UDP-encapsulated, for PW Fault Detection only", "ldp.msg.tlv.fec.vc.intparam.vccv.cvtype_bfd1", FT_BOOLEAN, 8,
NULL, 0x04, "VC FEC Interface Param VCCV CV Type BFD IP/UDP-encapsulated, for PW Fault Detection only", HFILL }},
{ &hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd2,
{ "BFD IP/UDP-encapsulated, for PW Fault Detection and AC/PW Fault Status Signaling", "ldp.msg.tlv.fec.vc.intparam.vccv.cvtype_bfd2", FT_BOOLEAN, 8,
NULL, 0x08, "VC FEC Interface Param VCCV CV Type BFD IP/UDP-encapsulated, for PW Fault Detection and AC/PW Fault Status Signaling", HFILL }},
{ &hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd3,
{ "BFD BFD PW-ACH-encapsulated, for PW Fault Detection only", "ldp.msg.tlv.fec.vc.intparam.vccv.cvtype_bfd3", FT_BOOLEAN, 8,
NULL, 0x10, "VC FEC Interface Param VCCV CV Type BFD PW-ACH-encapsulated, for PW Fault Detection only", HFILL }},
{ &hf_ldp_tlv_fec_vc_intparam_vccv_cvtype_bfd4,
{ "BFD BFD PW-ACH-encapsulated, for PW Fault Detection and AC/PW Fault Status Signaling", "ldp.msg.tlv.fec.vc.intparam.vccv.cvtype_bfd4", FT_BOOLEAN, 8,
NULL, 0x20, "VC FEC Interface Param VCCV CV Type BFD PW-ACH-encapsulated, for PW Fault Detection and AC/PW Fault Status Signaling", HFILL }},
{ &hf_ldp_tlv_lspid_act_flg,
{ "Action Indicator Flag", "ldp.msg.tlv.lspid.actflg", FT_UINT16, BASE_HEX,

View File

@ -11,6 +11,13 @@
* - mpls subdissector table indexed by label value
* - enhanced "what's past last mpls label?" heuristic
*
* (c) Copyright 2011, Shobhank Sharma <ssharma5@ncsu.edu>
* - Removed some mpls preferences which are no longer relevant/needed like
* decode PWAC payloads as PPP traffic and assume all channel types except
* 0x21 are raw BFD.
* - MPLS extension from PW-ACH to MPLS Generic Associated Channel as per RFC 5586
* - Updated Pseudowire Associated Channel Types as per http://www.iana.org/assignments/pwe3-parameters
*
* $Id$
*
* Wireshark - Network traffic analyzer
@ -59,6 +66,7 @@
#include "packet-ppp.h"
#include "packet-mpls.h"
#include "packet-pw-common.h"
#include <string.h>
static gint proto_mpls = -1;
static gint proto_pw_ach = -1;
@ -68,6 +76,7 @@ static gint ett_mpls = -1;
static gint ett_mpls_pw_ach = -1;
static gint ett_mpls_pw_mcw = -1;
static gint ett_mpls_oam = -1;
static char PW_ACH[50]="PW Associated Channel Header";
const value_string special_labels[] = {
{LABEL_IP4_EXPLICIT_NULL, "IPv4 Explicit-Null"},
@ -75,6 +84,7 @@ const value_string special_labels[] = {
{LABEL_IP6_EXPLICIT_NULL, "IPv6 Explicit-Null"},
{LABEL_IMPLICIT_NULL, "Implicit-Null"},
{LABEL_OAM_ALERT, "OAM Alert"},
{LABEL_GACH, "Generic Associated Channel Label (GAL)"},
{0, NULL }
};
@ -209,9 +219,6 @@ static enum_val_t mpls_default_payload_defs[] = {
static int mpls_filter[MPLSF_MAX];
static gint mpls_default_payload = 0;
static gboolean mpls_pref_pwac_all_as_bfd_xipv4 = FALSE;
static gboolean mpls_pref_pwac_0x0_as_bfd = FALSE;
static gboolean mpls_pref_pwac_try_ppp = TRUE;
static int hf_mpls_1st_nibble = -1;
@ -314,14 +321,35 @@ static const value_string mpls_pw_types[] = {
* and http://tools.ietf.org/html/draft-ietf-pwe3-vccv-bfd-05 clause 3.2
*/
static const value_string mpls_pwac_types[] = {
{ 0x0000, "Reserved"},
{ 0x0001, "Management Communication Channel (MCC)"},
{ 0x0002, "Signaling Communication Channel (SCC)"},
{ 0x0007, "BFD Control, PW-ACH-encapsulated (BFD Without IP/UDP Headers)" },
{ 0x000A, "MPLS Direct Loss Measurement (DLM)"},
{ 0x000B, "MPLS Inferred Loss Measurement (ILM)"},
{ 0x000C, "MPLS Delay Measurement (DM)"},
{ 0x000D, "MPLS Direct Loss and Delay Measurement (DLM+DM)"},
{ 0x000E, "MPLS Inferred Loss and Delay Measurement (ILM+DM)"},
{ 0x0021, "IPv4 packet" },
{ 0x0057, "IPv6 packet" },
{ 0x0022, "MPLS-TP CC message"},
{ 0x0023, "MPLS-TP CV message"},
{ 0x0024, "Protection State Coordination Protocol - Channel Type (PSC-CT)"},
{ 0x0025, "On-Demand CV"},
{ 0x0026, "LI"},
{ 0x0057, "IPv6 packet" },
{ 0x0058, "Fault OAM"},
{ 0x7FF8, "Reserved for Experimental Use"},
{ 0x7FF9, "Reserved for Experimental Use"},
{ 0x7FFA, "Reserved for Experimental Use"},
{ 0x7FFB, "Reserved for Experimental Use"},
{ 0x7FFC, "Reserved for Experimental Use"},
{ 0x7FFD, "Reserved for Experimental Use"},
{ 0x7FFE, "Reserved for Experimental Use"},
{ 0x7FFF, "Reserved for Experimental Use"},
{ 0, NULL }
};
static dissector_table_t ppp_subdissector_table;
static dissector_table_t mpls_subdissector_table;
/*
@ -391,8 +419,7 @@ dissect_pw_ach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
call_dissector(dissector_ip, next_tvb, pinfo, tree);
}
else if (0x7 == channel_type /*PWACH-encapsulated BFD, draft-ietf-pwe3-vccv-bfd-05 3.2*/
|| mpls_pref_pwac_all_as_bfd_xipv4)
else if (0x7 == channel_type /*PWACH-encapsulated BFD, RFC 5885*/)
{
call_dissector(dissector_bfd, next_tvb, pinfo, tree);
}
@ -400,20 +427,6 @@ dissect_pw_ach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
call_dissector(dissector_ipv6, next_tvb, pinfo, tree);
}
else if (0x0 == channel_type && mpls_pref_pwac_0x0_as_bfd)
{
call_dissector(dissector_bfd, next_tvb, pinfo, tree);
}
else if (mpls_pref_pwac_try_ppp)
{
/* XXX perhaps this code should be reconsidered */
/* non-standard extension, therefore controlled by option*/
/* appeared in revision 10862 from Carlos M. Pignataro */
if (!dissector_try_uint(ppp_subdissector_table, channel_type,
next_tvb, pinfo, tree)) {
call_dissector(dissector_data, next_tvb, pinfo, tree);
}
}
else
{
call_dissector(dissector_data, next_tvb, pinfo, tree);
@ -757,6 +770,21 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
offset += 4;
if (label == LABEL_GACH && !bos)
{
proto_tree_add_text(tree, tvb, 0, -1, "Invalid Label");
}
if (label == LABEL_GACH && bos) {
strcpy(PW_ACH,"Generic Associated Channel Header");
next_tvb = tvb_new_subset_remaining(tvb, offset);
dissect_pw_ach( next_tvb, pinfo, tree );
return;
}
else
strcpy(PW_ACH,"PW Associated Channel Header");
if (bos) break;
}
@ -782,7 +810,7 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
call_dissector(dissector_pw_hdlc_nocw_fr, next_tvb, pinfo, tree);
break;
case MDD_MPLS_PW_HDLC_NOCW_HDLC_PPP:
call_dissector(dissector_pw_hdlc_nocw_hdlc_ppp, next_tvb, pinfo, tree);
call_dissector(dissector_pw_hdlc_nocw_hdlc_ppp,next_tvb, pinfo, tree);
break;
case MDD_MPLS_PW_ETH_CW:
call_dissector(dissector_pw_eth_cw, next_tvb, pinfo, tree);
@ -909,7 +937,7 @@ proto_register_mpls(void)
FT_UINT32, BASE_DEC);
proto_mpls = proto_register_protocol("MultiProtocol Label Switching Header",
"MPLS", "mpls");
proto_pw_ach = proto_register_protocol("PW Associated Channel Header",
proto_pw_ach = proto_register_protocol(PW_ACH,
"PW Associated Channel", "pwach");
proto_pw_mcw = proto_register_protocol("PW MPLS Control Word (generic/preferred)",
"Generic PW (with CW)", "pwmcw");
@ -928,49 +956,16 @@ proto_register_mpls(void)
&mpls_default_payload,
mpls_default_payload_defs,
FALSE );
prefs_register_bool_preference(module_mpls
,"mplspref.pwac_0x0_as_bfd"
,"Assume PWAC Channel Type 0x0 is raw BFD"
,"draft-ietf-pwe3-vccv-bfd-05 states that PWAC Channel Type 0x07 must be used"
" when VCCV carries PW-ACH-encapsulated BFD (i.e., BFD without IP/UDP Headers, or \"raw\" BFD)"
"\n\n"
"Legacy or buggy devices may not comply to this and use Channel Type 0x0 for BFD."
" Enable this preference to decode such BFD traffic."
" Disable for standard behavior of PWAC dissector (default)."
,&mpls_pref_pwac_0x0_as_bfd);
prefs_register_bool_preference(module_mpls
,"mplspref.pwac_all_as_bfd_xip"
,"Assume that all PWAC Channel Types (except 0x21) are raw BFD"
,"draft-ietf-pwe3-vccv-bfd-05 states that PWAC Channel Type 0x07 must be used"
" when VCCV carries PW-ACH-encapsulated BFD (i.e., \"raw\" BFD)"
"\n\n"
"Legacy or buggy devices may not comply to this and use voluntary Channel Type for BFD."
" Enable this preference to decode all PWAC Channel Types as raw BFD,"
" except Channel Type 0x21 (IPv4)."
" Disable for standard behavior of PWAC dissector (default)."
,&mpls_pref_pwac_all_as_bfd_xipv4);
prefs_register_bool_preference(module_mpls
,"mplspref.pwac_try_ppp"
,"As a last resort, try to decode PWAC payloads as PPP traffic"
,"Legacy devices may use MPLS PW Associated Channel for PPP traffic."
"\n\n"
"Enable this preference to allow PWAC dissector to try PPP,"
" if no other suitable dissector found (default)."
,&mpls_pref_pwac_try_ppp);
}
}
void
proto_reg_handoff_mpls(void)
{
dissector_handle_t mpls_handle;
ppp_subdissector_table = find_dissector_table("ppp.protocol");
mpls_handle = find_dissector("mpls");
dissector_add_uint("ethertype", ETHERTYPE_MPLS, mpls_handle);
dissector_add_uint("ethertype", ETHERTYPE_MPLS_MULTI, mpls_handle);
dissector_add_uint("ppp.protocol", PPP_MPLS_UNI, mpls_handle);
dissector_add_uint("ppp.protocol", PPP_MPLS_MULTI, mpls_handle);
dissector_add_uint("chdlctype", ETHERTYPE_MPLS, mpls_handle);
dissector_add_uint("chdlctype", ETHERTYPE_MPLS_MULTI, mpls_handle);
dissector_add_uint("gre.proto", ETHERTYPE_MPLS, mpls_handle);
@ -987,7 +982,6 @@ proto_reg_handoff_mpls(void)
dissector_pw_eth_heuristic = find_dissector("pw_eth_heuristic");
dissector_pw_fr = find_dissector("pw_fr");
dissector_pw_hdlc_nocw_fr = find_dissector("pw_hdlc_nocw_fr");
dissector_pw_hdlc_nocw_hdlc_ppp = find_dissector("pw_hdlc_nocw_hdlc_ppp");
dissector_pw_eth_cw = find_dissector("pw_eth_cw");
dissector_pw_eth_nocw = find_dissector("pw_eth_nocw");
dissector_pw_satop = find_dissector("pw_satop_mpls");

View File

@ -5,6 +5,8 @@
*
* (c) Copyright 2006, _FF_ Francesco Fondelli <francesco.fondelli@gmail.com>
* added MPLS OAM support, ITU-T Y.1711
* (c) Copyright 2011, Shobhank Sharma <ssharma5@ncsu.edu>
* added MPLS Generic Associated Channel as per RFC 5586
*
* $Id$
*
@ -38,7 +40,8 @@ enum {
LABEL_IMPLICIT_NULL,
LABEL_OAM_ALERT = 14,
LABEL_MAX_RESERVED = 15,
LABEL_INVALID = 0xffffffff
LABEL_GACH = 13,
LABEL_INVALID = 0xffffffff
};
extern const value_string special_labels[];