- Added support for LMP draft versions -02 and -03 (selectable in

protocol preferences)

- Added OSPF display filtering support, including OSPF/TE extensions

svn path=/trunk/; revision=5437
This commit is contained in:
Ashok Narayanan 2002-05-10 18:37:38 +00:00
parent 38dafc2bfa
commit 292d541884
2 changed files with 361 additions and 83 deletions

View File

@ -3,7 +3,7 @@
*
* (c) Copyright Ashok Narayanan <ashokn@cisco.com>
*
* $Id: packet-lmp.c,v 1.5 2002/04/29 08:20:09 guy Exp $
* $Id: packet-lmp.c,v 1.6 2002/05/10 18:37:38 ashokn Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -27,7 +27,9 @@
/*
* LMP as a standard has shown a remarkable ability to get completely rewritten
* across minor versions of the draft. This file currently implements
* the version described in draft-ietf-ccamp-lmp-03.txt
* two versions of LMP; described in draft-ietf-ccamp-lmp-02.txt and
* draft-ietf-ccamp-lmp-03.txt. The -03 version is the default; the
* version being dissected can be changed from the LMP protocol preferences
*/
#ifdef HAVE_CONFIG_H
@ -59,6 +61,7 @@
#include <epan/tvbuff.h>
#include <epan/packet.h>
#include <prefs.h>
#include "in_cksum.h"
#include "etypes.h"
#include "ipproto.h"
@ -67,8 +70,10 @@
#include "packet-rsvp.h"
static int proto_lmp = -1;
#define LMP_VER_DRAFT_CCAMP_02 2
#define LMP_VER_DRAFT_CCAMP_03 3
static int lmp_draft_ver = LMP_VER_DRAFT_CCAMP_03;
/* #define IP_PROTO_LMP 0x6e */
#define IP_PROTO_LMP 140
/*----------------------------------------------------------------------
@ -321,6 +326,9 @@ enum lmp_filter_keys {
LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID,
LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK,
LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK,
LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS,
LMPF_VAL_ERROR_CONFIG_RENEGOTIATE,
LMPF_VAL_ERROR_CONFIG_BAD_CCID,
LMPF_MAX,
};
@ -698,6 +706,16 @@ static hf_register_info lmpf_info[] = {
{&lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
{ "Summary - Bad Data Link Object", "lmp.error.summary_bad_data_link",
FT_BOOLEAN, 8, NULL, 0x10, "", HFILL }},
{&lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS],
{ "Config - Unacceptable non-negotiable parameters", "lmp.error.config_bad_params",
FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
{&lmp_filter[LMPF_VAL_ERROR_CONFIG_RENEGOTIATE],
{ "Config - Renegotiate Parametere", "lmp.error.config_renegotiate",
FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
{&lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_CCID],
{ "Config - Bad CC ID", "lmp.error.config_bad_ccid",
FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
};
static int
@ -1357,54 +1375,123 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
ti2 = proto_tree_add_uint(lmp_object_tree, lmp_filter[LMPF_VAL_ERROR],
tvb, offset2, 4, l);
switch(type) {
case 1:
proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
(l&0x01) ? "Unsupported-Link " : "",
(l&0x02) ? "Unwilling" : "",
(l&0x04) ? "Unsupported-Transport" : "",
(l&0x08) ? "TE-Link-ID" : "");
lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
tvb, offset, 4, l);
break;
case 2:
proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s%s%s",
(l&0x01) ? "Unacceptable-Params " : "",
(l&0x02) ? "Renegotiate" : "",
(l&0x04) ? "Remote-Link-ID" : "",
(l&0x08) ? "TE-Link" : "",
(l&0x10) ? "Data-Link" : "");
lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
tvb, offset, 4, l);
/* Errors are different in draft-02 and draft-03 */
switch(lmp_draft_ver) {
case LMP_VER_DRAFT_CCAMP_02:
switch(type) {
case 1:
proto_item_append_text(ti, ": CONFIG_ERROR: %s%s%s",
(l&0x01) ? "Unacceptable-Params " : "",
(l&0x02) ? "Renegotiate" : "",
(l&0x04) ? "Bad Received CCID" : "");
lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_PARAMETERS],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_CONFIG_RENEGOTIATE],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_CONFIG_BAD_CCID],
tvb, offset, 4, l);
break;
case 2:
proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
(l&0x01) ? "Unsupported-Link " : "",
(l&0x02) ? "Unwilling" : "",
(l&0x04) ? "Unsupported-Transport" : "",
(l&0x08) ? "TE-Link-ID" : "");
lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
tvb, offset, 4, l);
break;
case 3:
proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s",
(l&0x01) ? "Unacceptable-Params " : "",
(l&0x02) ? "Renegotiate" : "",
(l&0x04) ? "Remote-Link-ID" : "");
lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
tvb, offset, 4, l);
break;
default:
proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l);
proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
"Data (%d bytes)", mylen);
break;
}
break;
default:
proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
"Data (%d bytes)", mylen);
case LMP_VER_DRAFT_CCAMP_03:
switch(type) {
case 1:
proto_item_append_text(ti, ": BEGIN_VERIFY_ERROR: %s%s%s%s",
(l&0x01) ? "Unsupported-Link " : "",
(l&0x02) ? "Unwilling" : "",
(l&0x04) ? "Unsupported-Transport" : "",
(l&0x08) ? "TE-Link-ID" : "");
lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_UNSUPPORTED_LINK],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_UNWILLING],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_TRANSPORT],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_VERIFY_TE_LINK_ID],
tvb, offset, 4, l);
break;
case 2:
proto_item_append_text(ti, ": LINK_SUMMARY_ERROR: %s%s%s%s%s",
(l&0x01) ? "Unacceptable-Params " : "",
(l&0x02) ? "Renegotiate" : "",
(l&0x04) ? "Remote-Link-ID" : "",
(l&0x08) ? "TE-Link" : "",
(l&0x10) ? "Data-Link" : "");
lmp_flags_tree = proto_item_add_subtree(ti2, lmp_subtree[LMP_TREE_ERROR_FLAGS]);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_PARAMETERS],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_RENEGOTIATE],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_REMOTE_LINK_ID],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_TE_LINK],
tvb, offset, 4, l);
proto_tree_add_boolean(lmp_flags_tree,
lmp_filter[LMPF_VAL_ERROR_SUMMARY_BAD_DATA_LINK],
tvb, offset, 4, l);
break;
default:
proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l);
proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen,
"Data (%d bytes)", mylen);
break;
}
break;
}
break;
@ -1422,6 +1509,24 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
static void
register_lmp_prefs (void)
{
module_t *lmp_module;
static enum_val_t lmp_ver[] = {
{"draft-ietf-ccamp-lmp-03", LMP_VER_DRAFT_CCAMP_03},
{"draft-ietf-ccamp-lmp-02", LMP_VER_DRAFT_CCAMP_02},
{NULL, -1}
};
lmp_module = prefs_register_protocol(proto_lmp, NULL);
prefs_register_enum_preference(
lmp_module, "lmp_version",
"Draft version of LMP",
"Specifies the IETF CCAMP draft version of LMP to interpret",
&lmp_draft_ver, lmp_ver, FALSE);
}
void
proto_register_lmp(void)
{
@ -1437,6 +1542,8 @@ proto_register_lmp(void)
"LMP", "lmp");
proto_register_field_array(proto_lmp, lmpf_info, array_length(lmpf_info));
proto_register_subtree_array(ett, array_length(ett));
register_lmp_prefs();
}
void

