- while (len - (tptr - pptr) > 0) {
- 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;
- case (AFNUM_INET<<8 | SAFNUM_MULTICAST_VPN):
- advance = decode_multicast_vpn(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;
-#ifdef INET6
- 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;
-#endif
- case (AFNUM_VPLS<<8 | SAFNUM_VPLS):
- 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_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;
- }
- if (advance < 0)
- break;
- tptr += advance;
- }
- done:
- break;
-
- case BGPTYPE_MP_UNREACH_NLRI:
- TCHECK2(tptr[0], BGP_MP_NLRI_MINSIZE);
- af = EXTRACT_16BITS(tptr);
- safi = tptr[2];
-
- printf("\n\t AFI: %s (%u), %sSAFI: %s (%u)",
- tok2strbuf(af_values, "Unknown AFI", af,
- tokbuf, sizeof(tokbuf)),
- af,
- (safi>128) ? "vendor specific " : "", /* 128 is meanwhile wellknown */
- tok2strbuf(bgp_safi_values, "Unknown SAFI", safi,
- tokbuf, sizeof(tokbuf)),
- safi);
-
- if (len == BGP_MP_NLRI_MINSIZE)
- printf("\n\t End-of-Rib Marker (empty NLRI)");
-
- tptr += 3;
-
- while (len - (tptr - pptr) > 0) {
- 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;
-#ifdef INET6
- 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;
-#endif
- case (AFNUM_VPLS<<8 | SAFNUM_VPLS):
- 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_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;
- }
- if (advance < 0)
- break;
- tptr += advance;
- }
- break;
- case BGPTYPE_EXTD_COMMUNITIES:
- if (len % 8) {
- printf("invalid len");
- break;
- }
- while (tlen>0) {
- u_int16_t extd_comm;
-
- TCHECK2(tptr[0], 2);
- extd_comm=EXTRACT_16BITS(tptr);
-
- printf("\n\t %s (0x%04x), Flags [%s]",
- tok2strbuf(bgp_extd_comm_subtype_values,
- "unknown extd community typecode",
- extd_comm, tokbuf, sizeof(tokbuf)),
- extd_comm,
- bittok2str(bgp_extd_comm_flag_values, "none", extd_comm));
-
- TCHECK2(*(tptr+2), 6);
- switch(extd_comm) {
- case BGP_EXT_COM_RT_0:
- case BGP_EXT_COM_RO_0:
- printf(": %u:%s",
- EXTRACT_16BITS(tptr+2),
- getname(tptr+4));
- break;
- case BGP_EXT_COM_RT_1:
- case BGP_EXT_COM_RO_1:
- case BGP_EXT_COM_VRF_RT_IMP:
- printf(": %s:%u",
- getname(tptr+2),
- EXTRACT_16BITS(tptr+6));
- break;
- case BGP_EXT_COM_RT_2:
- case BGP_EXT_COM_RO_2:
- printf(": %u:%u",
- EXTRACT_32BITS(tptr+2),
- EXTRACT_16BITS(tptr+6));
- break;
- case BGP_EXT_COM_LINKBAND:
- bw.i = EXTRACT_32BITS(tptr+2);
- printf(": bandwidth: %.3f Mbps",
- bw.f*8/1000000);
- break;
- case BGP_EXT_COM_CISCO_MCAST:
- printf(": AS %u, group %s",
- EXTRACT_16BITS(tptr+2),
- getname(tptr+4));
- break;
- case BGP_EXT_COM_VPN_ORIGIN:
- case BGP_EXT_COM_VPN_ORIGIN2:
- case BGP_EXT_COM_VPN_ORIGIN3:
- case BGP_EXT_COM_VPN_ORIGIN4:
- case BGP_EXT_COM_OSPF_RID:
- case BGP_EXT_COM_OSPF_RID2:
- printf("%s", getname(tptr+2));
- break;
- case BGP_EXT_COM_OSPF_RTYPE:
- case BGP_EXT_COM_OSPF_RTYPE2:
- printf(": area:%s, router-type:%s, metric-type:%s%s",
- getname(tptr+2),
- tok2strbuf(bgp_extd_comm_ospf_rtype_values,
- "unknown (0x%02x)",
- *(tptr+6),
- tokbuf, sizeof(tokbuf)),
- (*(tptr+7) & BGP_OSPF_RTYPE_METRIC_TYPE) ? "E2" : "",
- ((*(tptr+6) == BGP_OSPF_RTYPE_EXT) || (*(tptr+6) == BGP_OSPF_RTYPE_NSSA)) ? "E1" : "");
- break;
- case BGP_EXT_COM_L2INFO:
- printf(": %s Control Flags [0x%02x]:MTU %u",
- tok2strbuf(l2vpn_encaps_values,
- "unknown encaps",
- *(tptr+2),
- tokbuf, sizeof(tokbuf)),
- *(tptr+3),
- EXTRACT_16BITS(tptr+4));
- break;
- case BGP_EXT_COM_SOURCE_AS:
- printf(": AS %u", EXTRACT_16BITS(tptr+2));
- break;
- default:
- TCHECK2(*tptr,8);
- print_unknown_data(tptr,"\n\t ",8);
- break;
- }
- tlen -=8;
- tptr +=8;
- }