diff options
author | wmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7> | 2011-05-20 14:21:02 +0000 |
---|---|---|
committer | wmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7> | 2011-05-20 14:21:02 +0000 |
commit | ab3b47cad4fb56e024d66da158d85cd5925c3ea7 (patch) | |
tree | 67c182be00fdc389203c7bbe371bc1a23be40db9 | |
parent | a741b08bae50f6296ba7981a3129c3dc7464e6c7 (diff) |
Don't assign to a proto_item* if the value won't be used: Coverity 975 [UNUSED]
Remove unneeded prefs callback in prefs registration;
Remove 'if (!initialized)' test from proto_reg_handoff...();
Remove unneeded #include;
Do some whitespace cleanup.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@37327 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r-- | epan/dissectors/packet-mpls.c | 932 |
1 files changed, 462 insertions, 470 deletions
diff --git a/epan/dissectors/packet-mpls.c b/epan/dissectors/packet-mpls.c index 07448736cc..c48da69418 100644 --- a/epan/dissectors/packet-mpls.c +++ b/epan/dissectors/packet-mpls.c @@ -49,8 +49,8 @@ # include "config.h" #endif -#include <glib.h> #include <epan/packet.h> + #include <epan/ppptypes.h> #include <epan/etypes.h> #include <epan/prefs.h> @@ -69,14 +69,12 @@ static gint ett_mpls_pw_ach = -1; static gint ett_mpls_pw_mcw = -1; static gint ett_mpls_oam = -1; -void proto_reg_handoff_mpls(void); - const value_string special_labels[] = { - {LABEL_IP4_EXPLICIT_NULL, "IPv4 Explicit-Null"}, - {LABEL_ROUTER_ALERT, "Router Alert"}, - {LABEL_IP6_EXPLICIT_NULL, "IPv6 Explicit-Null"}, - {LABEL_IMPLICIT_NULL, "Implicit-Null"}, - {LABEL_OAM_ALERT, "OAM Alert"}, + {LABEL_IP4_EXPLICIT_NULL, "IPv4 Explicit-Null"}, + {LABEL_ROUTER_ALERT, "Router Alert"}, + {LABEL_IP6_EXPLICIT_NULL, "IPv6 Explicit-Null"}, + {LABEL_IMPLICIT_NULL, "Implicit-Null"}, + {LABEL_OAM_ALERT, "OAM Alert"}, {0, NULL } }; @@ -233,39 +231,39 @@ static int hf_mpls_oam_defect_location = -1; static int hf_mpls_oam_bip16 = -1; static const value_string oam_function_type_vals[] = { - {0x00, "Reserved"}, - {0x01, "CV (Connectivity Verification)"}, - {0x02, "FDI (Forward Defect Indicator)"}, - {0x03, "BDI (Backward Defect Indicator)"}, - {0x04, "Reserved for Performance packets"}, - {0x05, "Reserved for LB-Req (Loopback Request)"}, - {0x06, "Reserved for LB-Rsp (Loopback Response)"}, - {0x07, "FDD (Fast Failure Detection)"}, + {0x00, "Reserved"}, + {0x01, "CV (Connectivity Verification)"}, + {0x02, "FDI (Forward Defect Indicator)"}, + {0x03, "BDI (Backward Defect Indicator)"}, + {0x04, "Reserved for Performance packets"}, + {0x05, "Reserved for LB-Req (Loopback Request)"}, + {0x06, "Reserved for LB-Rsp (Loopback Response)"}, + {0x07, "FDD (Fast Failure Detection)"}, {0, NULL } }; static const value_string oam_frequency_vals[] = { - {0x00, "Reserved"}, - {0x01, "10 ms"}, - {0x02, "20 ms"}, - {0x03, "50 ms (default value)"}, - {0x04, "100 ms"}, - {0x05, "200 ms"}, - {0x06, "500 ms"}, + {0x00, "Reserved"}, + {0x01, "10 ms"}, + {0x02, "20 ms"}, + {0x03, "50 ms (default value)"}, + {0x04, "100 ms"}, + {0x05, "200 ms"}, + {0x06, "500 ms"}, /* 7-255 Reserved */ {0, NULL } }; static const value_string oam_defect_type_vals[] = { - {0x0000, "Reserved"}, - {0x0101, "dServer"}, - {0x0102, "dPeerME"}, - {0x0201, "dLOCV"}, - {0x0202, "dTTSI_Mismatch"}, - {0x0203, "dTTSI_Mismerge"}, - {0x0204, "dExcess"}, - {0x02FF, "dUnknown"}, - {0xFFFF, "Reserved"}, + {0x0000, "Reserved"}, + {0x0101, "dServer"}, + {0x0102, "dPeerME"}, + {0x0201, "dLOCV"}, + {0x0202, "dTTSI_Mismatch"}, + {0x0203, "dTTSI_Mismerge"}, + {0x0204, "dExcess"}, + {0x02FF, "dUnknown"}, + {0xFFFF, "Reserved"}, {0, NULL } }; @@ -275,38 +273,38 @@ static const value_string oam_defect_type_vals[] = { * http://www.iana.org/assignments/pwe3-parameters */ static const value_string mpls_pw_types[] = { - { 0x0001, "Frame Relay DLCI ( Martini Mode )" }, - { 0x0002, "ATM AAL5 SDU VCC transport" }, - { 0x0003, "ATM transparent cell transport" }, - { 0x0004, "Ethernet Tagged Mode" }, - { 0x0005, "Ethernet" }, - { 0x0006, "HDLC" }, - { 0x0007, "PPP" }, - { 0x0008, "SONET/SDH Circuit Emulation Service Over MPLS" }, - { 0x0009, "ATM n-to-one VCC cell transport" }, - { 0x000A, "ATM n-to-one VPC cell transport" }, - { 0x000B, "IP Layer2 Transport" }, - { 0x000C, "ATM one-to-one VCC Cell Mode" }, - { 0x000D, "ATM one-to-one VPC Cell Mode" }, - { 0x000E, "ATM AAL5 PDU VCC transport" }, - { 0x000F, "Frame-Relay Port mode" }, - { 0x0010, "SONET/SDH Circuit Emulation over Packet" }, - { 0x0011, "Structure-agnostic E1 over Packet" }, - { 0x0012, "Structure-agnostic T1 (DS1) over Packet" }, - { 0x0013, "Structure-agnostic E3 over Packet" }, - { 0x0014, "Structure-agnostic T3 (DS3) over Packet" }, - { 0x0015, "CESoPSN basic mode" }, - { 0x0016, "TDMoIP AAL1 Mode" }, - { 0x0017, "CESoPSN TDM with CAS" }, - { 0x0018, "TDMoIP AAL2 Mode" }, - { 0x0019, "Frame Relay DLCI" }, - { 0x001A, "ROHC Transport Header-compressed Packets" },/*[RFC4995][RFC4901]*/ - { 0x001B, "ECRTP Transport Header-compressed Packets" },/*[RFC3545][RFC4901]*/ - { 0x001C, "IPHC Transport Header-compressed Packets" },/*[RFC2507][RFC4901]*/ - { 0x001D, "cRTP Transport Header-compressed Packets" },/*[RFC2508][RFC4901]*/ - { 0x001E, "ATM VP Virtual Trunk" },/*[MFA9]*/ - { 0x001F, "Reserved" },/*[Bryant] 2008-04-17*/ - { 0, NULL } + { 0x0001, "Frame Relay DLCI ( Martini Mode )" }, + { 0x0002, "ATM AAL5 SDU VCC transport" }, + { 0x0003, "ATM transparent cell transport" }, + { 0x0004, "Ethernet Tagged Mode" }, + { 0x0005, "Ethernet" }, + { 0x0006, "HDLC" }, + { 0x0007, "PPP" }, + { 0x0008, "SONET/SDH Circuit Emulation Service Over MPLS" }, + { 0x0009, "ATM n-to-one VCC cell transport" }, + { 0x000A, "ATM n-to-one VPC cell transport" }, + { 0x000B, "IP Layer2 Transport" }, + { 0x000C, "ATM one-to-one VCC Cell Mode" }, + { 0x000D, "ATM one-to-one VPC Cell Mode" }, + { 0x000E, "ATM AAL5 PDU VCC transport" }, + { 0x000F, "Frame-Relay Port mode" }, + { 0x0010, "SONET/SDH Circuit Emulation over Packet" }, + { 0x0011, "Structure-agnostic E1 over Packet" }, + { 0x0012, "Structure-agnostic T1 (DS1) over Packet" }, + { 0x0013, "Structure-agnostic E3 over Packet" }, + { 0x0014, "Structure-agnostic T3 (DS3) over Packet" }, + { 0x0015, "CESoPSN basic mode" }, + { 0x0016, "TDMoIP AAL1 Mode" }, + { 0x0017, "CESoPSN TDM with CAS" }, + { 0x0018, "TDMoIP AAL2 Mode" }, + { 0x0019, "Frame Relay DLCI" }, + { 0x001A, "ROHC Transport Header-compressed Packets" },/*[RFC4995][RFC4901]*/ + { 0x001B, "ECRTP Transport Header-compressed Packets" },/*[RFC3545][RFC4901]*/ + { 0x001C, "IPHC Transport Header-compressed Packets" },/*[RFC2507][RFC4901]*/ + { 0x001D, "cRTP Transport Header-compressed Packets" },/*[RFC2508][RFC4901]*/ + { 0x001E, "ATM VP Virtual Trunk" },/*[MFA9]*/ + { 0x001F, "Reserved" },/*[Bryant] 2008-04-17*/ + { 0, NULL } }; #endif @@ -316,10 +314,10 @@ 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[] = { - { 0x0007, "BFD Control, PW-ACH-encapsulated (BFD Without IP/UDP Headers)" }, - { 0x0021, "IPv4 packet" }, - { 0x0057, "IPv6 packet" }, - { 0, NULL } + { 0x0007, "BFD Control, PW-ACH-encapsulated (BFD Without IP/UDP Headers)" }, + { 0x0021, "IPv4 packet" }, + { 0x0057, "IPv6 packet" }, + { 0, NULL } }; @@ -333,8 +331,8 @@ static dissector_table_t mpls_subdissector_table; * bottom_of_stack in "bos", and TTL in "ttl" */ void decode_mpls_label(tvbuff_t *tvb, int offset, - guint32 *label, guint8 *exp, - guint8 *bos, guint8 *ttl) + guint32 *label, guint8 *exp, + guint8 *bos, guint8 *ttl) { guint8 octet0 = tvb_get_guint8(tvb, offset+0); guint8 octet1 = tvb_get_guint8(tvb, offset+1); @@ -424,23 +422,23 @@ dissect_pw_ach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) gboolean dissect_try_cw_first_nibble( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) { - guint8 nibble; - nibble = (tvb_get_guint8(tvb, 0 ) >> 4) & 0x0F; - switch ( nibble ) - { - case 6: - call_dissector( dissector_ipv6, tvb, pinfo, tree); - return TRUE; - case 4: - call_dissector( dissector_ip, tvb, pinfo, tree); - return TRUE; - case 1: - dissect_pw_ach( tvb, pinfo, tree ); - return TRUE; - default: - break; - } - return FALSE; + guint8 nibble; + nibble = (tvb_get_guint8(tvb, 0 ) >> 4) & 0x0F; + switch ( nibble ) + { + case 6: + call_dissector( dissector_ipv6, tvb, pinfo, tree); + return TRUE; + case 4: + call_dissector( dissector_ip, tvb, pinfo, tree); + return TRUE; + case 1: + dissect_pw_ach( tvb, pinfo, tree ); + return TRUE; + default: + break; + } + return FALSE; } /* @@ -479,7 +477,7 @@ dissect_pw_mcw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) return; proto_tree_add_uint_format(mpls_pw_mcw_tree, hf_mpls_pw_mcw_flags, tvb, 0, 1, flags, "Flags: 0x%02x", flags); - ti = proto_tree_add_uint_format(mpls_pw_mcw_tree, hf_mpls_pw_mcw_length, + proto_tree_add_uint_format(mpls_pw_mcw_tree, hf_mpls_pw_mcw_length, tvb, 1, 1, length, "Length: %u", length); proto_tree_add_uint_format(mpls_pw_mcw_tree, hf_mpls_pw_mcw_sequence_number, tvb, 2, 2, sequence_number, @@ -491,58 +489,58 @@ dissect_pw_mcw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static void dissect_mpls_oam_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *mpls_tree, - int offset, guint8 exp, guint8 bos, guint8 ttl) + int offset, guint8 exp, guint8 bos, guint8 ttl) { proto_tree *mpls_oam_tree = NULL; proto_item *ti = NULL; int functype = -1; const guint8 allone[] = { 0xff, 0xff }; const guint8 allzero[] = { 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00 }; + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 }; /* if called with main tree == null just set col info with func type string and return */ if (!tree) { - if (check_col(pinfo->cinfo, COL_INFO)) { - if (tvb_bytes_exist(tvb, offset, 1)) { - functype = tvb_get_guint8(tvb, offset); - col_append_fstr(pinfo->cinfo, COL_INFO, " (OAM: %s)", - (functype == 0x01) ? "CV" : - (functype == 0x02) ? "FDI" : - (functype == 0x03) ? "BDI" : - (functype == 0x07) ? "FDD" : "reserved/unknown"); - } - } - return; + if (check_col(pinfo->cinfo, COL_INFO)) { + if (tvb_bytes_exist(tvb, offset, 1)) { + functype = tvb_get_guint8(tvb, offset); + col_append_fstr(pinfo->cinfo, COL_INFO, " (OAM: %s)", + (functype == 0x01) ? "CV" : + (functype == 0x02) ? "FDI" : + (functype == 0x03) ? "BDI" : + (functype == 0x07) ? "FDD" : "reserved/unknown"); + } + } + return; } /* sanity checks */ if (!mpls_tree) - return; + return; if (!tvb_bytes_exist(tvb, offset, 44)) { - /* ITU-T Y.1711, 5.3: OAM pdus must have a minimum payload length of 44 bytes */ - proto_tree_add_text(mpls_tree, tvb, offset, -1, "Error: must have a minimum payload length of 44 bytes"); - return; + /* ITU-T Y.1711, 5.3: OAM pdus must have a minimum payload length of 44 bytes */ + proto_tree_add_text(mpls_tree, tvb, offset, -1, "Error: must have a minimum payload length of 44 bytes"); + return; } ti = proto_tree_add_text(mpls_tree, tvb, offset, 44, "MPLS Operation & Maintenance"); mpls_oam_tree = proto_item_add_subtree(ti, ett_mpls_oam); if (!mpls_oam_tree) - return; + return; /* checks for exp, bos and ttl encoding */ if (exp!=0) - proto_tree_add_text(mpls_oam_tree, tvb, offset - 2, 1, "Warning: Exp bits should be 0 for OAM"); + proto_tree_add_text(mpls_oam_tree, tvb, offset - 2, 1, "Warning: Exp bits should be 0 for OAM"); if (bos!=1) - proto_tree_add_text(mpls_oam_tree, tvb, offset - 2, 1, "Warning: S bit should be 1 for OAM"); + proto_tree_add_text(mpls_oam_tree, tvb, offset - 2, 1, "Warning: S bit should be 1 for OAM"); if (ttl!=1) - proto_tree_add_text(mpls_oam_tree, tvb, offset - 1, 1, "Warning: TTL should be 1 for OAM"); + proto_tree_add_text(mpls_oam_tree, tvb, offset - 1, 1, "Warning: TTL should be 1 for OAM"); /* starting dissection */ @@ -552,144 +550,144 @@ dissect_mpls_oam_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_ switch(functype) { case 0x01: /* CV */ - { - guint32 lsrid_ipv4addr; - - /* 3 octets reserved (all 0x00) */ - if (tvb_memeql(tvb, offset, allzero, 3) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 3, - "Error: these bytes are reserved and must be 0x00"); - } - offset+=3; - - /* ttsi (ipv4 flavor as in RFC 2373) */ - if (tvb_memeql(tvb, offset, allzero, 10) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 10, - "Error: these bytes are padding and must be 0x00"); - } - offset+=10; - - if (tvb_memeql(tvb, offset, allone, 2) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 2, - "Error: these bytes are padding and must be 0xFF"); - } - offset+=2; - - lsrid_ipv4addr = tvb_get_ipv4(tvb, offset); - proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSR ID: %s", ip_to_str((guint8 *)&lsrid_ipv4addr)); - offset+=4; - - proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSP ID: %d", tvb_get_ntohl(tvb, offset)); - offset+=4; - - /* 18 octets of padding (all 0x00) */ - if (tvb_memeql(tvb, offset, allzero, 18) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 18, - "Error: these bytes are padding and must be 0x00"); - } - offset+=18; - } - break; + { + guint32 lsrid_ipv4addr; + + /* 3 octets reserved (all 0x00) */ + if (tvb_memeql(tvb, offset, allzero, 3) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 3, + "Error: these bytes are reserved and must be 0x00"); + } + offset+=3; + + /* ttsi (ipv4 flavor as in RFC 2373) */ + if (tvb_memeql(tvb, offset, allzero, 10) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 10, + "Error: these bytes are padding and must be 0x00"); + } + offset+=10; + + if (tvb_memeql(tvb, offset, allone, 2) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 2, + "Error: these bytes are padding and must be 0xFF"); + } + offset+=2; + + lsrid_ipv4addr = tvb_get_ipv4(tvb, offset); + proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSR ID: %s", ip_to_str((guint8 *)&lsrid_ipv4addr)); + offset+=4; + + proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSP ID: %d", tvb_get_ntohl(tvb, offset)); + offset+=4; + + /* 18 octets of padding (all 0x00) */ + if (tvb_memeql(tvb, offset, allzero, 18) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 18, + "Error: these bytes are padding and must be 0x00"); + } + offset+=18; + } + break; case 0x02: /* FDI */ case 0x03: /* BDI */ - { - guint32 lsrid_ipv4addr; - - /* 1 octets reserved (all 0x00) */ - if (tvb_memeql(tvb, offset, allzero, 1) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 3, - "Error: this byte is reserved and must be 0x00"); - } - offset++; - - proto_tree_add_item(mpls_oam_tree, hf_mpls_oam_defect_type, tvb, offset, 2, TRUE); - offset+=2; - - /* ttsi (ipv4 flavor as in RFC 2373) is optional if not used must be set to all 0x00 */ - if (tvb_memeql(tvb, offset, allzero, 20) == 0) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 20, "TTSI not preset (optional for FDI/BDI)"); - offset+=20; - } else { - if (tvb_memeql(tvb, offset, allzero, 10) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 10, - "Error: these bytes are padding and must be 0x00"); - } - offset+=10; - - if (tvb_memeql(tvb, offset, allone, 2) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 2, - "Error: these bytes are padding and must be 0xFF"); - } - offset+=2; - - lsrid_ipv4addr = tvb_get_ipv4(tvb, offset); - proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSR ID: %s", ip_to_str((guint8 *)&lsrid_ipv4addr)); - offset+=4; - - proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSP ID: %d", tvb_get_ntohl(tvb, offset)); - offset+=4; - } - - /* defect location */ - proto_tree_add_item(mpls_oam_tree, hf_mpls_oam_defect_location, tvb, offset, 4, TRUE); - offset+=4; - - /* 14 octets of padding (all 0x00) */ - if (tvb_memeql(tvb, offset, allzero, 14) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 14, - "Error: these bytes are padding and must be 0x00"); - } - offset+=14; - } - break; + { + guint32 lsrid_ipv4addr; + + /* 1 octets reserved (all 0x00) */ + if (tvb_memeql(tvb, offset, allzero, 1) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 3, + "Error: this byte is reserved and must be 0x00"); + } + offset++; + + proto_tree_add_item(mpls_oam_tree, hf_mpls_oam_defect_type, tvb, offset, 2, TRUE); + offset+=2; + + /* ttsi (ipv4 flavor as in RFC 2373) is optional if not used must be set to all 0x00 */ + if (tvb_memeql(tvb, offset, allzero, 20) == 0) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 20, "TTSI not preset (optional for FDI/BDI)"); + offset+=20; + } else { + if (tvb_memeql(tvb, offset, allzero, 10) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 10, + "Error: these bytes are padding and must be 0x00"); + } + offset+=10; + + if (tvb_memeql(tvb, offset, allone, 2) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 2, + "Error: these bytes are padding and must be 0xFF"); + } + offset+=2; + + lsrid_ipv4addr = tvb_get_ipv4(tvb, offset); + proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSR ID: %s", ip_to_str((guint8 *)&lsrid_ipv4addr)); + offset+=4; + + proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSP ID: %d", tvb_get_ntohl(tvb, offset)); + offset+=4; + } + + /* defect location */ + proto_tree_add_item(mpls_oam_tree, hf_mpls_oam_defect_location, tvb, offset, 4, TRUE); + offset+=4; + + /* 14 octets of padding (all 0x00) */ + if (tvb_memeql(tvb, offset, allzero, 14) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 14, + "Error: these bytes are padding and must be 0x00"); + } + offset+=14; + } + break; case 0x07: /* FDD */ - { - guint32 lsrid_ipv4addr; - - /* 3 octets reserved (all 0x00) */ - if (tvb_memeql(tvb, offset, allzero, 3) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 3, - "Error: these bytes are reserved and must be 0x00"); - } - offset+=3; - - /* ttsi (ipv4 flavor as in RFC 2373) */ - if (tvb_memeql(tvb, offset, allzero, 10) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 10, - "Error: these bytes are padding and must be 0x00"); - } - offset+=10; - - if (tvb_memeql(tvb, offset, allone, 2) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 2, - "Error: these bytes are padding and must be 0xFF"); - } - offset+=2; - - lsrid_ipv4addr = tvb_get_ipv4(tvb, offset); - proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSR ID: %s", ip_to_str((guint8 *)&lsrid_ipv4addr)); - offset+=4; - - proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSP ID: %d", tvb_get_ntohl(tvb, offset)); - offset+=4; - - proto_tree_add_item(mpls_oam_tree, hf_mpls_oam_frequency, tvb, offset, 1, TRUE); - offset++; - - /* 17 octets of padding (all 0x00) */ - if (tvb_memeql(tvb, offset, allzero, 17) == -1) { - proto_tree_add_text(mpls_oam_tree, tvb, offset, 17, - "Error: these bytes are padding and must be 0x00"); - } - offset+=17; - } - break; + { + guint32 lsrid_ipv4addr; + + /* 3 octets reserved (all 0x00) */ + if (tvb_memeql(tvb, offset, allzero, 3) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 3, + "Error: these bytes are reserved and must be 0x00"); + } + offset+=3; + + /* ttsi (ipv4 flavor as in RFC 2373) */ + if (tvb_memeql(tvb, offset, allzero, 10) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 10, + "Error: these bytes are padding and must be 0x00"); + } + offset+=10; + + if (tvb_memeql(tvb, offset, allone, 2) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 2, + "Error: these bytes are padding and must be 0xFF"); + } + offset+=2; + + lsrid_ipv4addr = tvb_get_ipv4(tvb, offset); + proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSR ID: %s", ip_to_str((guint8 *)&lsrid_ipv4addr)); + offset+=4; + + proto_tree_add_text(mpls_oam_tree, tvb, offset, 4, "LSP ID: %d", tvb_get_ntohl(tvb, offset)); + offset+=4; + + proto_tree_add_item(mpls_oam_tree, hf_mpls_oam_frequency, tvb, offset, 1, TRUE); + offset++; + + /* 17 octets of padding (all 0x00) */ + if (tvb_memeql(tvb, offset, allzero, 17) == -1) { + proto_tree_add_text(mpls_oam_tree, tvb, offset, 17, + "Error: these bytes are padding and must be 0x00"); + } + offset+=17; + } + break; default: - proto_tree_add_text(mpls_oam_tree, tvb, offset - 1, -1, "Unknown MPLS OAM pdu"); - return; + proto_tree_add_text(mpls_oam_tree, tvb, offset - 1, -1, "Unknown MPLS OAM pdu"); + return; } /* BIP16 */ @@ -716,50 +714,50 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* Start Decoding Here. */ while (tvb_reported_length_remaining(tvb, offset) > 0) { - decode_mpls_label(tvb, offset, &label, &exp, &bos, &ttl); - pinfo->mpls_label = label; - - if (tree) { - - ti = proto_tree_add_item(tree, proto_mpls, tvb, offset, 4, FALSE); - mpls_tree = proto_item_add_subtree(ti, ett_mpls); - - proto_item_append_text(ti, ", Label: %u", label); - if (label <= LABEL_MAX_RESERVED){ - proto_tree_add_uint_format(mpls_tree, mpls_filter[MPLSF_LABEL], tvb, - offset, 3, label, "MPLS Label: %u (%s)", - label, val_to_str(label, special_labels, - "Reserved - Unknown")); - proto_item_append_text(ti, " (%s)", val_to_str(label, special_labels, - "Reserved - Unknown")); - } else { - proto_tree_add_uint_format(mpls_tree, mpls_filter[MPLSF_LABEL], tvb, - offset, 3, label, "MPLS Label: %u", label); - } - - proto_tree_add_uint(mpls_tree,mpls_filter[MPLSF_EXP], tvb, - offset+2,1, exp); - proto_item_append_text(ti, ", Exp: %u", exp); - - proto_tree_add_uint(mpls_tree,mpls_filter[MPLSF_BOTTOM_OF_STACK], tvb, - offset+2,1, bos); - proto_item_append_text(ti, ", S: %u", bos); - - proto_tree_add_uint(mpls_tree,mpls_filter[MPLSF_TTL], tvb, - offset+3,1, ttl); - proto_item_append_text(ti, ", TTL: %u", ttl); - } - - if (label == LABEL_OAM_ALERT) { - /* OAM pdus are injected in normal data plane flow in order to test a LSP, - * they carry no user data. - */ - dissect_mpls_oam_pdu(tvb, pinfo, tree, mpls_tree, offset + 4, exp, bos, ttl); - return; - } - - offset += 4; - if (bos) break; + decode_mpls_label(tvb, offset, &label, &exp, &bos, &ttl); + pinfo->mpls_label = label; + + if (tree) { + + ti = proto_tree_add_item(tree, proto_mpls, tvb, offset, 4, FALSE); + mpls_tree = proto_item_add_subtree(ti, ett_mpls); + + proto_item_append_text(ti, ", Label: %u", label); + if (label <= LABEL_MAX_RESERVED){ + proto_tree_add_uint_format(mpls_tree, mpls_filter[MPLSF_LABEL], tvb, + offset, 3, label, "MPLS Label: %u (%s)", + label, val_to_str(label, special_labels, + "Reserved - Unknown")); + proto_item_append_text(ti, " (%s)", val_to_str(label, special_labels, + "Reserved - Unknown")); + } else { + proto_tree_add_uint_format(mpls_tree, mpls_filter[MPLSF_LABEL], tvb, + offset, 3, label, "MPLS Label: %u", label); + } + + proto_tree_add_uint(mpls_tree,mpls_filter[MPLSF_EXP], tvb, + offset+2,1, exp); + proto_item_append_text(ti, ", Exp: %u", exp); + + proto_tree_add_uint(mpls_tree,mpls_filter[MPLSF_BOTTOM_OF_STACK], tvb, + offset+2,1, bos); + proto_item_append_text(ti, ", S: %u", bos); + + proto_tree_add_uint(mpls_tree,mpls_filter[MPLSF_TTL], tvb, + offset+3,1, ttl); + proto_item_append_text(ti, ", TTL: %u", ttl); + } + + if (label == LABEL_OAM_ALERT) { + /* OAM pdus are injected in normal data plane flow in order to test a LSP, + * they carry no user data. + */ + dissect_mpls_oam_pdu(tvb, pinfo, tree, mpls_tree, offset + 4, exp, bos, ttl); + return; + } + + offset += 4; + if (bos) break; } next_tvb = tvb_new_subset_remaining(tvb, offset); @@ -808,7 +806,7 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) call_dissector(dissector_mpls_pw_atm_aal5_sdu, next_tvb, pinfo, tree); break; default: /*fallthrough*/ - case MDD_MPLS_PW_GENERIC: + case MDD_MPLS_PW_GENERIC: dissect_pw_mcw(next_tvb, pinfo, tree); break; } @@ -818,192 +816,186 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) void proto_register_mpls(void) { - static hf_register_info mplsf_info[] = { - - /* MPLS header fields */ - {&mpls_filter[MPLSF_LABEL], - {"MPLS Label", "mpls.label", FT_UINT32, BASE_DEC, VALS(special_labels), 0x0, - NULL, HFILL }}, - - {&mpls_filter[MPLSF_EXP], - {"MPLS Experimental Bits", "mpls.exp", FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL }}, - - {&mpls_filter[MPLSF_BOTTOM_OF_STACK], - {"MPLS Bottom Of Label Stack", "mpls.bottom", FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL }}, - - {&mpls_filter[MPLSF_TTL], - {"MPLS TTL", "mpls.ttl", FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL }}, - - /* 1st nibble */ - {&hf_mpls_1st_nibble, - {"MPLS 1st nibble", "mpls.1st_nibble", FT_UINT8, - BASE_DEC, NULL, 0x0, NULL, HFILL }}, - - /* PW Associated Channel Header fields */ - {&hf_mpls_pw_ach_ver, - {"PW Associated Channel Version", "pwach.ver", FT_UINT8, BASE_DEC, - NULL, 0x0, NULL, HFILL }}, - - {&hf_mpls_pw_ach_res, - {"Reserved", "pwach.res", FT_UINT8, BASE_DEC, - NULL, 0x0, NULL, HFILL }}, - - {&hf_mpls_pw_ach_channel_type, - {"PW Associated Channel Type", "pwach.channel_type", FT_UINT16, BASE_HEX, - NULL, 0x0, NULL, HFILL }}, - - /* Generic/Preferred PW MPLS Control Word fields */ - {&hf_mpls_pw_mcw_flags, - {"Generic/Preferred PW MPLS Control Word Flags", "pwmcw.flags", FT_UINT8, - BASE_HEX, NULL, 0x0, NULL, - HFILL }}, - - {&hf_mpls_pw_mcw_length, - {"Generic/Preferred PW MPLS Control Word Length", "pwmcw.length", FT_UINT8, - BASE_DEC, NULL, 0x0, NULL, - HFILL }}, - - {&hf_mpls_pw_mcw_sequence_number, - {"Generic/Preferred PW MPLS Control Word Sequence Number", - "pwmcw.sequence_number", FT_UINT16, BASE_DEC, NULL, 0x0, - NULL, HFILL }}, - - /* OAM header fields */ - {&hf_mpls_oam_function_type, - {"Function Type", "mpls.oam.function_type", FT_UINT8, - BASE_HEX, VALS(oam_function_type_vals), 0x0, "Function Type codepoint", HFILL }}, - - {&hf_mpls_oam_ttsi, - {"Trail Termination Source Identifier", "mpls.oam.ttsi", FT_UINT32, - BASE_HEX, NULL, 0x0, NULL, HFILL }}, - - {&hf_mpls_oam_frequency, - {"Frequency", "mpls.oam.frequency", FT_UINT8, - BASE_HEX, VALS(oam_frequency_vals), 0x0, "Frequency of probe injection", HFILL }}, - - {&hf_mpls_oam_defect_type, - {"Defect Type", "mpls.oam.defect_type", FT_UINT16, - BASE_HEX, VALS(oam_defect_type_vals), 0x0, NULL, HFILL }}, - - {&hf_mpls_oam_defect_location, - {"Defect Location (AS)", "mpls.oam.defect_location", FT_UINT32, - BASE_DEC, NULL, 0x0, "Defect Location", HFILL }}, - - {&hf_mpls_oam_bip16, - {"BIP16", "mpls.oam.bip16", FT_UINT16, - BASE_HEX, NULL, 0x0, NULL, HFILL }}, - }; - - static gint *ett[] = { - &ett_mpls, - &ett_mpls_pw_ach, - &ett_mpls_pw_mcw, - &ett_mpls_oam, - }; - module_t * module_mpls; - - /* FF: mpls subdissector table is indexed by label */ - mpls_subdissector_table = register_dissector_table("mpls.label", - "MPLS protocol", - 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", - "PW Associated Channel", "pwach"); - proto_pw_mcw = proto_register_protocol("PW MPLS Control Word (generic/preferred)", - "Generic PW (with CW)", "pwmcw"); - - proto_register_field_array(proto_mpls, mplsf_info, array_length(mplsf_info)); - proto_register_subtree_array(ett, array_length(ett)); - register_dissector("mpls", dissect_mpls, proto_mpls); - register_dissector("mplspwcw", dissect_pw_mcw, proto_pw_mcw ); - - module_mpls = prefs_register_protocol( proto_mpls, proto_reg_handoff_mpls ); - - prefs_register_enum_preference( module_mpls, - "mplspref.payload", - "Default decoder for MPLS payload", - "Default decoder for MPLS payload", - &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); + static hf_register_info mplsf_info[] = { + + /* MPLS header fields */ + {&mpls_filter[MPLSF_LABEL], + {"MPLS Label", "mpls.label", FT_UINT32, BASE_DEC, VALS(special_labels), 0x0, + NULL, HFILL }}, + + {&mpls_filter[MPLSF_EXP], + {"MPLS Experimental Bits", "mpls.exp", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + {&mpls_filter[MPLSF_BOTTOM_OF_STACK], + {"MPLS Bottom Of Label Stack", "mpls.bottom", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + {&mpls_filter[MPLSF_TTL], + {"MPLS TTL", "mpls.ttl", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + /* 1st nibble */ + {&hf_mpls_1st_nibble, + {"MPLS 1st nibble", "mpls.1st_nibble", FT_UINT8, + BASE_DEC, NULL, 0x0, NULL, HFILL }}, + + /* PW Associated Channel Header fields */ + {&hf_mpls_pw_ach_ver, + {"PW Associated Channel Version", "pwach.ver", FT_UINT8, BASE_DEC, + NULL, 0x0, NULL, HFILL }}, + + {&hf_mpls_pw_ach_res, + {"Reserved", "pwach.res", FT_UINT8, BASE_DEC, + NULL, 0x0, NULL, HFILL }}, + + {&hf_mpls_pw_ach_channel_type, + {"PW Associated Channel Type", "pwach.channel_type", FT_UINT16, BASE_HEX, + NULL, 0x0, NULL, HFILL }}, + + /* Generic/Preferred PW MPLS Control Word fields */ + {&hf_mpls_pw_mcw_flags, + {"Generic/Preferred PW MPLS Control Word Flags", "pwmcw.flags", FT_UINT8, + BASE_HEX, NULL, 0x0, NULL, + HFILL }}, + + {&hf_mpls_pw_mcw_length, + {"Generic/Preferred PW MPLS Control Word Length", "pwmcw.length", FT_UINT8, + BASE_DEC, NULL, 0x0, NULL, + HFILL }}, + + {&hf_mpls_pw_mcw_sequence_number, + {"Generic/Preferred PW MPLS Control Word Sequence Number", + "pwmcw.sequence_number", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + /* OAM header fields */ + {&hf_mpls_oam_function_type, + {"Function Type", "mpls.oam.function_type", FT_UINT8, + BASE_HEX, VALS(oam_function_type_vals), 0x0, "Function Type codepoint", HFILL }}, + + {&hf_mpls_oam_ttsi, + {"Trail Termination Source Identifier", "mpls.oam.ttsi", FT_UINT32, + BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_mpls_oam_frequency, + {"Frequency", "mpls.oam.frequency", FT_UINT8, + BASE_HEX, VALS(oam_frequency_vals), 0x0, "Frequency of probe injection", HFILL }}, + + {&hf_mpls_oam_defect_type, + {"Defect Type", "mpls.oam.defect_type", FT_UINT16, + BASE_HEX, VALS(oam_defect_type_vals), 0x0, NULL, HFILL }}, + + {&hf_mpls_oam_defect_location, + {"Defect Location (AS)", "mpls.oam.defect_location", FT_UINT32, + BASE_DEC, NULL, 0x0, "Defect Location", HFILL }}, + + {&hf_mpls_oam_bip16, + {"BIP16", "mpls.oam.bip16", FT_UINT16, + BASE_HEX, NULL, 0x0, NULL, HFILL }}, + }; + + static gint *ett[] = { + &ett_mpls, + &ett_mpls_pw_ach, + &ett_mpls_pw_mcw, + &ett_mpls_oam, + }; + module_t * module_mpls; + + /* FF: mpls subdissector table is indexed by label */ + mpls_subdissector_table = register_dissector_table("mpls.label", + "MPLS protocol", + 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", + "PW Associated Channel", "pwach"); + proto_pw_mcw = proto_register_protocol("PW MPLS Control Word (generic/preferred)", + "Generic PW (with CW)", "pwmcw"); + + proto_register_field_array(proto_mpls, mplsf_info, array_length(mplsf_info)); + proto_register_subtree_array(ett, array_length(ett)); + register_dissector("mpls", dissect_mpls, proto_mpls); + register_dissector("mplspwcw", dissect_pw_mcw, proto_pw_mcw ); + + module_mpls = prefs_register_protocol( proto_mpls, NULL ); + + prefs_register_enum_preference(module_mpls, + "mplspref.payload", + "Default decoder for MPLS payload", + "Default decoder for MPLS payload", + &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) { - static gboolean initialized=FALSE; - - if ( !initialized ) - { - 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); - dissector_add_uint("gre.proto", ETHERTYPE_MPLS_MULTI, mpls_handle); - dissector_add_uint("ip.proto", IP_PROTO_MPLS_IN_IP, mpls_handle); - - mpls_handle = find_dissector("mplspwcw"); - dissector_add_uint( "mpls.label", LABEL_INVALID, mpls_handle ); - - dissector_data = find_dissector("data"); - dissector_ipv6 = find_dissector("ipv6"); - dissector_ip = find_dissector("ip"); - dissector_bfd = find_dissector("bfd"); - 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"); - dissector_itdm = find_dissector("itdm"); - dissector_mpls_pw_atm_n1_cw = find_dissector("mpls_pw_atm_n1_cw"); - dissector_mpls_pw_atm_n1_nocw = find_dissector("mpls_pw_atm_n1_nocw"); - dissector_mpls_pw_atm_11_aal5pdu= find_dissector("mpls_pw_atm_11_or_aal5_pdu"); - dissector_mpls_pw_atm_aal5_sdu = find_dissector("mpls_pw_atm_aal5_sdu"); - dissector_pw_cesopsn = find_dissector("pw_cesopsn_mpls"); - - initialized = TRUE; - } + 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); + dissector_add_uint("gre.proto", ETHERTYPE_MPLS_MULTI, mpls_handle); + dissector_add_uint("ip.proto", IP_PROTO_MPLS_IN_IP, mpls_handle); + + mpls_handle = find_dissector("mplspwcw"); + dissector_add_uint( "mpls.label", LABEL_INVALID, mpls_handle ); + + dissector_data = find_dissector("data"); + dissector_ipv6 = find_dissector("ipv6"); + dissector_ip = find_dissector("ip"); + dissector_bfd = find_dissector("bfd"); + 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"); + dissector_itdm = find_dissector("itdm"); + dissector_mpls_pw_atm_n1_cw = find_dissector("mpls_pw_atm_n1_cw"); + dissector_mpls_pw_atm_n1_nocw = find_dissector("mpls_pw_atm_n1_nocw"); + dissector_mpls_pw_atm_11_aal5pdu= find_dissector("mpls_pw_atm_11_or_aal5_pdu"); + dissector_mpls_pw_atm_aal5_sdu = find_dissector("mpls_pw_atm_aal5_sdu"); + dissector_pw_cesopsn = find_dissector("pw_cesopsn_mpls"); + } |