From David Ward: OSPF dissector: add filters for v3 LS Type field. https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=7684

svn path=/trunk/; revision=44720
This commit is contained in:
Anders Broman 2012-09-01 07:42:07 +00:00
parent 2f5b01c68a
commit 607d32b00d
1 changed files with 90 additions and 14 deletions

View File

@ -165,10 +165,9 @@ static const value_string auth_vals[] = {
#define OSPF_V3_LSTYPE_INTER_AREA_ROUTER 0x2004
#define OSPF_V3_LSTYPE_AS_EXTERNAL 0x4005
#define OSPF_V3_LSTYPE_GROUP_MEMBERSHIP 0x2006
#define OSPF_V3_LSTYPE_TYPE_7 0x2007
#define OSPF_V3_LSTYPE_NSSA 0x2007
#define OSPF_V3_LSTYPE_LINK 0x0008
#define OSPF_V3_LSTYPE_INTRA_AREA_PREFIX 0x2009
/* The Opaque RI LSA has a type "12" for OSPFv3 */
#define OSPF_V3_LSTYPE_OPAQUE_RI 0x800c
/* Opaque LSA types */
@ -176,6 +175,17 @@ static const value_string auth_vals[] = {
#define OSPF_LSTYPE_OP_AREALOCAL 10
#define OSPF_LSTYPE_OP_ASWIDE 11
#define OSPF_V3_LSA_FUNCTION_CODE_ROUTER 1
#define OSPF_V3_LSA_FUNCTION_CODE_NETWORK 2
#define OSPF_V3_LSA_FUNCTION_CODE_INTER_AREA_PREFIX 3
#define OSPF_V3_LSA_FUNCTION_CODE_INTER_AREA_ROUTER 4
#define OSPF_V3_LSA_FUNCTION_CODE_AS_EXTERNAL 5
#define OSPF_V3_LSA_FUNCTION_CODE_GROUP_MEMBERSHIP 6
#define OSPF_V3_LSA_FUNCTION_CODE_NSSA 7
#define OSPF_V3_LSA_FUNCTION_CODE_LINK 8
#define OSPF_V3_LSA_FUNCTION_CODE_INTRA_AREA_PREFIX 9
#define OSPF_V3_LSA_FUNCTION_CODE_OPAQUE_RI 12
#define OSPF_LINK_PTP 1
#define OSPF_LINK_TRANSIT 2
#define OSPF_LINK_STUB 3
@ -196,7 +206,6 @@ static const value_string auth_vals[] = {
advertized in the first TLV. (RFC4970) */
#define OSPF_LSA_OPAQUE_RI 4
#define OSPF_LSA_UNKNOWN 11
#define OSPF_V3_LSA_OPAQUE_RI 12
#define OSPF_RESTART_REASON_UNKNOWN 0
#define OSPF_RESTART_REASON_SWRESTART 1
#define OSPF_RESTART_REASON_SWRELOAD 2
@ -263,7 +272,7 @@ static const value_string v3_ls_type_vals[] = {
{OSPF_V3_LSTYPE_INTER_AREA_ROUTER, "Inter-Area-Router-LSA" },
{OSPF_V3_LSTYPE_AS_EXTERNAL, "AS-External-LSA" },
{OSPF_V3_LSTYPE_GROUP_MEMBERSHIP, "Group-Membership-LSA" },
{OSPF_V3_LSTYPE_TYPE_7, "Type-LSA" },
{OSPF_V3_LSTYPE_NSSA, "NSSA-LSA" },
{OSPF_V3_LSTYPE_LINK, "Link-LSA" },
{OSPF_V3_LSTYPE_INTRA_AREA_PREFIX, "Intra-Area-Prefix-LSA" },
{OSPF_V3_LSTYPE_OPAQUE_RI, "Router Information Opaque-LSA"},
@ -632,6 +641,20 @@ enum {
OSPFF_LS_EXTATTR,
OSPFF_LS_OPAQUE,
OSPFF_V3_LS_TYPE,
OSPFF_V3_LS_MIN,
OSPFF_V3_LS_ROUTER,
OSPFF_V3_LS_NETWORK,
OSPFF_V3_LS_INTER_AREA_PREFIX,
OSPFF_V3_LS_INTER_AREA_ROUTER,
OSPFF_V3_LS_AS_EXTERNAL,
OSPFF_V3_LS_GROUP_MEMBERSHIP,
OSPFF_V3_LS_NSSA,
OSPFF_V3_LS_LINK,
OSPFF_V3_LS_INTRA_AREA_PREFIX,
OSPFF_V3_LS_OPAQUE_RI,
OSPFF_SRC_ROUTER,
OSPFF_ADV_ROUTER,
OSPFF_LS_MPLS,
@ -764,6 +787,20 @@ static gint ospf_ls_type_to_filter (guint8 ls_type)
return -1;
}
static gint ospf_v3_ls_type_to_filter (guint16 ls_type)
{
guint16 function_code;
function_code = ls_type & 0x1fff;
if (function_code >= OSPF_V3_LSA_FUNCTION_CODE_ROUTER &&
function_code <= OSPF_V3_LSA_FUNCTION_CODE_INTRA_AREA_PREFIX)
return OSPFF_V3_LS_MIN + function_code;
else if (function_code == OSPF_V3_LSA_FUNCTION_CODE_OPAQUE_RI)
return OSPFF_V3_LS_OPAQUE_RI;
else
return -1;
}
typedef struct _bitfield_info {
int hfindex;
gint *ett;
@ -1655,7 +1692,6 @@ dissect_ospf_ls_req(tvbuff_t *tvb, int offset, proto_tree *tree, guint8 version,
{
proto_tree *ospf_lsr_tree;
proto_item *ti;
guint32 ls_type;
guint16 reserved;
int orig_offset = offset;
@ -1676,10 +1712,8 @@ dissect_ospf_ls_req(tvbuff_t *tvb, int offset, proto_tree *tree, guint8 version,
reserved = tvb_get_ntohs(tvb, offset);
proto_tree_add_text(ospf_lsr_tree, tvb, offset, 2,
(reserved == 0 ? "Reserved: %u" : "Reserved: %u [incorrect, should be 0]"), reserved);
ls_type = tvb_get_ntohs(tvb, offset+2);
proto_tree_add_text(ospf_lsr_tree, tvb, offset+2, 2, "LS Type: %s (0x%04x)",
val_to_str_const(ls_type, v3_ls_type_vals, "Unknown"),
ls_type);
proto_tree_add_item(ospf_lsr_tree, hf_ospf_filter[OSPFF_V3_LS_TYPE],
tvb, offset + 2, 2, ENC_BIG_ENDIAN);
break;
}
@ -2817,7 +2851,7 @@ dissect_ospf_v3_lsa(tvbuff_t *tvb, int offset, proto_tree *tree,
gboolean disassemble_body, guint8 address_family)
{
proto_tree *ospf_lsa_tree;
proto_item *ti;
proto_item *ti, *hidden_item;
guint16 ls_type;
guint16 ls_length;
@ -2858,8 +2892,14 @@ dissect_ospf_v3_lsa(tvbuff_t *tvb, int offset, proto_tree *tree,
proto_tree_add_text(ospf_lsa_tree, tvb, offset, 2, "Do Not Age: %s",
(tvb_get_ntohs(tvb, offset) & OSPF_DNA_LSA) ? "True" : "False");
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 2, 2, "LSA Type: 0x%04x (%s)",
ls_type, val_to_str_const(ls_type, v3_ls_type_vals,"Unknown"));
proto_tree_add_item(ospf_lsa_tree, hf_ospf_filter[OSPFF_V3_LS_TYPE], tvb,
offset + 2, 2, ENC_BIG_ENDIAN);
if (ospf_v3_ls_type_to_filter(ls_type) != -1) {
hidden_item = proto_tree_add_item(ospf_lsa_tree,
hf_ospf_filter[ospf_v3_ls_type_to_filter(ls_type)], tvb,
offset + 2, 2, ENC_BIG_ENDIAN);
PROTO_ITEM_SET_HIDDEN(hidden_item);
}
proto_tree_add_text(ospf_lsa_tree, tvb, offset + 4, 4, "Link State ID: %s",
tvb_ip_to_str(tvb, offset + 4));
@ -3040,7 +3080,7 @@ dissect_ospf_v3_lsa(tvbuff_t *tvb, int offset, proto_tree *tree,
break;
case OSPF_V3_LSTYPE_TYPE_7:
case OSPF_V3_LSTYPE_NSSA:
case OSPF_V3_LSTYPE_AS_EXTERNAL:
/* flags */
@ -3278,7 +3318,7 @@ proto_register_ospf(void)
/* LS Types */
{&hf_ospf_filter[OSPFF_LS_TYPE],
{ "Link-State Advertisement Type", "ospf.lsa", FT_UINT8, BASE_DEC,
{ "LS Type", "ospf.lsa", FT_UINT8, BASE_DEC,
VALS(ls_type_vals), 0x0, NULL, HFILL }},
{&hf_ospf_filter[OSPFF_LS_OPAQUE_TYPE],
{ "Link State ID Opaque Type", "ospf.lsid_opaque_type", FT_UINT8, BASE_DEC,
@ -3316,6 +3356,42 @@ proto_register_ospf(void)
{ "Opaque LSA", "ospf.lsa.opaque", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
/* OSPFv3 LS Types */
{&hf_ospf_filter[OSPFF_V3_LS_TYPE],
{ "LS Type", "ospf.v3.lsa", FT_UINT16, BASE_HEX,
VALS(v3_ls_type_vals), 0x0, NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_ROUTER],
{ "Router-LSA", "ospf.v3.lsa.router", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_NETWORK],
{ "Network-LSA", "ospf.v3.lsa.network", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_INTER_AREA_PREFIX],
{ "Inter-Area-Prefix-LSA", "ospf.v3.lsa.interprefix", FT_BOOLEAN, BASE_NONE,
NULL, 0x0, NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_INTER_AREA_ROUTER],
{ "Inter-Area-Router-LSA", "ospf.v3.lsa.interrouter", FT_BOOLEAN, BASE_NONE,
NULL, 0x0, NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_AS_EXTERNAL],
{ "AS-External-LSA", "ospf.v3.lsa.asext", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_GROUP_MEMBERSHIP],
{ "Group-Membership-LSA", "ospf.v3.lsa.member", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_NSSA],
{ "NSSA-LSA", "ospf.v3.lsa.nssa", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_LINK],
{ "Link-LSA", "ospf.v3.lsa.link", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_INTRA_AREA_PREFIX],
{ "Intra-Area-Prefix-LSA", "ospf.v3.lsa.intraprefix", FT_BOOLEAN, BASE_NONE,
NULL, 0x0, NULL, HFILL }},
{&hf_ospf_filter[OSPFF_V3_LS_OPAQUE_RI],
{ "Router Information Opaque-LSA", "ospf.v3.lsa.opaque", FT_BOOLEAN, BASE_NONE,
NULL, 0x0, NULL, HFILL }},
/* Other interesting OSPF values */
{&hf_ospf_filter[OSPFF_SRC_ROUTER],
{ "Source OSPF Router", "ospf.srcrouter", FT_IPv4, BASE_NONE, NULL, 0x0,