aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorAlexis La Goutte <alexis.lagoutte@gmail.com>2012-03-11 19:05:32 +0000
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2012-03-11 19:05:32 +0000
commit55ca59ffb94242b717c7b24fd2a9872f8fccf49a (patch)
tree3439036cf5aae1b1ea9ca0c8a63af67cd0c74c39 /epan/dissectors
parent69b533085bcbd4c2a90e8a96fb971dda00f68465 (diff)
From Francesco Fondelli via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6787
Move Y.1711 out of MPLS dissector ITU-T Y.1711 code was "embedded" into the MPLS dissector in 2006. This patch moves it into its own dissector. From me : Fix a Clang warning svn path=/trunk/; revision=41486
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/Makefile.common1
-rw-r--r--epan/dissectors/packet-mpls-y1711.c443
-rw-r--r--epan/dissectors/packet-mpls.c316
-rw-r--r--epan/dissectors/packet-mpls.h18
4 files changed, 469 insertions, 309 deletions
diff --git a/epan/dissectors/Makefile.common b/epan/dissectors/Makefile.common
index 8f9e5f5fa9..6c834e29df 100644
--- a/epan/dissectors/Makefile.common
+++ b/epan/dissectors/Makefile.common
@@ -735,6 +735,7 @@ DISSECTOR_SRC = \
packet-mpls.c \
packet-mpls-echo.c \
packet-mpls-pm.c \
+ packet-mpls-y1711.c \
packet-mq.c \
packet-mq-pcf.c \
packet-mrdisc.c \
diff --git a/epan/dissectors/packet-mpls-y1711.c b/epan/dissectors/packet-mpls-y1711.c
new file mode 100644
index 0000000000..112e247526
--- /dev/null
+++ b/epan/dissectors/packet-mpls-y1711.c
@@ -0,0 +1,443 @@
+/* packet-mpls-y1711.c
+ * Routines for (old) ITU-T MPLS OAM: it conforms to ITU-T Y.1711 and RFC 3429
+ *
+ * Copyright 2006, 2011 _FF_
+ *
+ * Francesco Fondelli <francesco dot fondelli, gmail dot com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * FF: NOTES
+ *
+ * - this should dissect OAM pdus (identified by the LABEL_OAM_ALERT = 14
+ * label) as described in ITU-T Y.1711 and RFC 3429.
+ *
+ * - this code used to be (since 2006) in packet-mpls.c ... nobody on this
+ * planet is using Y.1711 today (?), so thanks to the mpls subdissector
+ * table indexed by label value it has been moved here.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <glib.h>
+#include <epan/packet.h>
+#include <epan/addr_resolv.h>
+
+#include "packet-mpls.h"
+
+static gint proto_mpls_y1711 = -1;
+
+static int hf_mpls_y1711_function_type = -1;
+static int hf_mpls_y1711_ttsi = -1;
+static int hf_mpls_y1711_frequency = -1;
+static int hf_mpls_y1711_defect_type = -1;
+static int hf_mpls_y1711_defect_location = -1;
+static int hf_mpls_y1711_bip16 = -1;
+
+static gint ett_mpls_y1711 = -1;
+
+static dissector_handle_t mpls_y1711_handle;
+
+static const value_string y1711_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)" },
+ {0, NULL }
+};
+
+static const value_string y1711_frequency_vals[] = {
+ {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 y1711_defect_type_vals[] = {
+ {0x0000, "Reserved" },
+ {0x0101, "dServer" },
+ {0x0102, "dPeerME" },
+ {0x0201, "dLOCV" },
+ {0x0202, "dTTSI_Mismatch"},
+ {0x0203, "dTTSI_Mismerge"},
+ {0x0204, "dExcess" },
+ {0x02FF, "dUnknown" },
+ {0xFFFF, "Reserved" },
+ {0, NULL }
+};
+
+static int
+dissect_mpls_y1711(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ proto_tree *mpls_y1711_tree = NULL;
+ struct mplsinfo *mplsinfo = pinfo->private_data;
+ proto_item *ti = NULL;
+ int functype = -1;
+ int offset = 0;
+ 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 };
+
+ /*
+ * 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, " (Y.1711: %s)",
+ (functype == 0x01) ? "CV" :
+ (functype == 0x02) ? "FDI" :
+ (functype == 0x03) ? "BDI" :
+ (functype == 0x07) ? "FDD" :
+ "reserved/unknown");
+ }
+ }
+ return 0;
+ }
+
+ /* sanity checks */
+ if (!tree)
+ return 0;
+
+ if (!tvb_bytes_exist(tvb, offset, 44)) {
+ /*
+ * ITU-T Y.1711, 5.3: PDUs must have a minimum payload length of
+ * 44 bytes
+ */
+ proto_tree_add_text(tree, tvb, offset, -1,
+ "Error: must have a minimum payload "
+ "length of 44 bytes");
+ return 0;
+ }
+
+ ti = proto_tree_add_text(tree, tvb, offset, 44, "Y.1711 OAM");
+ mpls_y1711_tree = proto_item_add_subtree(ti, ett_mpls_y1711);
+
+ if (!mpls_y1711_tree)
+ return 0;
+
+ /* checks for exp, bos and ttl encoding */
+ if (mplsinfo->label != LABEL_OAM_ALERT)
+ proto_tree_add_text(mpls_y1711_tree, tvb, offset - 4, 3,
+ "Warning: Y.1711 but no OAM alert label (%d) ?!",
+ LABEL_OAM_ALERT);
+
+ if (mplsinfo->exp != 0)
+ proto_tree_add_text(mpls_y1711_tree, tvb, offset - 2, 1,
+ "Warning: Exp bits should be 0 for Y.1711");
+
+ if (mplsinfo->bos != 1)
+ proto_tree_add_text(mpls_y1711_tree, tvb, offset - 2, 1,
+ "Warning: S bit should be 1 for Y.1711");
+
+ if (mplsinfo->ttl != 1)
+ proto_tree_add_text(mpls_y1711_tree, tvb, offset - 1, 1,
+ "Warning: TTL should be 1 for Y.1711");
+
+ /* starting dissection */
+ functype = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(mpls_y1711_tree, hf_mpls_y1711_function_type, tvb,
+ offset, 1,
+ ENC_LITTLE_ENDIAN);
+ offset++;
+
+ 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_y1711_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_y1711_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_y1711_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_y1711_tree, tvb, offset, 4, "LSR ID: %s",
+ ip_to_str((guint8 *) &lsrid_ipv4addr));
+ offset += 4;
+
+ proto_tree_add_text(mpls_y1711_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_y1711_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_y1711_tree, tvb, offset, 3,
+ "Error: this byte is reserved "
+ "and must be 0x00");
+ }
+ offset++;
+
+ proto_tree_add_item(mpls_y1711_tree, hf_mpls_y1711_defect_type, tvb,
+ offset, 2,
+ ENC_LITTLE_ENDIAN);
+ 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_y1711_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_y1711_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_y1711_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_y1711_tree, tvb, offset, 4, "LSR ID: %s",
+ ip_to_str((guint8 *) &lsrid_ipv4addr));
+ offset += 4;
+
+ proto_tree_add_text(mpls_y1711_tree, tvb, offset, 4, "LSP ID: %d",
+ tvb_get_ntohl(tvb, offset));
+ offset += 4;
+ }
+
+ /* defect location */
+ proto_tree_add_item(mpls_y1711_tree, hf_mpls_y1711_defect_location, tvb,
+ offset, 4,
+ ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ /* 14 octets of padding (all 0x00) */
+ if (tvb_memeql(tvb, offset, allzero, 14) == -1) {
+ proto_tree_add_text(mpls_y1711_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_y1711_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_y1711_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_y1711_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_y1711_tree, tvb, offset, 4, "LSR ID: %s",
+ ip_to_str((guint8 *)&lsrid_ipv4addr));
+ offset += 4;
+
+ proto_tree_add_text(mpls_y1711_tree, tvb, offset, 4, "LSP ID: %d",
+ tvb_get_ntohl(tvb,offset));
+ offset += 4;
+
+ proto_tree_add_item(mpls_y1711_tree, hf_mpls_y1711_frequency, tvb,
+ offset, 1,
+ ENC_LITTLE_ENDIAN);
+ offset++;
+
+ /* 17 octets of padding (all 0x00) */
+ if (tvb_memeql(tvb, offset, allzero, 17) == -1) {
+ proto_tree_add_text(mpls_y1711_tree, tvb, offset, 17,
+ "Error: these bytes are padding and "
+ "must be 0x00");
+ }
+ offset += 17;
+ }
+ break;
+
+ default:
+ proto_tree_add_text(mpls_y1711_tree, tvb, offset - 1, -1,
+ "Unknown MPLS Y.1711 PDU");
+ return offset;
+ }
+
+ /* BIP16 */
+ proto_tree_add_item(mpls_y1711_tree, hf_mpls_y1711_bip16, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ return offset;
+}
+
+void
+proto_register_mpls_y1711(void)
+{
+ static hf_register_info hf[] = {
+ {
+ &hf_mpls_y1711_function_type,
+ {
+ "Function Type", "mpls.y1711.function_type", FT_UINT8,
+ BASE_HEX, VALS(y1711_function_type_vals),
+ 0x0, "Function Type codepoint", HFILL
+ }
+ },
+ {
+ &hf_mpls_y1711_ttsi,
+ {
+ "Trail Termination Source Identifier",
+ "mpls.y1711.ttsi",
+ FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL
+ }
+ },
+ {
+ &hf_mpls_y1711_frequency,
+ {
+ "Frequency", "mpls.y1711.frequency", FT_UINT8,
+ BASE_HEX, VALS(y1711_frequency_vals), 0x0,
+ "Frequency of probe injection", HFILL
+ }
+ },
+ {
+ &hf_mpls_y1711_defect_type,
+ {
+ "Defect Type", "mpls.y1711.defect_type", FT_UINT16,
+ BASE_HEX, VALS(y1711_defect_type_vals), 0x0, NULL, HFILL
+ }
+ },
+ {
+ &hf_mpls_y1711_defect_location,
+ {
+ "Defect Location (AS)", "mpls.y1711.defect_location",
+ FT_UINT32, BASE_DEC, NULL, 0x0, "Defect Location", HFILL
+ }
+ },
+ {
+ &hf_mpls_y1711_bip16,
+ {
+ "BIP16", "mpls.y1711.bip16", FT_UINT16,
+ BASE_HEX, NULL, 0x0, NULL, HFILL
+ }
+ },
+ };
+
+ static gint *ett[] = {
+ &ett_mpls_y1711
+ };
+
+ proto_mpls_y1711 =
+ proto_register_protocol("MPLS ITU-T Y.1711 OAM",
+ "MPLS ITU-T Y.1711 OAM",
+ "mplsy1711");
+ proto_register_field_array(proto_mpls_y1711, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+ new_register_dissector("mpls_y1711", dissect_mpls_y1711, proto_mpls_y1711);
+}
+
+void
+proto_reg_handoff_mpls_y1711(void)
+{
+ mpls_y1711_handle = find_dissector("mpls_y1711");
+ dissector_add_uint("mpls.label",
+ LABEL_OAM_ALERT /* 14 */,
+ mpls_y1711_handle);
+}
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=4 expandtab:
+ * :indentSize=4:tabSize=4:noTabs=true:
+ */
diff --git a/epan/dissectors/packet-mpls.c b/epan/dissectors/packet-mpls.c
index b4aa0c66fd..722ccd2a69 100644
--- a/epan/dissectors/packet-mpls.c
+++ b/epan/dissectors/packet-mpls.c
@@ -45,19 +45,6 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-/*
- * NOTES
- *
- * This module defines routines to handle Ethernet-encapsulated MPLS IP packets.
- * It should implement all the functionality in <draft-ietf-mpls-label-encaps-07.txt>
- * Multicast MPLS support is not tested yet
- */
-
-/* FF NOTES
- *
- * The OAM patch should dissect OAM pdus as described in ITU-T Y.1711
- */
-
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -88,7 +75,6 @@ static gint proto_pw_mcw = -1;
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[] = {
@@ -248,50 +234,6 @@ static int hf_mpls_pw_mcw_flags = -1;
static int hf_mpls_pw_mcw_length = -1;
static int hf_mpls_pw_mcw_sequence_number = -1;
-static int hf_mpls_oam_function_type = -1;
-static int hf_mpls_oam_ttsi = -1;
-static int hf_mpls_oam_frequency = -1;
-static int hf_mpls_oam_defect_type = -1;
-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)"},
- {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"},
- /* 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"},
- {0, NULL }
-};
-
#if 0 /*not used yet*/
/*
* MPLS PW types
@@ -367,7 +309,6 @@ static const value_string mpls_pwac_types[] = {
{ 0, NULL }
};
-
static dissector_table_t mpls_subdissector_table;
/*
@@ -588,216 +529,6 @@ dissect_pw_mcw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
call_dissector( dissector_data, next_tvb, pinfo, tree );
}
-static int
-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)
-{
- 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 };
-
- /* 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 0;
- }
-
- /* sanity checks */
- if (!mpls_tree)
- return 0;
-
- 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 0;
- }
-
- 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 0;
-
- /* 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");
-
- if (bos!=1)
- 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");
-
- /* starting dissection */
-
- functype = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(mpls_oam_tree, hf_mpls_oam_function_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
-
- 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;
-
- 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, ENC_LITTLE_ENDIAN);
- 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, ENC_LITTLE_ENDIAN);
- 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, ENC_LITTLE_ENDIAN);
- 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 0;
- }
-
- /* BIP16 */
- proto_tree_add_item(mpls_oam_tree, hf_mpls_oam_bip16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset+=2;
-
- return offset;
-}
-
static void
dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
@@ -806,9 +537,10 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint8 exp;
guint8 bos;
guint8 ttl;
- proto_tree *mpls_tree = NULL;
- proto_item *ti;
+ proto_tree *mpls_tree = NULL;
+ proto_item *ti;
tvbuff_t *next_tvb;
+ struct mplsinfo mplsinfo;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPLS");
@@ -818,7 +550,13 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
while (tvb_reported_length_remaining(tvb, offset) > 0) {
decode_mpls_label(tvb, offset, &label, &exp, &bos, &ttl);
- pinfo->mpls_label = label;
+
+ /* FF: export (last shim in stack) info to subdissectors */
+ mplsinfo.label = label;
+ mplsinfo.exp = exp;
+ mplsinfo.bos = bos;
+ mplsinfo.ttl = ttl;
+ pinfo->private_data = &mplsinfo;
if (tree) {
@@ -851,14 +589,6 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
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 (label == LABEL_GACH && !bos)
@@ -986,38 +716,12 @@ proto_register_mpls(void)
{"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;
diff --git a/epan/dissectors/packet-mpls.h b/epan/dissectors/packet-mpls.h
index df038c61d3..d1d367a992 100644
--- a/epan/dissectors/packet-mpls.h
+++ b/epan/dissectors/packet-mpls.h
@@ -38,10 +38,21 @@ enum {
LABEL_ROUTER_ALERT,
LABEL_IP6_EXPLICIT_NULL,
LABEL_IMPLICIT_NULL,
+ LABEL_GACH = 13, /* aka GAL */
LABEL_OAM_ALERT = 14,
LABEL_MAX_RESERVED = 15,
- LABEL_GACH = 13,
- LABEL_INVALID = 0xffffffff
+ LABEL_INVALID = 0xffffffff
+};
+
+/*
+ * FF: private data passed from the MPLS dissector to subdissectors
+ * (pinfo->private_data).
+ */
+struct mplsinfo {
+ guint32 label; /* last mpls label in label stack */
+ guint8 exp; /* former EXP bits of last mpls shim in stack */
+ guint8 bos; /* BOS bit of last mpls shim in stack */
+ guint8 ttl; /* TTL bits of last mpls shim in stack */
};
extern const value_string special_labels[];
@@ -49,7 +60,8 @@ extern void decode_mpls_label(tvbuff_t *tvb, int offset,
guint32 *label, guint8 *exp,
guint8 *bos, guint8 *ttl);
-extern gboolean dissect_try_cw_first_nibble( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree );
+extern gboolean dissect_try_cw_first_nibble(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree );
void dissect_mpls_echo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
#endif