View File

@ -2,7 +2,7 @@
* Routines for OSPF packet disassembly
* (c) Copyright Hannes R. Boehm <hannes@boehm.org>
*
* $Id: packet-ospf.c,v 1.61 2002/04/25 06:34:41 guy Exp $
* $Id: packet-ospf.c,v 1.62 2002/05/10 18:37:38 ashokn Exp $
*
* At this time, this module is able to analyze OSPF
* packets as specified in RFC2328. MOSPF (RFC1584) and other
@ -206,6 +206,170 @@ static gint ett_ospf_lsa_mpls_router = -1;
static gint ett_ospf_lsa_mpls_link = -1;
static gint ett_ospf_lsa_mpls_link_stlv = -1;
/*-----------------------------------------------------------------------
* OSPF Filtering
*-----------------------------------------------------------------------*/
/* The OSPF filtering keys */
enum {
OSPFF_MSG_TYPE,
OSPFF_MSG_MIN,
OSPFF_MSG_HELLO,
OSPFF_MSG_DB_DESC,
OSPFF_MSG_LS_REQ,
OSPFF_MSG_LS_UPD,
OSPFF_MSG_LS_ACK,
OSPFF_LS_TYPE,
OSPFF_LS_MIN,
OSPFF_LS_ROUTER,
OSPFF_LS_NETWORK,
OSPFF_LS_SUMMARY,
OSPFF_LS_ASBR,
OSPFF_LS_ASEXT,
OSPFF_LS_GRPMEMBER,
OSPFF_LS_ASEXT7,
OSPFF_LS_EXTATTR,
OSPFF_LS_OPAQUE,
OSPFF_SRC_ROUTER,
OSPFF_ADV_ROUTER,
OSPFF_LS_MPLS,
OSPFF_LS_MPLS_ROUTERID,
OSPFF_LS_MPLS_LINKID,
OSPFF_LS_MPLS_LOCAL_ADDR,
OSPFF_LS_MPLS_REMOTE_ADDR,
OSPFF_LS_MPLS_LOCAL_IFID,
OSPFF_LS_MPLS_REMOTE_IFID,
OSPFF_MAX
};
static int ospf_filter[OSPFF_MAX];
static hf_register_info ospff_info[] = {
/* Message type number */
{&ospf_filter[OSPFF_MSG_TYPE],
{ "Message Type", "ospf.msg", FT_UINT8, BASE_DEC, VALS(pt_vals), 0x0,
"", HFILL }},
/* Message types */
{&ospf_filter[OSPFF_MSG_HELLO],
{ "Hello", "ospf.msg.hello", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_MSG_DB_DESC],
{ "Database Description", "ospf.msg.dbdesc", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_MSG_LS_REQ],
{ "Link State Adv Request", "ospf.msg.lsreq", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_MSG_LS_UPD],
{ "Link State Adv Update", "ospf.msg.lsupdate", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_MSG_LS_ACK],
{ "Link State Adv Acknowledgement", "ospf.msg.lsack", FT_BOOLEAN,
BASE_NONE, NULL, 0x0, "", HFILL }},
/* LS Types */
{&ospf_filter[OSPFF_LS_TYPE],
{ "Link-State Advertisement Type", "ospf.lsa", FT_UINT8, BASE_DEC,
VALS(ls_type_vals), 0x0, "", HFILL }},
{&ospf_filter[OSPFF_LS_ROUTER],
{ "Router LSA", "ospf.lsa.router", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_NETWORK],
{ "Network LSA", "ospf.lsa.network", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_SUMMARY],
{ "Summary LSA (IP Network)", "ospf.lsa.summary", FT_BOOLEAN, BASE_NONE,
NULL, 0x0, "", HFILL }},
{&ospf_filter[OSPFF_LS_ASBR],
{ "Summary LSA (ASBR)", "ospf.lsa.asbr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_ASEXT],
{ "AS-External LSA (ASBR)", "ospf.lsa.asext", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_GRPMEMBER],
{ "Group Membership LSA", "ospf.lsa.member", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_ASEXT7],
{ "NSSA AS-External LSA", "ospf.lsa.nssa", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_EXTATTR],
{ "External Attributes LSA", "ospf.lsa.attr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_OPAQUE],
{ "Opaque LSA", "ospf.lsa.opaque", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"", HFILL }},
/* Other interesting OSPF values */
{&ospf_filter[OSPFF_SRC_ROUTER],
{ "Source OSPF Router", "ospf.srcrouter", FT_IPv4, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_ADV_ROUTER],
{ "Advertising Router", "ospf.advrouter", FT_IPv4, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_MPLS],
{ "MPLS Traffic Engineering LSA", "ospf.lsa.mpls", FT_BOOLEAN,
BASE_NONE, NULL, 0x0, "", HFILL }},
{&ospf_filter[OSPFF_LS_MPLS_ROUTERID],
{ "MPLS/TE Router ID", "ospf.mpls.routerid", FT_IPv4, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_MPLS_LINKID],
{ "MPLS/TE Link ID", "ospf.mpls.linkid", FT_IPv4, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&ospf_filter[OSPFF_LS_MPLS_LOCAL_ADDR],
{ "MPLS/TE Local Interface Address", "ospf.mpls.local_addr", FT_IPv4,
BASE_NONE, NULL, 0x0, "", HFILL }},
{&ospf_filter[OSPFF_LS_MPLS_REMOTE_ADDR],
{ "MPLS/TE Remote Interface Address", "ospf.mpls.remote_addr", FT_IPv4,
BASE_NONE, NULL, 0x0, "", HFILL }},
{&ospf_filter[OSPFF_LS_MPLS_LOCAL_IFID],
{ "MPLS/TE Local Interface Index", "ospf.mpls.local_id", FT_UINT32,
BASE_DEC, NULL, 0x0, "", HFILL }},
{&ospf_filter[OSPFF_LS_MPLS_REMOTE_IFID],
{ "MPLS/TE Remote Interface Index", "ospf.mpls.remote_id", FT_UINT32,
BASE_DEC, NULL, 0x0, "", HFILL }},
};
static guint8 ospf_msg_type_to_filter (guint8 msg_type)
{
if (msg_type >= OSPF_HELLO &&
msg_type <= OSPF_LS_ACK)
return msg_type + OSPFF_MSG_MIN;
return -1;
}
static guint8 ospf_ls_type_to_filter (guint8 ls_type)
{
int r;
if (ls_type >= OSPF_LSTYPE_ROUTER &&
ls_type <= OSPF_LSTYPE_EXTATTR)
return OSPFF_LS_MIN + ls_type;
else if (ls_type >= OSPF_LSTYPE_OP_LINKLOCAL &&
ls_type <= OSPF_LSTYPE_OP_ASWIDE)
return OSPFF_LS_OPAQUE;
else
return -1;
}
static dissector_handle_t data_handle;
static void dissect_ospf_hello(tvbuff_t*, int, proto_tree*, guint8);
@ -287,13 +451,15 @@ dissect_ospf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_text(ospf_header_tree, tvb, 0, 1, "OSPF Version: %u",
version);
proto_tree_add_text(ospf_header_tree, tvb, 1, 1, "OSPF Packet Type: %u (%s)",
packet_type,
val_to_str(packet_type, pt_vals, "Unknown"));
proto_tree_add_item(ospf_header_tree, ospf_filter[OSPFF_MSG_TYPE],
tvb, 1, 1, FALSE);
proto_tree_add_item_hidden(ospf_header_tree,
ospf_filter[ospf_msg_type_to_filter(packet_type)],
tvb, 1, 1, FALSE);
proto_tree_add_text(ospf_header_tree, tvb, 2, 2, "Packet Length: %u",
ospflen);
proto_tree_add_text(ospf_header_tree, tvb, 4, 4, "Source OSPF Router ID: %s",
ip_to_str(tvb_get_ptr(tvb, 4, 4)));
proto_tree_add_item(ospf_header_tree, ospf_filter[OSPFF_SRC_ROUTER],
tvb, 4, 4, FALSE);
areaid=tvb_get_ntohl(tvb,8);
proto_tree_add_text(ospf_header_tree, tvb, 8, 4, "Area ID: %s%s",
ip_to_str(tvb_get_ptr(tvb, 8, 4)), areaid == 0 ? " (Backbone)" : "");
@ -645,9 +811,8 @@ dissect_ospf_ls_req(tvbuff_t *tvb, int offset, proto_tree *tree, guint8 version)
case OSPF_VERSION_2:
ls_type = tvb_get_ntohl(tvb, offset);
proto_tree_add_text(ospf_lsr_tree, tvb, offset, 4, "LS Type: %s (%u)",
val_to_str(ls_type, ls_type_vals, "Unknown"),
ls_type);
proto_tree_add_item(ospf_lsr_tree, ospf_filter[OSPFF_LS_TYPE],
tvb, offset, 4, ls_type);
break;
case OSPF_VERSION_3:
ls_type = tvb_get_ntohs(tvb, offset+2);
@ -663,8 +828,8 @@ dissect_ospf_ls_req(tvbuff_t *tvb, int offset, proto_tree *tree, guint8 version)
proto_tree_add_text(ospf_lsr_tree, tvb, offset + 4, 4, "Link State ID: %s",
ip_to_str(tvb_get_ptr(tvb, offset + 4, 4)));
proto_tree_add_text(ospf_lsr_tree, tvb, offset + 8, 4, "Advertising Router: %s",
ip_to_str(tvb_get_ptr(tvb, offset + 8, 4)));
proto_tree_add_item(ospf_lsr_tree, ospf_filter[OSPFF_ADV_ROUTER],
tvb, offset + 8, 4, FALSE);
offset += 12;
}
@ -783,6 +948,8 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
ti = proto_tree_add_text(tree, tvb, offset, length,
"MPLS Traffic Engineering LSA");
proto_tree_add_item_hidden(tree, ospf_filter[OSPFF_LS_MPLS],
tvb, offset, 2, FALSE);
mpls_tree = proto_item_add_subtree(ti, ett_ospf_lsa_mpls);
while (length != 0) {
@ -800,8 +967,8 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
proto_tree_add_text(tlv_tree, tvb, offset, 2, "TLV Type: 1 - Router Address");
proto_tree_add_text(tlv_tree, tvb, offset+2, 2, "TLV Length: %u",
tlv_length);
proto_tree_add_text(tlv_tree, tvb, offset+4, 4, "Router Address: %s",
ip_to_str(tvb_get_ptr(tvb, offset+4, 4)));
proto_tree_add_item(tlv_tree, ospf_filter[OSPFF_LS_MPLS_ROUTERID],
tvb, offset+4, 4, FALSE);
break;
case MPLS_TLV_LINK:
@ -843,9 +1010,8 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
"TLV Type: %u: %s", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u",
stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 4, "%s: %s (%x)", stlv_name,
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 4, 4)),
tvb_get_ntohl(tvb, stlv_offset + 4));
proto_tree_add_item(stlv_tree, ospf_filter[OSPFF_LS_MPLS_LINKID],
tvb, stlv_offset+4, 4, FALSE);
break;
case MPLS_LINK_LOCAL_IF:
@ -860,8 +1026,11 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
/* The Local/Remote Interface IP Address sub-TLV is TLV type 3/4, and is 4N
octets in length, where N is the number of neighbor addresses. */
for (i=0; i < stlv_len; i+=4)
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4+i, 4, "%s: %s", stlv_name,
ip_to_str(tvb_get_ptr(tvb, stlv_offset+4+i, 4)));
proto_tree_add_item(stlv_tree,
stlv_type==MPLS_LINK_LOCAL_IF ?
ospf_filter[OSPFF_LS_MPLS_LOCAL_ADDR] :
ospf_filter[OSPFF_LS_MPLS_REMOTE_ADDR],
tvb, stlv_offset+4+i, 4, FALSE);
break;
case MPLS_LINK_TE_METRIC:
@ -919,9 +1088,11 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
"TLV Type: %u: %s", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u",
stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 4, "%s: %d (0x%x)", stlv_name,
tvb_get_ntohl(tvb, stlv_offset + 4),
tvb_get_ntohl(tvb, stlv_offset + 4));
proto_tree_add_item(stlv_tree,
stlv_type==MPLS_LINK_LOCAL_ID ?
ospf_filter[OSPFF_LS_MPLS_LOCAL_IFID] :
ospf_filter[OSPFF_LS_MPLS_REMOTE_IFID],
tvb, stlv_offset+4, 4, FALSE);
break;
case MPLS_LINK_IF_SWITCHING_DESC:
@ -1023,8 +1194,9 @@ dissect_ospf_v2_lsa(tvbuff_t *tvb, int offset, proto_tree *tree,
end_offset = offset + ls_length;
if (disassemble_body) {
ti = proto_tree_add_text(tree, tvb, offset, ls_length,
"%s (Type: %u)", val_to_str(ls_type, ls_type_vals,"Unkown"), ls_type);
ti = proto_tree_add_text(tree, tvb, offset, ls_length,
"LS Type: %s",
val_to_str(ls_type, ls_type_vals, "Unknown (%d)"));
} else {
ti = proto_tree_add_text(tree, tvb, offset, OSPF_LSA_HEADER_LENGTH,
"LSA Header");
@ -1034,8 +1206,11 @@ dissect_ospf_v2_lsa(tvbuff_t *tvb, int offset, proto_tree *tree,
proto_tree_add_text(ospf_lsa_tree, tvb, offset, 2, "LS Age: %u seconds",
tvb_get_ntohs(tvb, offset));
dissect_ospf_options(tvb, offset + 2, ospf_lsa_tree, OSPF_VERSION_2);
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 3, 1, "LSA Type: %u (%s)",
ls_type, val_to_str(ls_type,ls_type_vals,"Unknown"));
proto_tree_add_item(ospf_lsa_tree, ospf_filter[OSPFF_LS_TYPE], tvb,
offset + 3, 1, ls_type);
proto_tree_add_item_hidden(ospf_lsa_tree,
ospf_filter[ospf_ls_type_to_filter(ls_type)], tvb,
offset + 3, 1, FALSE);
if (is_opaque(ls_type)) {
ls_id_type = tvb_get_guint8(tvb, offset + 4);
@ -1049,8 +1224,8 @@ dissect_ospf_v2_lsa(tvbuff_t *tvb, int offset, proto_tree *tree,
ip_to_str(tvb_get_ptr(tvb, offset + 4, 4)));
}
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 8, 4, "Advertising Router: %s",
ip_to_str(tvb_get_ptr(tvb, offset + 8, 4)));
proto_tree_add_item(ospf_lsa_tree, ospf_filter[OSPFF_ADV_ROUTER],
tvb, offset + 8, 4, FALSE);
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 12, 4, "LS Sequence Number: 0x%04x",
tvb_get_ntohl(tvb, offset + 12));
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 16, 2, "LS Checksum: %04x",
@ -1298,8 +1473,8 @@ dissect_ospf_v3_lsa(tvbuff_t *tvb, int offset, proto_tree *tree,
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 4, 4, "Link State ID: %s",
ip_to_str(tvb_get_ptr(tvb, offset + 4, 4)));
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 8, 4, "Advertising Router: %s",
ip_to_str(tvb_get_ptr(tvb, offset + 8, 4)));
proto_tree_add_item(ospf_lsa_tree, ospf_filter[OSPFF_ADV_ROUTER],
tvb, offset + 8, 4, FALSE);
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 12, 4, "LS Sequence Number: %d",
tvb_get_ntohl(tvb, offset + 12));
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 16, 2, "LS Checksum: %04x",
@ -1869,10 +2044,6 @@ static void dissect_ospf_v3_address_prefix(tvbuff_t *tvb, int offset, int prefix
void
proto_register_ospf(void)
{
/* static hf_register_info hf[] = {
{ &variable,
{ "Name", "ospf.abbreviation", TYPE, VALS_POINTER }},
};*/
static gint *ett[] = {
&ett_ospf,
&ett_ospf_hdr,
@ -1889,7 +2060,7 @@ proto_register_ospf(void)
proto_ospf = proto_register_protocol("Open Shortest Path First",
"OSPF", "ospf");
/* proto_register_field_array(proto_ospf, hf, array_length(hf));*/
proto_register_field_array(proto_ospf, ospff_info, array_length(ospff_info));
proto_register_subtree_array(ett, array_length(ett));
}