print-bgp.c

来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 1,792 行 · 第 1/5 页

C
1,792
字号
                            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;#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):                            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;                        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;                        }                    }		}                printf(", nh-length: %u", nhlen);		tptr += tlen;		TCHECK(tptr[0]);		snpa = tptr[0];		tptr++;		if (snpa) {			printf("\n\t    %u SNPA", snpa);			for (/*nothing*/; snpa > 0; snpa--) {				TCHECK(tptr[0]);				printf("\n\t      %d bytes", tptr[0]);				tptr += tptr[0] + 1;			}		} else {			printf(", no SNPA");                }		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): /* fall through */                    case (AFNUM_INET6<<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;                                                       case (AFNUM_INET<<8 | SAFNUM_MULTICAST_VPN): /* fall through */                    case (AFNUM_INET6<<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      

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?