- while (tptr < pptr + len) {
- 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(ndo, tptr, len, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else if (advance == -3)
- break; /* bytes left, but not enough */
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
- advance = decode_labeled_prefix4(ndo, tptr, len, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else if (advance == -3)
- break; /* bytes left, but not enough */
- else
- ND_PRINT((ndo, "\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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET<<8 | SAFNUM_RT_ROUTING_INFO):
- advance = decode_rt_routing_info(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET<<8 | SAFNUM_MULTICAST_VPN): /* fall through */
- case (AFNUM_INET6<<8 | SAFNUM_MULTICAST_VPN):
- advance = decode_multicast_vpn(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
-
- case (AFNUM_INET<<8 | SAFNUM_MDT):
- advance = decode_mdt_vpn_nlri(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
- case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
- case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
- advance = decode_prefix6(ndo, tptr, len, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else if (advance == -3)
- break; /* bytes left, but not enough */
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
- advance = decode_labeled_prefix6(ndo, tptr, len, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else if (advance == -3)
- break; /* bytes left, but not enough */
- else
- ND_PRINT((ndo, "\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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- 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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- default:
- ND_TCHECK2(*tptr,tlen);
- ND_PRINT((ndo, "\n\t no AFI %u / SAFI %u decoder", af, safi));
- if (ndo->ndo_vflag <= 1)
- print_unknown_data(ndo, tptr, "\n\t ", tlen);
- advance = 0;
- tptr = pptr + len;
- break;
- }
- if (advance < 0)
- break;
- tptr += advance;
- }
- done:
- break;
-
- case BGPTYPE_MP_UNREACH_NLRI:
- ND_TCHECK2(tptr[0], BGP_MP_NLRI_MINSIZE);
- af = EXTRACT_BE_16BITS(tptr);
- safi = tptr[2];
-
- ND_PRINT((ndo, "\n\t AFI: %s (%u), %sSAFI: %s (%u)",
- tok2str(af_values, "Unknown AFI", af),
- af,
- (safi>128) ? "vendor specific " : "", /* 128 is meanwhile wellknown */
- tok2str(bgp_safi_values, "Unknown SAFI", safi),
- safi));
-
- if (len == BGP_MP_NLRI_MINSIZE)
- ND_PRINT((ndo, "\n\t End-of-Rib Marker (empty NLRI)"));
-
- tptr += 3;
-
- while (tptr < pptr + len) {
- 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(ndo, tptr, len, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else if (advance == -3)
- break; /* bytes left, but not enough */
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET<<8 | SAFNUM_LABUNICAST):
- advance = decode_labeled_prefix4(ndo, tptr, len, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else if (advance == -3)
- break; /* bytes left, but not enough */
- else
- ND_PRINT((ndo, "\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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET6<<8 | SAFNUM_UNICAST):
- case (AFNUM_INET6<<8 | SAFNUM_MULTICAST):
- case (AFNUM_INET6<<8 | SAFNUM_UNIMULTICAST):
- advance = decode_prefix6(ndo, tptr, len, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else if (advance == -3)
- break; /* bytes left, but not enough */
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET6<<8 | SAFNUM_LABUNICAST):
- advance = decode_labeled_prefix6(ndo, tptr, len, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else if (advance == -3)
- break; /* bytes left, but not enough */
- else
- ND_PRINT((ndo, "\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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- 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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\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(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET<<8 | SAFNUM_MDT):
- advance = decode_mdt_vpn_nlri(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- case (AFNUM_INET<<8 | SAFNUM_MULTICAST_VPN): /* fall through */
- case (AFNUM_INET6<<8 | SAFNUM_MULTICAST_VPN):
- advance = decode_multicast_vpn(ndo, tptr, buf, sizeof(buf));
- if (advance == -1)
- ND_PRINT((ndo, "\n\t (illegal prefix length)"));
- else if (advance == -2)
- goto trunc;
- else
- ND_PRINT((ndo, "\n\t %s", buf));
- break;
- default:
- ND_TCHECK2(*(tptr-3),tlen);
- ND_PRINT((ndo, "no AFI %u / SAFI %u decoder", af, safi));
- if (ndo->ndo_vflag <= 1)
- print_unknown_data(ndo, 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) {
- ND_PRINT((ndo, "invalid len"));
- break;
- }
- while (tlen>0) {
- uint16_t extd_comm;
-
- ND_TCHECK_2(tptr);
- extd_comm=EXTRACT_BE_16BITS(tptr);
-
- ND_PRINT((ndo, "\n\t %s (0x%04x), Flags [%s]",
- tok2str(bgp_extd_comm_subtype_values,
- "unknown extd community typecode",
- extd_comm),
- extd_comm,
- bittok2str(bgp_extd_comm_flag_values, "none", extd_comm)));
-
- ND_TCHECK2(*(tptr+2), 6);
- switch(extd_comm) {
- case BGP_EXT_COM_RT_0:
- case BGP_EXT_COM_RO_0:
- case BGP_EXT_COM_L2VPN_RT_0:
- ND_PRINT((ndo, ": %u:%u (= %s)",
- EXTRACT_BE_16BITS(tptr + 2),
- EXTRACT_BE_32BITS(tptr + 4),
- ipaddr_string(ndo, tptr+4)));
- break;
- case BGP_EXT_COM_RT_1:
- case BGP_EXT_COM_RO_1:
- case BGP_EXT_COM_L2VPN_RT_1:
- case BGP_EXT_COM_VRF_RT_IMP:
- ND_PRINT((ndo, ": %s:%u",
- ipaddr_string(ndo, tptr+2),
- EXTRACT_BE_16BITS(tptr + 6)));
- break;
- case BGP_EXT_COM_RT_2:
- case BGP_EXT_COM_RO_2:
- ND_PRINT((ndo, ": %s:%u",
- as_printf(ndo, astostr, sizeof(astostr),
- EXTRACT_BE_32BITS(tptr + 2)), EXTRACT_BE_16BITS(tptr + 6)));
- break;
- case BGP_EXT_COM_LINKBAND:
- bw.i = EXTRACT_BE_32BITS(tptr + 2);
- ND_PRINT((ndo, ": bandwidth: %.3f Mbps",
- bw.f*8/1000000));
- 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:
- ND_PRINT((ndo, "%s", ipaddr_string(ndo, tptr+2)));
- break;
- case BGP_EXT_COM_OSPF_RTYPE:
- case BGP_EXT_COM_OSPF_RTYPE2:
- ND_PRINT((ndo, ": area:%s, router-type:%s, metric-type:%s%s",
- ipaddr_string(ndo, tptr+2),
- tok2str(bgp_extd_comm_ospf_rtype_values,
- "unknown (0x%02x)",
- EXTRACT_8BITS((tptr + 6))),
- (*(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:
- ND_PRINT((ndo, ": %s Control Flags [0x%02x]:MTU %u",
- tok2str(l2vpn_encaps_values,
- "unknown encaps",
- EXTRACT_8BITS((tptr + 2))),
- EXTRACT_8BITS((tptr + 3)),
- EXTRACT_BE_16BITS(tptr + 4)));
- break;
- case BGP_EXT_COM_SOURCE_AS:
- ND_PRINT((ndo, ": AS %u", EXTRACT_BE_16BITS(tptr + 2)));
- break;
- default:
- ND_TCHECK2(*tptr,8);
- print_unknown_data(ndo, tptr, "\n\t ", 8);
- break;
- }
- tlen -=8;
- tptr +=8;
- }