aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-bgp.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2004-10-01 07:07:03 +0000
committerGuy Harris <guy@alum.mit.edu>2004-10-01 07:07:03 +0000
commit6d36dda70be13c1842fef6e8b4f77cbefdae1cbd (patch)
treee2716afaae559959a65c6149c124cef0a9010012 /epan/dissectors/packet-bgp.c
parent8d24ff694a7c68eb4183f4ddb21916a8d992df96 (diff)
From Carlos Pignataro:
o Fix EXTENDED_COMMUNITIES output that was appending the Carried Extended communities; fix BGP_EXT_COM_L2INFO was not appending to the bgpext_com_type o Update various text with the specific afi/safi o Decode fields in MP Reach NLRI for labeled VPNv4 and labeled IPv4 (and small offset fix for the latter) o Decode unknown address family in MP Reach NLRI svn path=/trunk/; revision=12165
Diffstat (limited to 'epan/dissectors/packet-bgp.c')
-rw-r--r--epan/dissectors/packet-bgp.c151
1 files changed, 92 insertions, 59 deletions
diff --git a/epan/dissectors/packet-bgp.c b/epan/dissectors/packet-bgp.c
index 4cb64750e1..72c6818369 100644
--- a/epan/dissectors/packet-bgp.c
+++ b/epan/dissectors/packet-bgp.c
@@ -511,7 +511,7 @@ mp_addr_to_str (guint16 afi, guint8 safi, tvbuff_t *tvb, gint offset, GString *b
case FORMAT_AS2_LOC:
length = 8 + sizeof(ip4addr);
tvb_memcpy(tvb, ip4addr, offset + 8, sizeof(ip4addr)); /* Next Hop */
- g_string_sprintf(buf, "Empty Label Stack RD=%u:%u IP=%s",
+ g_string_sprintf(buf, "Empty Label Stack RD=%u:%u IPv4=%s",
tvb_get_ntohs(tvb, offset + 2),
tvb_get_ntohl(tvb, offset + 4),
ip_to_str(ip4addr));
@@ -520,14 +520,14 @@ mp_addr_to_str (guint16 afi, guint8 safi, tvbuff_t *tvb, gint offset, GString *b
length = 8 + sizeof(ip4addr);
tvb_memcpy(tvb, ip4addr, offset + 2, sizeof(ip4addr)); /* IP part of the RD */
tvb_memcpy(tvb, ip4addr2, offset + 8, sizeof(ip4addr)); /* Next Hop */
- g_string_sprintf(buf, "Empty Label Stack RD=%s:%u IP=%s",
+ g_string_sprintf(buf, "Empty Label Stack RD=%s:%u IPv4=%s",
ip_to_str(ip4addr),
tvb_get_ntohs(tvb, offset + 6),
ip_to_str(ip4addr2));
break ;
default:
length = 0 ;
- g_string_sprintf(buf, "Unknown (0x%04x)labeled VPN address format",rd_type);
+ g_string_sprintf(buf, "Unknown (0x%04x) labeled VPN IPv4 address format",rd_type);
break;
}
break;
@@ -555,7 +555,7 @@ mp_addr_to_str (guint16 afi, guint8 safi, tvbuff_t *tvb, gint offset, GString *b
case FORMAT_AS2_LOC:
length = 8 + 16;
tvb_memcpy(tvb, ip6addr.u6_addr.u6_addr8, offset + 8, 16); /* Next Hop */
- g_string_sprintf(buf, "Empty Label Stack RD=%u:%u IP=%s",
+ g_string_sprintf(buf, "Empty Label Stack RD=%u:%u IPv6=%s",
tvb_get_ntohs(tvb, offset + 2),
tvb_get_ntohl(tvb, offset + 4),
ip6_to_str(&ip6addr));
@@ -564,14 +564,14 @@ mp_addr_to_str (guint16 afi, guint8 safi, tvbuff_t *tvb, gint offset, GString *b
length = 8 + 16;
tvb_memcpy(tvb, ip4addr, offset + 2, sizeof(ip4addr)); /* IP part of the RD */
tvb_memcpy(tvb, ip6addr.u6_addr.u6_addr8, offset + 8, 16); /* Next Hop */
- g_string_sprintf(buf, "Empty Label Stack RD=%s:%u IP=%s",
+ g_string_sprintf(buf, "Empty Label Stack RD=%s:%u IPv6=%s",
ip_to_str(ip4addr),
tvb_get_ntohs(tvb, offset + 6),
ip6_to_str(&ip6addr));
break ;
default:
length = 0 ;
- g_string_sprintf(buf, "Unknown (0x%04x)labeled VPN address format",rd_type);
+ g_string_sprintf(buf, "Unknown (0x%04x) labeled VPN IPv6 address format",rd_type);
break;
}
break;
@@ -588,7 +588,7 @@ mp_addr_to_str (guint16 afi, guint8 safi, tvbuff_t *tvb, gint offset, GString *b
case SAFNUM_LAB_VPNUNIMULC:
length = 4; /* the next-hop is simply an ipv4 addr */
tvb_memcpy(tvb, ip4addr, offset + 0, 4);
- g_string_sprintf(buf, "IP=%s",
+ g_string_sprintf(buf, "IPv4=%s",
ip_to_str(ip4addr));
break;
default:
@@ -648,28 +648,33 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
offset += (1 + labnum * 3);
if (plen <= (labnum * 3*8)) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv4 prefix length %u invalid", tag, plen);
+ "%s Labeled IPv4 prefix length %u invalid",
+ tag, plen);
return -1;
}
plen -= (labnum * 3*8);
length = ipv4_addr_and_mask(tvb, offset, ip4addr.addr_bytes, plen);
if (length < 0) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv4 prefix length %u invalid",
+ "%s Labeled IPv4 prefix length %u invalid",
tag, plen + (labnum * 3*8));
return -1;
}
ti = proto_tree_add_text(tree, tvb, start_offset,
- (offset + 1 + length) - start_offset,
- "Label Stack=%s IP=%s/%u",
+ (offset + length) - start_offset,
+ "Label Stack=%s IPv4=%s/%u",
lab_stk, ip_to_str(ip4addr.addr_bytes), plen);
prefix_tree = proto_item_add_subtree(ti, ett_bgp_prefix);
+ proto_tree_add_text(prefix_tree, tvb, start_offset, 1, "%s Prefix length: %u",
+ tag, plen + labnum * 3 * 8);
+ proto_tree_add_text(prefix_tree, tvb, start_offset + 1, 3 * labnum, "%s Label Stack: %s",
+ tag, lab_stk);
if (hf_addr4 != -1) {
- proto_tree_add_ipv4(prefix_tree, hf_addr4, tvb, offset + 1,
+ proto_tree_add_ipv4(prefix_tree, hf_addr4, tvb, offset,
length, ip4addr.addr);
} else {
- proto_tree_add_text(prefix_tree, tvb, offset + 1, length,
+ proto_tree_add_text(prefix_tree, tvb, offset, length,
"%s IPv4 prefix: %s",
tag, ip_to_str(ip4addr.addr_bytes));
}
@@ -685,7 +690,8 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
offset += (1 + labnum * 3);
if (plen <= (labnum * 3*8)) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv4 prefix length %u invalid", tag, plen);
+ "%s Labeled VPN IPv4 prefix length %u invalid",
+ tag, plen);
return -1;
}
plen -= (labnum * 3*8);
@@ -693,7 +699,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
rd_type = tvb_get_ntohs(tvb, offset);
if (plen <= 8*8) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv4 prefix length %u invalid",
+ "%s Labeled VPN IPv4 prefix length %u invalid",
tag, plen + (labnum * 3*8));
return -1;
}
@@ -705,19 +711,26 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
length = ipv4_addr_and_mask(tvb, offset + 8, ip4addr.addr_bytes, plen);
if (length < 0) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv4 prefix length %u invalid",
+ "%s Labeled VPN IPv4 prefix length %u invalid",
tag, plen + (labnum * 3*8) + 8*8);
return -1;
}
ti = proto_tree_add_text(tree, tvb, start_offset,
(offset + 8 + length) - start_offset,
- "Label Stack=%s RD=%u:%u, IP=%s/%u",
+ "Label Stack=%s RD=%u:%u, IPv4=%s/%u",
lab_stk,
tvb_get_ntohs(tvb, offset + 2),
tvb_get_ntohl(tvb, offset + 4),
ip_to_str(ip4addr.addr_bytes), plen);
prefix_tree = proto_item_add_subtree(ti, ett_bgp_prefix);
+ proto_tree_add_text(prefix_tree, tvb, start_offset, 1, "%s Prefix length: %u",
+ tag, plen + labnum * 3 * 8 + 8 * 8);
+ proto_tree_add_text(prefix_tree, tvb, start_offset + 1, 3 * labnum,
+ "%s Label Stack: %s", tag, lab_stk);
+ proto_tree_add_text(prefix_tree, tvb, start_offset + 1 + 3 * labnum, 8,
+ "%s Route Distinguisher: %u:%u", tag, tvb_get_ntohs(tvb, offset + 2),
+ tvb_get_ntohl(tvb, offset + 4));
if (hf_addr4 != -1) {
proto_tree_add_ipv4(prefix_tree, hf_addr4, tvb,
offset + 8, length, ip4addr.addr);
@@ -735,26 +748,42 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
length = ipv4_addr_and_mask(tvb, offset + 8, ip4addr2.addr_bytes, plen);
if (length < 0) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv4 prefix length %u invalid",
+ "%s Labeled VPN IPv4 prefix length %u invalid",
tag, plen + (labnum * 3*8) + 8*8);
return -1;
}
ti = proto_tree_add_text(tree, tvb, start_offset,
(offset + 8 + length) - start_offset,
- "Label Stack=%s RD=%s:%u, IP=%s/%u",
+ "Label Stack=%s RD=%s:%u, IPv4=%s/%u",
lab_stk,
ip_to_str(ip4addr.addr_bytes),
tvb_get_ntohs(tvb, offset + 6),
ip_to_str(ip4addr2.addr_bytes),
plen);
+ prefix_tree = proto_item_add_subtree(ti, ett_bgp_prefix);
+ proto_tree_add_text(prefix_tree, tvb, start_offset, 1, "%s Prefix length: %u",
+ tag, plen + labnum * 3 * 8 + 8 * 8);
+ proto_tree_add_text(prefix_tree, tvb, start_offset + 1, 3 * labnum,
+ "%s Label Stack: %s", tag, lab_stk);
+ proto_tree_add_text(prefix_tree, tvb, start_offset + 1 + 3 * labnum, 8,
+ "%s Route Distinguisher: %s:%u", tag, ip_to_str(ip4addr.addr_bytes),
+ tvb_get_ntohs(tvb, offset + 6));
+ if (hf_addr4 != -1) {
+ proto_tree_add_ipv4(prefix_tree, hf_addr4, tvb,
+ offset + 8, length, ip4addr2.addr);
+ } else {
+ proto_tree_add_text(prefix_tree, tvb, offset + 8,
+ length, "%s IPv4 prefix: %s", tag,
+ ip_to_str(ip4addr2.addr_bytes));
+ }
total_length = (1 + labnum * 3 + 8) + length;
break;
default:
proto_tree_add_text(tree, tvb, start_offset,
(offset - start_offset) + 2,
- "Unknown labeled VPN address format %u", rd_type);
+ "Unknown labeled VPN IPv4 address format %u", rd_type);
return -1;
}
break;
@@ -784,7 +813,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
offset += (1 + labnum * 3);
if (plen <= (labnum * 3*8)) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv6 prefix length %u invalid", tag, plen);
+ "%s Labeled IPv6 prefix length %u invalid", tag, plen);
return -1;
}
plen -= (labnum * 3*8);
@@ -792,13 +821,13 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
length = ipv6_addr_and_mask(tvb, offset, &ip6addr, plen);
if (length < 0) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv6 prefix length %u invalid", tag, plen);
+ "%s Labeled IPv6 prefix length %u invalid", tag, plen);
return -1;
}
ti = proto_tree_add_text(tree, tvb, start_offset,
(offset + length) - start_offset,
- "Label Stack=%s, IP=%s/%u",
+ "Label Stack=%s, IPv6=%s/%u",
lab_stk,
ip6_to_str(&ip6addr), plen);
total_length = (1 + labnum * 3) + length;
@@ -813,7 +842,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
offset += (1 + labnum * 3);
if (plen <= (labnum * 3*8)) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv6 prefix length %u invalid", tag, plen);
+ "%s Labeled VPN IPv6 prefix length %u invalid", tag, plen);
return -1;
}
plen -= (labnum * 3*8);
@@ -821,7 +850,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
rd_type = tvb_get_ntohs(tvb,offset);
if (plen <= 8*8) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv6 prefix length %u invalid",
+ "%s Labeled VPN IPv6 prefix length %u invalid",
tag, plen + (labnum * 3*8));
return -1;
}
@@ -833,14 +862,14 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
length = ipv6_addr_and_mask(tvb, offset + 8, &ip6addr, plen);
if (length < 0) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv6 prefix length %u invalid",
+ "%s Labeled VPN IPv6 prefix length %u invalid",
tag, plen + (labnum * 3*8) + 8*8);
return -1;
}
ti = proto_tree_add_text(tree, tvb, start_offset,
(offset + 8 + length) - start_offset,
- "Label Stack=%s RD=%u:%u, IP=%s/%u",
+ "Label Stack=%s RD=%u:%u, IPv6=%s/%u",
lab_stk,
tvb_get_ntohs(tvb, offset + 2),
tvb_get_ntohl(tvb, offset + 4),
@@ -854,14 +883,14 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
length = ipv6_addr_and_mask(tvb, offset + 8, &ip6addr, plen);
if (length < 0) {
proto_tree_add_text(tree, tvb, start_offset, 1,
- "%s IPv6 prefix length %u invalid",
+ "%s Labeled VPN IPv6 prefix length %u invalid",
tag, plen + (labnum * 3*8) + 8*8);
return -1;
}
ti = proto_tree_add_text(tree, tvb, start_offset,
(offset + 8 + length) - start_offset,
- "Label Stack=%s RD=%s:%u, IP=%s/%u",
+ "Label Stack=%s RD=%s:%u, IPv6=%s/%u",
lab_stk,
ip_to_str(ip4addr.addr_bytes),
tvb_get_ntohs(tvb, offset + 6),
@@ -871,7 +900,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6,
default:
proto_tree_add_text(tree, tvb, start_offset, 0,
- "Unknown labeled VPN address format %u", rd_type);
+ "Unknown labeled VPN IPv6 address format %u", rd_type);
return -1;
}
break;
@@ -1937,35 +1966,34 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree)
"Subsequent address family identifier: %s (%u)",
val_to_str(saf, bgpattr_nlri_safi, saf >= 128 ? "Vendor specific" : "Unknown"),
saf);
+ nexthop_len = tvb_get_guint8(tvb, o + i + aoff + 3);
+ ti = proto_tree_add_text(subtree2, tvb, o + i + aoff + 3,
+ nexthop_len + 1,
+ "Next hop network address (%d %s)",
+ nexthop_len, plurality(nexthop_len, "byte", "bytes"));
+ subtree3 = proto_item_add_subtree(ti, ett_bgp_mp_nhna);
if (af != AFNUM_INET && af != AFNUM_INET6 && af != AFNUM_L2VPN) {
/*
* The addresses don't contain lengths, so if we
* don't understand the address family type, we
* cannot parse the subsequent addresses as we
* don't know how long they are.
- *
- * XXX - we should put a protocol tree item in for
- * this, as an unknown blob.
*/
- break;
- }
- nexthop_len = tvb_get_guint8(tvb, o + i + aoff + 3);
- ti = proto_tree_add_text(subtree2, tvb, o + i + aoff + 3,
- nexthop_len + 1,
- "Next hop network address (%d %s)",
- nexthop_len, plurality(nexthop_len, "byte", "bytes"));
- subtree3 = proto_item_add_subtree(ti, ett_bgp_mp_nhna);
- j = 0;
- while (j < nexthop_len) {
- advance = mp_addr_to_str(af, saf, tvb, o + i + aoff + 4 + j,
- junk_gbuf) ;
- if (advance == 0) /* catch if this is a unknown AFI type*/
- break;
- if (j + advance > nexthop_len)
- break;
- proto_tree_add_text(subtree3, tvb,o + i + aoff + 4 + j,
- advance, "Next hop: %s (%u)", junk_gbuf->str, advance);
- j += advance;
+ proto_tree_add_text(subtree3, tvb, o + i + aoff + 4,
+ nexthop_len, "Unknown Address Family");
+ } else {
+ j = 0;
+ while (j < nexthop_len) {
+ advance = mp_addr_to_str(af, saf, tvb, o + i + aoff + 4 + j,
+ junk_gbuf) ;
+ if (advance == 0) /* catch if this is a unknown AFI type*/
+ break;
+ if (j + advance > nexthop_len)
+ break;
+ proto_tree_add_text(subtree3, tvb,o + i + aoff + 4 + j,
+ advance, "Next hop: %s (%u)", junk_gbuf->str, advance);
+ j += advance;
+ }
}
tlen -= nexthop_len + 4;
aoff += nexthop_len + 4 ;
@@ -1995,8 +2023,11 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree)
"Network layer reachability information (%u %s)",
tlen, (tlen == 1) ? "byte" : "bytes");
if (tlen) {
- subtree3 = proto_item_add_subtree(ti,ett_bgp_mp_reach_nlri);
-
+ subtree3 = proto_item_add_subtree(ti,ett_bgp_mp_reach_nlri);
+ if (af != AFNUM_INET && af != AFNUM_INET6 && af != AFNUM_L2VPN) {
+ proto_tree_add_text(subtree3, tvb, o + i + aoff,
+ tlen, "Unknown Address Family");
+ } else {
while (tlen > 0) {
advance = decode_prefix_MP(subtree3,
hf_bgp_mp_reach_nlri_ipv4_prefix,
@@ -2008,6 +2039,7 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree)
tlen -= advance;
aoff += advance;
}
+ }
}
break;
case BGPTYPE_MP_UNREACH_NLRI:
@@ -2080,7 +2112,7 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree)
while (q < end) {
ext_com = tvb_get_ntohs(tvb,q) ;
- g_string_sprintfa(junk_gbuf, "%s",
+ g_string_sprintf(junk_gbuf, "%s",
val_to_str(ext_com,bgpext_com_type,"Unknown"));
switch (ext_com) {
case BGP_EXT_COM_RT_0:
@@ -2106,7 +2138,7 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree)
break;
case BGP_EXT_COM_OSPF_RTYPE:
tvb_memcpy(tvb,ipaddr,q+2,4);
- g_string_sprintfa(junk_gbuf, ": Area:%s %s", ip_to_str(ipaddr),
+ g_string_sprintfa(junk_gbuf, ": Area: %s, Type: %s", ip_to_str(ipaddr),
val_to_str(tvb_get_guint8(tvb,q+6),bgpext_ospf_rtype,"Unknown"));
/* print OSPF Metric type if selected */
/* always print E2 even if not external route -- receiving router should ignore */
@@ -2114,7 +2146,9 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree)
g_string_sprintfa(junk_gbuf," E2");
} else if (tvb_get_guint8(tvb,q+6)==(BGP_OSPF_RTYPE_EXT ||BGP_OSPF_RTYPE_NSSA ) ) {
g_string_sprintfa(junk_gbuf," E1");
- }
+ } else {
+ g_string_sprintfa(junk_gbuf,", no options");
+ }
proto_tree_add_text(subtree3,tvb,q,8, "%s",junk_gbuf->str);
break;
case BGP_EXT_COM_LINKBAND:
@@ -2124,7 +2158,7 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree)
proto_tree_add_text(subtree3,tvb,q,8, "%s",junk_gbuf->str);
break;
case BGP_EXT_COM_L2INFO:
- g_string_sprintf(junk_gbuf,
+ g_string_sprintfa(junk_gbuf,
": %s, Control Flags: %s%s%s%s%s, MTU: %u %s",
val_to_str(tvb_get_guint8(tvb,q+2),bgp_l2vpn_encaps,"Unknown"),
tvb_get_guint8(tvb,q+3) ? "" : "none",
@@ -2149,7 +2183,6 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree)
tvb_get_ntohs(tvb,q+4)==1 ? "byte" : "bytes");
break;
default:
- g_string_sprintf(junk_gbuf, " ");
proto_tree_add_text(subtree3,tvb,q,8, "%s",junk_gbuf->str);
break ;
}