print-lspping.c

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

C
875
字号
        printf("\n\t  %s TLV (%u), length: %u",               tok2str(lspping_tlv_values,                       "Unknown",                       lspping_tlv_type),               lspping_tlv_type,               lspping_tlv_len);        tlv_tptr=tptr+sizeof(struct lspping_tlv_header);        tlv_tlen=lspping_tlv_len; /* header not included -> no adjustment */        /* did we capture enough for fully decoding the tlv ? */        if (!TTEST2(*tptr, lspping_tlv_len))            goto trunc;        tlv_hexdump=FALSE;        switch(lspping_tlv_type) {        case LSPPING_TLV_TARGET_FEC_STACK:            while(tlv_tlen>(int)sizeof(struct lspping_tlv_header)) {                /* did we capture enough for fully decoding the subtlv header ? */                if (!TTEST2(*tptr, sizeof(struct lspping_tlv_header)))                    goto trunc;                subtlv_hexdump=FALSE;                lspping_subtlv_header = (const struct lspping_tlv_header *)tlv_tptr;                lspping_subtlv_type=EXTRACT_16BITS(lspping_subtlv_header->type);                lspping_subtlv_len=EXTRACT_16BITS(lspping_subtlv_header->length);                subtlv_tptr=tlv_tptr+sizeof(struct lspping_tlv_header);                                if (lspping_subtlv_len == 0)                    break;                printf("\n\t    %s subTLV (%u), length: %u",                       tok2str(lspping_tlvtargetfec_subtlv_values,                               "Unknown",                               lspping_subtlv_type),                       lspping_subtlv_type,                       lspping_subtlv_len);                switch(lspping_subtlv_type) {                case LSPPING_TLV_TARGETFEC_SUBTLV_LDP_IPV4:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4 = \                        (const struct lspping_tlv_targetfec_subtlv_ldp_ipv4_t *)subtlv_tptr;                    printf("\n\t      %s/%u",                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix),                           subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix_len);                    break;#ifdef INET6                case LSPPING_TLV_TARGETFEC_SUBTLV_LDP_IPV6:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6 = \                        (const struct lspping_tlv_targetfec_subtlv_ldp_ipv6_t *)subtlv_tptr;                    printf("\n\t      %s/%u",                           ip6addr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix),                           subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix_len);                    break;#endif                case LSPPING_TLV_TARGETFEC_SUBTLV_BGP_IPV4:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4 = \                        (const struct lspping_tlv_targetfec_subtlv_bgp_ipv4_t *)subtlv_tptr;                    printf("\n\t      %s/%u, sender-id %s",                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix),                           subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix_len,                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->sender_id));                    break;#ifdef INET6                case LSPPING_TLV_TARGETFEC_SUBTLV_BGP_IPV6:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6 = \                        (const struct lspping_tlv_targetfec_subtlv_bgp_ipv6_t *)subtlv_tptr;                    printf("\n\t      %s/%u, sender-id %s",                           ip6addr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix),                           subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix_len,                           ip6addr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->sender_id));                    break;#endif                case LSPPING_TLV_TARGETFEC_SUBTLV_RSVP_IPV4:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4 = \                        (const struct lspping_tlv_targetfec_subtlv_rsvp_ipv4_t *)subtlv_tptr;                    printf("\n\t      tunnel end-point %s, tunnel sender %s, lsp-id 0x%04x" \                           "\n\t      tunnel-id 0x%04x, extended tunnel-id %s",                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_endpoint),                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_sender),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->lsp_id),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_id),                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->extended_tunnel_id));                    break;#ifdef INET6                case LSPPING_TLV_TARGETFEC_SUBTLV_RSVP_IPV6:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6 = \                        (const struct lspping_tlv_targetfec_subtlv_rsvp_ipv6_t *)subtlv_tptr;                    printf("\n\t      tunnel end-point %s, tunnel sender %s, lsp-id 0x%04x" \                           "\n\t      tunnel-id 0x%04x, extended tunnel-id %s",                           ip6addr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_endpoint),                           ip6addr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_sender),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->lsp_id),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_id),                           ip6addr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->extended_tunnel_id));                    break;#endif                case LSPPING_TLV_TARGETFEC_SUBTLV_L3VPN_IPV4:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4 = \                        (const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv4_t *)subtlv_tptr;                    printf("\n\t      RD: %s, %s/%u",                           bgp_vpn_rd_print(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->rd),                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix),                           subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix_len);                    break;#ifdef INET6                case LSPPING_TLV_TARGETFEC_SUBTLV_L3VPN_IPV6:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6 = \                        (const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv6_t *)subtlv_tptr;                    printf("\n\t      RD: %s, %s/%u",                           bgp_vpn_rd_print(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->rd),                           ip6addr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix),                           subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix_len);                    break;#endif                case LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_ENDPT:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt = \                        (const struct lspping_tlv_targetfec_subtlv_l2vpn_endpt_t *)subtlv_tptr;                    printf("\n\t      RD: %s, Sender CE-ID: %u, Receiver CE-ID: %u" \                           "\n\t      Encapsulation Type: %s (%u)",                           bgp_vpn_rd_print(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->rd),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->sender_ce_id),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->receiver_ce_id),                           tok2str(l2vpn_encaps_values,                                   "unknown",                                   EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->encapsulation)),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_endpt->encapsulation));                                        break;                    /* the old L2VPN VCID subTLV does not have support for the sender field */                case LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_VCID_OLD:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old = \                        (const struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_old_t *)subtlv_tptr;                    printf("\n\t      Remote PE: %s" \                           "\n\t      VC-ID: 0x%08x, Encapsulation Type: %s (%u)",                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->remote_pe_address),                           EXTRACT_32BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->vc_id),                           tok2str(l2vpn_encaps_values,                                   "unknown",                                   EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->encapsulation)),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->encapsulation));                                        break;                case LSPPING_TLV_TARGETFEC_SUBTLV_L2VPN_VCID:                    subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid = \                        (const struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_t *)subtlv_tptr;                    printf("\n\t      Sender PE: %s, Remote PE: %s" \                           "\n\t      VC-ID: 0x%08x, Encapsulation Type: %s (%u)",                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->sender_pe_address),                           ipaddr_string(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->remote_pe_address),                           EXTRACT_32BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->vc_id),                           tok2str(l2vpn_encaps_values,                                   "unknown",                                   EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->encapsulation)),                           EXTRACT_16BITS(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->encapsulation));                                        break;                default:                    subtlv_hexdump=TRUE; /* unknown subTLV just hexdump it */                    break;                }                /* do we want to see an additionally subtlv hexdump ? */                if (vflag > 1 || subtlv_hexdump==TRUE)                    print_unknown_data(tlv_tptr+sizeof(struct lspping_tlv_header), \                                       "\n\t      ",                                       lspping_subtlv_len);                tlv_tptr+=lspping_subtlv_len;                tlv_tlen-=lspping_subtlv_len+sizeof(struct lspping_tlv_header);            }            break;        case LSPPING_TLV_DOWNSTREAM_MAPPING:            /* that strange thing with the downstream map TLV is that until now             * we do not know if its IPv4 or IPv6 , after we found the adress-type             * lets recast the tlv_tptr and move on */            tlv_ptr.lspping_tlv_downstream_map_ipv4= \                (const struct lspping_tlv_downstream_map_ipv4_t *)tlv_tptr;            tlv_ptr.lspping_tlv_downstream_map_ipv6= \                (const struct lspping_tlv_downstream_map_ipv6_t *)tlv_tptr;            printf("\n\t    MTU: %u, Address-Type: %s (%u)",                   EXTRACT_16BITS(tlv_ptr.lspping_tlv_downstream_map_ipv4->mtu),                   tok2str(lspping_tlv_downstream_addr_values,                           "unknown",                           tlv_ptr.lspping_tlv_downstream_map_ipv4->address_type),                   tlv_ptr.lspping_tlv_downstream_map_ipv4->address_type);            switch(tlv_ptr.lspping_tlv_downstream_map_ipv4->address_type) {            case LSPPING_AFI_IPV4:                printf("\n\t    Downstream IP: %s" \                       "\n\t    Downstream Interface IP: %s",                       ipaddr_string(tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_ip),                       ipaddr_string(tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_interface));                tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv4_t);                tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv4_t);                break;#ifdef INET6             case LSPPING_AFI_IPV6:                printf("\n\t    Downstream IP: %s" \                       "\n\t    Downstream Interface IP: %s",                       ip6addr_string(tlv_ptr.lspping_tlv_downstream_map_ipv6->downstream_ip),                       ip6addr_string(tlv_ptr.lspping_tlv_downstream_map_ipv6->downstream_interface));                tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv6_t);                tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv6_t);                break;#endif            case LSPPING_AFI_UNMB:                printf("\n\t    Downstream IP: %s" \                       "\n\t    Downstream Interface Index: 0x%08x",                       ipaddr_string(tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_ip),                       EXTRACT_32BITS(tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_interface));                tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv4_t);                tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv4_t);                break;            default:                /* should not happen ! - no error message - tok2str() has barked already */                break;            }            tlv_ptr.lspping_tlv_downstream_map_info= \                (const struct lspping_tlv_downstream_map_info_t *)tlv_tptr;                        /* FIXME add hash-key type, depth limit, multipath processing */            tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_info_t);            tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_info_t);            /* FIXME print downstream labels */            tlv_hexdump=TRUE; /* dump the TLV until code complete */            break;        case LSPPING_TLV_BFD_DISCRIMINATOR:            tptr += sizeof(struct lspping_tlv_header);            if (!TTEST2(*tptr, LSPPING_TLV_BFD_DISCRIMINATOR_LEN))                goto trunc;            printf("\n\t    BFD Discriminator 0x%08x", EXTRACT_32BITS(tptr));            break;            /*             *  FIXME those are the defined TLVs that lack a decoder             *  you are welcome to contribute code ;-)             */        case LSPPING_TLV_PAD:        case LSPPING_TLV_ERROR_CODE:        case LSPPING_TLV_VENDOR_PRIVATE:            default:            if (vflag <= 1)                print_unknown_data(tlv_tptr,"\n\t    ",tlv_tlen);            break;        }        /* do we want to see an additionally tlv hexdump ? */        if (vflag > 1 || tlv_hexdump==TRUE)            print_unknown_data(tptr+sizeof(sizeof(struct lspping_tlv_header)),"\n\t    ",                               lspping_tlv_len);        /* All TLVs are aligned to four octet boundary */        if (lspping_tlv_len % 4) {            lspping_tlv_len += (4 - lspping_tlv_len % 4);        }        tptr+=lspping_tlv_len+sizeof(struct lspping_tlv_header);        tlen-=lspping_tlv_len+sizeof(struct lspping_tlv_header);    }    return;trunc:    printf("\n\t\t packet exceeded snapshot");}

⌨️ 快捷键说明

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