Deleted Added
full compact
39c39
< "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.72.2.4 2004/03/24 00:04:04 guy Exp $";
---
> "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.91 2005/03/27 01:31:25 guy Exp $";
47a48
> #include "decode_prefix.h"
49a51,52
> #include "bgp.h"
> #include "l2vpn.h"
92a96,97
> #define BGP_UPDATE_MINSIZE 23
>
141a147
> #define BGPTYPE_ATTR_SET 128 /* draft-marques-ppvpn-ibgp */
142a149,150
> #define BGP_MP_NLRI_MINSIZE 3 /* End of RIB Marker detection */
>
159a168
> { BGPTYPE_ATTR_SET, "Attribute Set"},
196a206
> #define BGP_CAPCODE_ORF 3 /* XXX */
197a208,209
> #define BGP_CAPCODE_AS_NEW 65 /* XXX */
> #define BGP_CAPCODE_DYN_CAP 67 /* XXX */
202a215
> { BGP_CAPCODE_ORF, "Cooperative Route Filtering"},
203a217,218
> { BGP_CAPCODE_AS_NEW, "32-Bit AS Number"},
> { BGP_CAPCODE_DYN_CAP, "Dynamic Capability"},
293a309,311
> #define SAFNUM_TUNNEL 64 /* XXX */
> #define SAFNUM_VPLS 65 /* XXX */
> #define SAFNUM_MDT 66 /* XXX */
308a327,329
> { SAFNUM_TUNNEL, "Tunnel"},
> { SAFNUM_VPLS, "VPLS"},
> { SAFNUM_MDT, "MDT"},
312c333
< { SAFNUM_RT_ROUTING_INFO, "Route Target Routing Information"},
---
> { SAFNUM_RT_ROUTING_INFO, "Route Target Routing Information"}, /* draft-marques-ppvpn-rt-constrain-01.txt */
369a391
> #define BGP_EXT_COM_CISCO_MCAST 0x0009 /* cisco proprietary */
397a420
> { BGP_EXT_COM_CISCO_MCAST, "mdt-group"},
429,447c452
< static struct tok bgp_l2vpn_encaps_values[] = {
< { 0, "Reserved"},
< { 1, "Frame Relay"},
< { 2, "ATM AAL5 VCC transport"},
< { 3, "ATM transparent cell transport"},
< { 4, "Ethernet VLAN"},
< { 5, "Ethernet"},
< { 6, "Cisco-HDLC"},
< { 7, "PPP"},
< { 8, "CEM"},
< { 9, "ATM VCC cell transport"},
< { 10, "ATM VPC cell transport"},
< { 11, "MPLS"},
< { 12, "VPLS"},
< { 64, "IP-interworking"},
< { 0, NULL},
< };
<
< static int
---
> int
517c522
< static char *
---
> char *
520,523c525,526
< /* allocate space for the following string
< * xxx.xxx.xxx.xxx:xxxxx
< * 21 bytes plus one termination byte */
< static char rd[22];
---
> /* allocate space for the largest possible string */
> static char rd[sizeof("xxxxxxxxxx:xxxxx (xxx.xxx.xxx.xxx:xxxxx)")];
543,544c546,548
< snprintf(pos, sizeof(rd) - (pos - rd), "%u:%u",
< EXTRACT_32BITS(pptr+2), EXTRACT_16BITS(pptr+6));
---
> snprintf(pos, sizeof(rd) - (pos - rd), "%u:%u (%u.%u.%u.%u:%u)",
> EXTRACT_32BITS(pptr+2), EXTRACT_16BITS(pptr+6),
> *(pptr+2), *(pptr+3), *(pptr+4), *(pptr+5), EXTRACT_16BITS(pptr+6));
676c680
< static int
---
> int
770a775,842
> decode_labeled_clnp_prefix(const u_char *pptr, char *buf, u_int buflen)
> {
> u_int8_t addr[19];
> u_int plen;
>
> TCHECK(pptr[0]);
> plen = pptr[0]; /* get prefix length */
> plen-=24; /* adjust prefixlen - labellength */
>
> if (152 < plen)
> return -1;
>
> memset(&addr, 0, sizeof(addr));
> TCHECK2(pptr[4], (plen + 7) / 8);
> memcpy(&addr, &pptr[4], (plen + 7) / 8);
> if (plen % 8) {
> addr[(plen + 7) / 8 - 1] &=
> ((0xff00 >> (plen % 8)) & 0xff);
> }
> /* the label may get offsetted by 4 bits so lets shift it right */
> snprintf(buf, buflen, "%s/%d, label:%u %s",
> isonsap_string(addr,(plen + 7) / 8 - 1),
> plen,
> EXTRACT_24BITS(pptr+1)>>4,
> ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" );
>
> return 4 + (plen + 7) / 8;
>
> trunc:
> return -2;
> }
>
> static int
> decode_labeled_vpn_clnp_prefix(const u_char *pptr, char *buf, u_int buflen)
> {
> u_int8_t addr[19];
> u_int plen;
>
> TCHECK(pptr[0]);
> plen = pptr[0]; /* get prefix length */
>
> plen-=(24+64); /* adjust prefixlen - labellength - RD len*/
>
> if (152 < plen)
> return -1;
>
> memset(&addr, 0, sizeof(addr));
> TCHECK2(pptr[12], (plen + 7) / 8);
> memcpy(&addr, &pptr[12], (plen + 7) / 8);
> if (plen % 8) {
> addr[(plen + 7) / 8 - 1] &=
> ((0xff00 >> (plen % 8)) & 0xff);
> }
> /* the label may get offsetted by 4 bits so lets shift it right */
> snprintf(buf, buflen, "RD: %s, %s/%d, label:%u %s",
> bgp_vpn_rd_print(pptr+4),
> isonsap_string(addr,(plen + 7) / 8 - 1),
> plen,
> EXTRACT_24BITS(pptr+1)>>4,
> ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" );
>
> return 12 + (plen + 7) / 8;
>
> trunc:
> return -2;
> }
>
> static int
783a856
> char tokbuf[TOKBUFSIZE];
794c867,870
< printf("%s", tok2str(bgp_origin_values, "Unknown Origin Typecode", tptr[0]));
---
> printf("%s", tok2strbuf(bgp_origin_values,
> "Unknown Origin Typecode",
> tptr[0],
> tokbuf, sizeof(tokbuf)));
796a873
>
809c886,888
< printf("%s", tok2str(bgp_as_path_segment_open_values, "?", tptr[0]));
---
> printf("%s", tok2strbuf(bgp_as_path_segment_open_values,
> "?", tptr[0],
> tokbuf, sizeof(tokbuf)));
815c894,896
< printf("%s", tok2str(bgp_as_path_segment_close_values, "?", tptr[0]));
---
> printf("%s", tok2strbuf(bgp_as_path_segment_close_values,
> "?", tptr[0],
> tokbuf, sizeof(tokbuf)));
908c989,990
< tok2str(bgp_afi_values, "Unknown AFI", af),
---
> tok2strbuf(bgp_afi_values, "Unknown AFI", af,
> tokbuf, sizeof(tokbuf)),
911c993,994
< tok2str(bgp_safi_values, "Unknown SAFI", safi),
---
> tok2strbuf(bgp_safi_values, "Unknown SAFI", safi,
> tokbuf, sizeof(tokbuf)),
914,915c997,1005
< if (af == AFNUM_INET || af==AFNUM_L2VPN)
< ;
---
> switch(af<<8 | safi) {
> case (AFNUM_INET<<8 | SAFNUM_UNICAST):
> case (AFNUM_INET<<8 | SAFNUM_MULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
> case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO):
> case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST):
917,918c1007,1014
< else if (af == AFNUM_INET6)
< ;
---
> case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_RT_ROUTING_INFO):
> case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST):
920,921c1016,1027
< else {
< printf("\n\t no AFI %u decoder",af);
---
> case (AFNUM_NSAP<<8 | SAFNUM_UNICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST):
> break;
> default:
> printf("\n\t no AFI %u / SAFI %u decoder",af,safi);
923a1030
> goto done;
934,978c1041,1073
< printf("\n\t nexthop: ");
< while (tlen > 0) {
< switch (af) {
< case AFNUM_INET:
< switch(safi) {
< case SAFNUM_UNICAST:
< case SAFNUM_MULTICAST:
< case SAFNUM_UNIMULTICAST:
< case SAFNUM_LABUNICAST:
< case SAFNUM_RT_ROUTING_INFO:
< if (tlen < (int)sizeof(struct in_addr)) {
< printf("invalid len");
< tlen = 0;
< } else {
< TCHECK2(tptr[0], sizeof(struct in_addr));
< printf("%s",getname(tptr));
< tlen -= sizeof(struct in_addr);
< tptr += sizeof(struct in_addr);
< }
< break;
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< if (tlen < (int)(sizeof(struct in_addr)+BGP_VPN_RD_LEN)) {
< printf("invalid len");
< tlen = 0;
< } else {
< TCHECK2(tptr[0], sizeof(struct in_addr)+BGP_VPN_RD_LEN);
< printf("RD: %s, %s",
< bgp_vpn_rd_print(tptr),
< getname(tptr+BGP_VPN_RD_LEN));
< tlen -= (sizeof(struct in_addr)+BGP_VPN_RD_LEN);
< tptr += (sizeof(struct in_addr)+BGP_VPN_RD_LEN);
< }
< break;
< default:
< TCHECK2(tptr[0], tlen);
< printf("no SAFI %u decoder",safi);
< if (vflag <= 1)
< print_unknown_data(tptr,"\n\t ",tlen);
< tptr += tlen;
< tlen = 0;
< break;
< }
< break;
---
> printf("\n\t nexthop: ");
> while (tlen > 0) {
> switch(af<<8 | safi) {
> case (AFNUM_INET<<8 | SAFNUM_UNICAST):
> case (AFNUM_INET<<8 | SAFNUM_MULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
> case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO):
> if (tlen < (int)sizeof(struct in_addr)) {
> printf("invalid len");
> tlen = 0;
> } else {
> TCHECK2(tptr[0], sizeof(struct in_addr));
> printf("%s",getname(tptr));
> tlen -= sizeof(struct in_addr);
> tptr += sizeof(struct in_addr);
> }
> break;
> case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST):
> if (tlen < (int)(sizeof(struct in_addr)+BGP_VPN_RD_LEN)) {
> printf("invalid len");
> tlen = 0;
> } else {
> TCHECK2(tptr[0], sizeof(struct in_addr)+BGP_VPN_RD_LEN);
> printf("RD: %s, %s",
> bgp_vpn_rd_print(tptr),
> getname(tptr+BGP_VPN_RD_LEN));
> tlen -= (sizeof(struct in_addr)+BGP_VPN_RD_LEN);
> tptr += (sizeof(struct in_addr)+BGP_VPN_RD_LEN);
> }
> break;
980,1021c1075,1104
< case AFNUM_INET6:
< switch(safi) {
< case SAFNUM_UNICAST:
< case SAFNUM_MULTICAST:
< case SAFNUM_UNIMULTICAST:
< case SAFNUM_LABUNICAST:
< case SAFNUM_RT_ROUTING_INFO:
< if (tlen < (int)sizeof(struct in6_addr)) {
< printf("invalid len");
< tlen = 0;
< } else {
< TCHECK2(tptr[0], sizeof(struct in6_addr));
< printf("%s", getname6(tptr));
< tlen -= sizeof(struct in6_addr);
< tptr += sizeof(struct in6_addr);
< }
< break;
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< if (tlen < (int)(sizeof(struct in6_addr)+BGP_VPN_RD_LEN)) {
< printf("invalid len");
< tlen = 0;
< } else {
< TCHECK2(tptr[0], sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
< printf("RD: %s, %s",
< bgp_vpn_rd_print(tptr),
< getname6(tptr+BGP_VPN_RD_LEN));
< tlen -= (sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
< tptr += (sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
< }
< break;
< default:
< TCHECK2(tptr[0], tlen);
< printf("no SAFI %u decoder",safi);
< if (vflag <= 1)
< print_unknown_data(tptr,"\n\t ",tlen);
< tptr += tlen;
< tlen = 0;
< break;
< }
< break;
---
> case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_RT_ROUTING_INFO):
> if (tlen < (int)sizeof(struct in6_addr)) {
> printf("invalid len");
> tlen = 0;
> } else {
> TCHECK2(tptr[0], sizeof(struct in6_addr));
> printf("%s", getname6(tptr));
> tlen -= sizeof(struct in6_addr);
> tptr += sizeof(struct in6_addr);
> }
> break;
> case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST):
> if (tlen < (int)(sizeof(struct in6_addr)+BGP_VPN_RD_LEN)) {
> printf("invalid len");
> tlen = 0;
> } else {
> TCHECK2(tptr[0], sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
> printf("RD: %s, %s",
> bgp_vpn_rd_print(tptr),
> getname6(tptr+BGP_VPN_RD_LEN));
> tlen -= (sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
> tptr += (sizeof(struct in6_addr)+BGP_VPN_RD_LEN);
> }
> break;
1023,1047c1106,1126
< case AFNUM_L2VPN:
< switch(safi) {
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< if (tlen < (int)sizeof(struct in_addr)) {
< printf("invalid len");
< tlen = 0;
< } else {
< TCHECK2(tptr[0], sizeof(struct in_addr));
< printf("%s", getname(tptr));
< tlen -= (sizeof(struct in_addr));
< tptr += (sizeof(struct in_addr));
< }
< break;
< default:
< TCHECK2(tptr[0], tlen);
< printf("no SAFI %u decoder",safi);
< if (vflag <= 1)
< print_unknown_data(tptr,"\n\t ",tlen);
< tptr += tlen;
< tlen = 0;
< break;
< }
< break;
---
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST):
> if (tlen < (int)sizeof(struct in_addr)) {
> printf("invalid len");
> tlen = 0;
> } else {
> TCHECK2(tptr[0], sizeof(struct in_addr));
> printf("%s", getname(tptr));
> tlen -= (sizeof(struct in_addr));
> tptr += (sizeof(struct in_addr));
> }
> break;
> case (AFNUM_NSAP<<8 | SAFNUM_UNICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST):
> TCHECK2(tptr[0], tlen);
> printf("%s",isonsap_string(tptr,tlen));
> tptr += tlen;
> tlen = 0;
> break;
1049,1058c1128,1161
< default:
< TCHECK2(tptr[0], tlen);
< printf("no AFI %u decoder",af);
< if (vflag <= 1)
< print_unknown_data(tptr,"\n\t ",tlen);
< tptr += tlen;
< tlen = 0;
< break;
< }
< }
---
> case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST):
> if (tlen < BGP_VPN_RD_LEN+1) {
> printf("invalid len");
> tlen = 0;
> } else {
> TCHECK2(tptr[0], tlen);
> printf("RD: %s, %s",
> bgp_vpn_rd_print(tptr),
> isonsap_string(tptr+BGP_VPN_RD_LEN,tlen-BGP_VPN_RD_LEN));
> /* rfc986 mapped IPv4 address ? */
> if (EXTRACT_32BITS(tptr+BGP_VPN_RD_LEN) == 0x47000601)
> printf(" = %s", getname(tptr+BGP_VPN_RD_LEN+4));
> #ifdef INET6
> /* rfc1888 mapped IPv6 address ? */
> else if (EXTRACT_24BITS(tptr+BGP_VPN_RD_LEN) == 0x350000)
> printf(" = %s", getname6(tptr+BGP_VPN_RD_LEN+3));
> #endif
> tptr += tlen;
> tlen = 0;
> }
> break;
> default:
> TCHECK2(tptr[0], tlen);
> printf("no AFI %u/SAFI %u decoder",af,safi);
> if (vflag <= 1)
> print_unknown_data(tptr,"\n\t ",tlen);
> tptr += tlen;
> tlen = 0;
> goto done;
> break;
> }
> }
1078,1130c1181,1221
< switch (af) {
< case AFNUM_INET:
< switch (safi) {
< case SAFNUM_UNICAST:
< case SAFNUM_MULTICAST:
< case SAFNUM_UNIMULTICAST:
< advance = decode_prefix4(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_LABUNICAST:
< advance = decode_labeled_prefix4(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< advance = decode_labeled_vpn_prefix4(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_RT_ROUTING_INFO:
< advance = decode_rt_routing_info(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< default:
< TCHECK2(*(tptr-3),tlen);
< printf("\n\t no SAFI %u decoder",safi);
< if (vflag <= 1)
< print_unknown_data(tptr-3,"\n\t ",tlen);
< advance = 0;
< tptr = pptr + len;
< break;
< }
< break;
---
> switch (af<<8 | safi) {
> case (AFNUM_INET<<8 | SAFNUM_UNICAST):
> case (AFNUM_INET<<8 | SAFNUM_MULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST):
> advance = decode_prefix4(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
> advance = decode_labeled_prefix4(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST):
> advance = decode_labeled_vpn_prefix4(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO):
> advance = decode_rt_routing_info(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
1132,1183c1223,1262
< case AFNUM_INET6:
< switch (safi) {
< case SAFNUM_UNICAST:
< case SAFNUM_MULTICAST:
< case SAFNUM_UNIMULTICAST:
< advance = decode_prefix6(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_LABUNICAST:
< advance = decode_labeled_prefix6(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< advance = decode_labeled_vpn_prefix6(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_RT_ROUTING_INFO:
< advance = decode_rt_routing_info(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< default:
< TCHECK2(*(tptr-3),tlen);
< printf("\n\t no SAFI %u decoder ",safi);
< if (vflag <= 1)
< print_unknown_data(tptr-3,"\n\t ",tlen);
< advance = 0;
< tptr = pptr + len;
< break;
< }
< break;
---
> case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
> advance = decode_prefix6(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
> advance = decode_labeled_prefix6(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST):
> advance = decode_labeled_vpn_prefix6(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET6<<8 | SAFNUM_RT_ROUTING_INFO):
> advance = decode_rt_routing_info(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
1185,1219c1264,1308
< case AFNUM_L2VPN:
< switch(safi) {
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< advance = decode_labeled_vpn_l2(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< default:
< TCHECK2(*tptr,tlen);
< printf("no SAFI %u decoder",safi);
< if (vflag <= 1)
< print_unknown_data(tptr,"\n\t ",tlen);
< advance = 0;
< tptr = pptr + len;
< break;
< }
< break;
<
<
< default:
< TCHECK2(*(tptr-3),tlen);
< printf("\n\t no AFI %u decoder ",af);
< if (vflag <= 1)
< print_unknown_data(tptr-3,"\n\t ",tlen);
< advance = 0;
< tptr = pptr + len;
< break;
< }
< tptr += advance;
---
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST):
> advance = decode_labeled_vpn_l2(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_NSAP<<8 | SAFNUM_UNICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST):
> advance = decode_labeled_clnp_prefix(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST):
> advance = decode_labeled_vpn_clnp_prefix(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> default:
> TCHECK2(*tptr,tlen);
> printf("\n\t no AFI %u / SAFI %u decoder",af,safi);
> if (vflag <= 1)
> print_unknown_data(tptr,"\n\t ",tlen);
> advance = 0;
> tptr = pptr + len;
> break;
> }
> break;
>
> tptr += advance;
1220a1310
> done:
1224c1314
< TCHECK2(tptr[0], 3);
---
> TCHECK2(tptr[0], BGP_MP_NLRI_MINSIZE);
1229c1319,1320
< tok2str(bgp_afi_values, "Unknown AFI", af),
---
> tok2strbuf(bgp_afi_values, "Unknown AFI", af,
> tokbuf, sizeof(tokbuf)),
1232c1323,1324
< tok2str(bgp_safi_values, "Unknown SAFI", safi),
---
> tok2strbuf(bgp_safi_values, "Unknown SAFI", safi,
> tokbuf, sizeof(tokbuf)),
1234a1327,1329
> if (len == BGP_MP_NLRI_MINSIZE)
> printf("\n\t End-of-Rib Marker (empty NLRI)");
>
1238,1282c1333,1364
< switch (af) {
< case AFNUM_INET:
< switch (safi) {
< case SAFNUM_UNICAST:
< case SAFNUM_MULTICAST:
< case SAFNUM_UNIMULTICAST:
< advance = decode_prefix4(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_LABUNICAST:
< advance = decode_labeled_prefix4(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< advance = decode_labeled_vpn_prefix4(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< default:
< TCHECK2(*(tptr-3),tlen);
< printf("\n\t no SAFI %u decoder",safi);
< if (vflag <= 1)
< print_unknown_data(tptr-3,"\n\t ",tlen);
< advance = 0;
< tptr = pptr + len;
< break;
< }
< break;
<
---
> switch (af<<8 | safi) {
> case (AFNUM_INET<<8 | SAFNUM_UNICAST):
> case (AFNUM_INET<<8 | SAFNUM_MULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_UNIMULTICAST):
> advance = decode_prefix4(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
> advance = decode_labeled_prefix4(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_INET<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_INET<<8 | SAFNUM_VPNUNIMULTICAST):
> advance = decode_labeled_vpn_prefix4(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
1284,1326c1366,1396
< case AFNUM_INET6:
< switch (safi) {
< case SAFNUM_UNICAST:
< case SAFNUM_MULTICAST:
< case SAFNUM_UNIMULTICAST:
< advance = decode_prefix6(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_LABUNICAST:
< advance = decode_labeled_prefix6(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< advance = decode_labeled_vpn_prefix6(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal prefix length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< default:
< TCHECK2(*(tptr-3),tlen);
< printf("\n\t no SAFI %u decoder",safi);
< if (vflag <= 1)
< print_unknown_data(tptr-3,"\n\t ",tlen);
< advance = 0;
< tptr = pptr + len;
< break;
< }
< break;
---
> case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
> advance = decode_prefix6(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
> advance = decode_labeled_prefix6(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_INET6<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_INET6<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_INET6<<8 | SAFNUM_VPNUNIMULTICAST):
> advance = decode_labeled_vpn_prefix6(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
1328,1363c1398,1441
<
< case AFNUM_L2VPN:
< switch(safi) {
< case SAFNUM_VPNUNICAST:
< case SAFNUM_VPNMULTICAST:
< case SAFNUM_VPNUNIMULTICAST:
< advance = decode_labeled_vpn_l2(tptr, buf, sizeof(buf));
< if (advance == -1)
< printf("\n\t (illegal length)");
< else if (advance == -2)
< goto trunc;
< else
< printf("\n\t %s", buf);
< break;
< default:
< TCHECK2(*(tptr-3),tlen);
< printf("no SAFI %u decoder",safi);
< if (vflag <= 1)
< print_unknown_data(tptr-3,"\n\t ",tlen);
< advance = 0;
< tptr = pptr + len;
< break;
< }
< break;
<
< default:
< TCHECK2(*(tptr-3),tlen);
< printf("\n\t no AFI %u decoder",af);
< if (vflag <= 1)
< print_unknown_data(tptr-3,"\n\t ",tlen);
< advance = 0;
< tptr = pptr + len;
< break;
< }
<
< tptr += advance;
---
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_L2VPN<<8 | SAFNUM_VPNUNIMULTICAST):
> advance = decode_labeled_vpn_l2(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_NSAP<<8 | SAFNUM_UNICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_MULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_UNIMULTICAST):
> advance = decode_labeled_clnp_prefix(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> case (AFNUM_NSAP<<8 | SAFNUM_VPNUNICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNMULTICAST):
> case (AFNUM_NSAP<<8 | SAFNUM_VPNUNIMULTICAST):
> advance = decode_labeled_vpn_clnp_prefix(tptr, buf, sizeof(buf));
> if (advance == -1)
> printf("\n\t (illegal prefix length)");
> else if (advance == -2)
> goto trunc;
> else
> printf("\n\t %s", buf);
> break;
> default:
> TCHECK2(*(tptr-3),tlen);
> printf("no AFI %u / SAFI %u decoder",af,safi);
> if (vflag <= 1)
> print_unknown_data(tptr-3,"\n\t ",tlen);
> advance = 0;
> tptr = pptr + len;
> break;
> }
> break;
> tptr += advance;
1378c1456,1458
< tok2str(bgp_extd_comm_subtype_values, "unknown extd community typecode", extd_comm),
---
> tok2strbuf(bgp_extd_comm_subtype_values,
> "unknown extd community typecode",
> extd_comm, tokbuf, sizeof(tokbuf)),
1406a1487,1491
> case BGP_EXT_COM_CISCO_MCAST:
> printf(": AS %u, group %s",
> EXTRACT_16BITS(tptr+2),
> getname(tptr+4));
> break;
1419,1421c1504,1507
< tok2str(bgp_extd_comm_ospf_rtype_values,
< "unknown (0x%02x)",
< *(tptr+6)),
---
> tok2strbuf(bgp_extd_comm_ospf_rtype_values,
> "unknown (0x%02x)",
> *(tptr+6),
> tokbuf, sizeof(tokbuf)),
1427,1429c1513,1516
< tok2str(bgp_l2vpn_encaps_values,
< "unknown encaps",
< *(tptr+2)),
---
> tok2strbuf(l2vpn_encaps_values,
> "unknown encaps",
> *(tptr+2),
> tokbuf, sizeof(tokbuf)),
1441a1529,1570
> case BGPTYPE_ATTR_SET:
> TCHECK2(tptr[0], 4);
> printf("\n\t Origin AS: %u", EXTRACT_32BITS(tptr));
> tptr+=4;
> len -=4;
>
> while (len >= 2 ) {
> int alen;
> struct bgp_attr bgpa;
>
> TCHECK2(tptr[0], sizeof(bgpa));
> memcpy(&bgpa, tptr, sizeof(bgpa));
> alen = bgp_attr_len(&bgpa);
> tptr += bgp_attr_off(&bgpa);
> len -= bgp_attr_off(&bgpa);
>
> printf("\n\t %s (%u), length: %u",
> tok2strbuf(bgp_attr_values,
> "Unknown Attribute", bgpa.bgpa_type,
> tokbuf, sizeof(tokbuf)),
> bgpa.bgpa_type,
> alen);
>
> if (bgpa.bgpa_flags) {
> printf(", Flags [%s%s%s%s",
> bgpa.bgpa_flags & 0x80 ? "O" : "",
> bgpa.bgpa_flags & 0x40 ? "T" : "",
> bgpa.bgpa_flags & 0x20 ? "P" : "",
> bgpa.bgpa_flags & 0x10 ? "E" : "");
> if (bgpa.bgpa_flags & 0xf)
> printf("+%x", bgpa.bgpa_flags & 0xf);
> printf("]: ");
> }
> /* FIXME check for recursion */
> if (!bgp_attr_print(&bgpa, tptr, alen))
> return 0;
> tptr += alen;
> len -= alen;
> }
> break;
>
>
1464a1594,1595
> char tokbuf[TOKBUFSIZE];
> char tokbuf2[TOKBUFSIZE];
1494c1625,1627
< tok2str(bgp_opt_values,"Unknown", bgpopt.bgpopt_type),
---
> tok2strbuf(bgp_opt_values,"Unknown",
> bgpopt.bgpopt_type,
> tokbuf, sizeof(tokbuf)),
1504,1505c1637,1640
< printf("\n\t %s, length: %u",
< tok2str(bgp_capcode_values,"Unknown", cap_type),
---
> printf("\n\t %s (%u), length: %u",
> tok2strbuf(bgp_capcode_values, "Unknown",
> cap_type, tokbuf, sizeof(tokbuf)),
> cap_type,
1510c1645,1647
< tok2str(bgp_afi_values,"Unknown", EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+2)),
---
> tok2strbuf(bgp_afi_values, "Unknown",
> EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+2),
> tokbuf, sizeof(tokbuf)),
1512c1649,1651
< tok2str(bgp_safi_values,"Unknown", opt[i+BGP_OPT_SIZE+5]),
---
> tok2strbuf(bgp_safi_values, "Unknown",
> opt[i+BGP_OPT_SIZE+5],
> tokbuf, sizeof(tokbuf)),
1523c1662,1664
< tok2str(bgp_afi_values,"Unknown", EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+cap_offset)),
---
> tok2strbuf(bgp_afi_values,"Unknown",
> EXTRACT_16BITS(opt+i+BGP_OPT_SIZE+cap_offset),
> tokbuf, sizeof(tokbuf)),
1525c1666,1668
< tok2str(bgp_safi_values,"Unknown", opt[i+BGP_OPT_SIZE+cap_offset+2]),
---
> tok2strbuf(bgp_safi_values,"Unknown",
> opt[i+BGP_OPT_SIZE+cap_offset+2],
> tokbuf2, sizeof(tokbuf2)),
1567a1711
> char tokbuf[TOKBUFSIZE];
1610a1755,1760
>
> if (len == 0 && length == BGP_UPDATE_MINSIZE) {
> printf("\n\t End-of-Rib Marker (empty NLRI)");
> return;
> }
>
1623c1773,1775
< tok2str(bgp_attr_values, "Unknown Attribute", bgpa.bgpa_type),
---
> tok2strbuf(bgp_attr_values, "Unknown Attribute",
> bgpa.bgpa_type,
> tokbuf, sizeof(tokbuf)),
1641c1793
< }
---
> }
1669a1822,1823
> char tokbuf[TOKBUFSIZE];
> char tokbuf2[TOKBUFSIZE];
1680c1834,1835
< tok2str(bgp_notify_major_values, "Unknown Error", bgpn.bgpn_major),
---
> tok2strbuf(bgp_notify_major_values, "Unknown Error",
> bgpn.bgpn_major, tokbuf, sizeof(tokbuf)),
1687c1842,1843
< tok2str(bgp_notify_minor_msg_values, "Unknown", bgpn.bgpn_minor),
---
> tok2strbuf(bgp_notify_minor_msg_values, "Unknown",
> bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
1692c1848,1849
< tok2str(bgp_notify_minor_open_values, "Unknown", bgpn.bgpn_minor),
---
> tok2strbuf(bgp_notify_minor_open_values, "Unknown",
> bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
1697c1854,1855
< tok2str(bgp_notify_minor_update_values, "Unknown", bgpn.bgpn_minor),
---
> tok2strbuf(bgp_notify_minor_update_values, "Unknown",
> bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
1702c1860,1861
< tok2str(bgp_notify_minor_cap_values, "Unknown", bgpn.bgpn_minor),
---
> tok2strbuf(bgp_notify_minor_cap_values, "Unknown",
> bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
1706c1865,1866
< tok2str(bgp_notify_minor_cease_values, "Unknown", bgpn.bgpn_minor),
---
> tok2strbuf(bgp_notify_minor_cease_values, "Unknown",
> bgpn.bgpn_minor, tokbuf, sizeof(tokbuf)),
1716c1876,1877
< tok2str(bgp_afi_values, "Unknown", EXTRACT_16BITS(tptr)),
---
> tok2strbuf(bgp_afi_values, "Unknown",
> EXTRACT_16BITS(tptr), tokbuf, sizeof(tokbuf)),
1718c1879,1880
< tok2str(bgp_safi_values, "Unknown", *(tptr+2)),
---
> tok2strbuf(bgp_safi_values, "Unknown", *(tptr+2),
> tokbuf2, sizeof(tokbuf)),
1735a1898,1900
> char tokbuf[TOKBUFSIZE];
> char tokbuf2[TOKBUFSIZE];
>
1739,1740c1904,1908
< tok2str(bgp_afi_values,"Unknown",
< EXTRACT_16BITS(&bgp_route_refresh_header->afi)), /* this stinks but the compiler pads the structure weird */
---
> tok2strbuf(bgp_afi_values,"Unknown",
> /* this stinks but the compiler pads the structure
> * weird */
> EXTRACT_16BITS(&bgp_route_refresh_header->afi),
> tokbuf, sizeof(tokbuf)),
1742,1743c1910,1912
< tok2str(bgp_safi_values,"Unknown",
< bgp_route_refresh_header->safi),
---
> tok2strbuf(bgp_safi_values,"Unknown",
> bgp_route_refresh_header->safi,
> tokbuf2, sizeof(tokbuf2)),
1755a1925
> char tokbuf[TOKBUFSIZE];
1760c1930,1931
< tok2str(bgp_msg_values, "Unknown", bgp.bgp_type),
---
> tok2strbuf(bgp_msg_values, "Unknown", bgp.bgp_type,
> tokbuf, sizeof(tokbuf)),
1802a1974
> char tokbuf[TOKBUFSIZE];
1850c2022,2026
< printf("\n[|BGP %s]", tok2str(bgp_msg_values, "Unknown Message Type",bgp.bgp_type));
---
> printf("\n[|BGP %s]",
> tok2strbuf(bgp_msg_values,
> "Unknown Message Type",
> bgp.bgp_type,
> tokbuf, sizeof(tokbuf)));