print-lspping.c

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

C
875
字号
 * |                                                               | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |          Must Be Zero         |            LSP ID             | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */struct lspping_tlv_targetfec_subtlv_rsvp_ipv6_t {    u_int8_t tunnel_endpoint [16];    u_int8_t res[2];    u_int8_t tunnel_id[2];    u_int8_t extended_tunnel_id[16];    u_int8_t tunnel_sender [16];    u_int8_t res2[2];    u_int8_t lsp_id [2];};/* *  0                   1                   2                   3 *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                      Route Distinguisher                      | * |                          (8 octets)                           | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                         IPv4 prefix                           | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Prefix Length |                 Must Be Zero                  | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */struct lspping_tlv_targetfec_subtlv_l3vpn_ipv4_t {    u_int8_t rd [8];    u_int8_t prefix [4];    u_int8_t prefix_len;};/* *  0                   1                   2                   3 *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                      Route Distinguisher                      | * |                          (8 octets)                           | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                          IPv6 prefix                          | * |                          (16 octets)                          | * |                                                               | * |                                                               | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Prefix Length |                 Must Be Zero                  | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */struct lspping_tlv_targetfec_subtlv_l3vpn_ipv6_t {    u_int8_t rd [8];    u_int8_t prefix [16];    u_int8_t prefix_len;};/* *  0                   1                   2                   3 *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                      Route Distinguisher                      | * |                          (8 octets)                           | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |         Sender's CE ID        |       Receiver's CE ID        | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |      Encapsulation Type       |         Must Be Zero          | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *  0                   1                   2                   3 */struct lspping_tlv_targetfec_subtlv_l2vpn_endpt_t {    u_int8_t rd [8];    u_int8_t sender_ce_id [2];    u_int8_t receiver_ce_id [2];    u_int8_t encapsulation[2];};/* *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                      Remote PE Address                        | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                             VC ID                             | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |      Encapsulation Type       |         Must Be Zero          | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_old_t {    u_int8_t remote_pe_address [4];    u_int8_t vc_id [4];    u_int8_t encapsulation[2];};/* *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                     Sender's PE Address                       | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                      Remote PE Address                        | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                             VC ID                             | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |      Encapsulation Type       |         Must Be Zero          | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_t {    u_int8_t sender_pe_address [4];    u_int8_t remote_pe_address [4];    u_int8_t vc_id [4];    u_int8_t encapsulation[2];};/* *  0                   1                   2                   3 *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |               MTU             | Address Type  |  Resvd (SBZ)  | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |             Downstream IP Address (4 or 16 octets)            | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |         Downstream Interface Address (4 or 16 octets)         | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Hash Key Type | Depth Limit   |        Multipath Length       | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .                                                               . * .                     (Multipath Information)                   . * .                                                               . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |               Downstream Label                |    Protocol   | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .                                                               . * .                                                               . * .                                                               . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |               Downstream Label                |    Protocol   | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */struct lspping_tlv_downstream_map_ipv4_t {    u_int8_t mtu [2];    u_int8_t address_type;    u_int8_t res;    u_int8_t downstream_ip[4];    u_int8_t downstream_interface[4];};struct lspping_tlv_downstream_map_ipv6_t {    u_int8_t mtu [2];    u_int8_t address_type;    u_int8_t res;    u_int8_t downstream_ip[16];    u_int8_t downstream_interface[16];};struct lspping_tlv_downstream_map_info_t {    u_int8_t hash_key_type;    u_int8_t depth_limit;    u_int8_t multipath_length [2];};#define LSPPING_AFI_IPV4 1#define LSPPING_AFI_UNMB 2#define LSPPING_AFI_IPV6 3static const struct tok lspping_tlv_downstream_addr_values[] = {    { LSPPING_AFI_IPV4, "IPv4"},    { LSPPING_AFI_IPV6, "IPv6"},    { LSPPING_AFI_UNMB, "Unnumbered"},    { 0, NULL}};voidlspping_print(register const u_char *pptr, register u_int len) {    const struct lspping_common_header *lspping_com_header;    const struct lspping_tlv_header *lspping_tlv_header;    const struct lspping_tlv_header *lspping_subtlv_header;    const u_char *tptr,*tlv_tptr,*subtlv_tptr;    int tlen,lspping_tlv_len,lspping_tlv_type,tlv_tlen;    int tlv_hexdump,subtlv_hexdump;    int lspping_subtlv_len,lspping_subtlv_type;    struct timeval timestamp;     union {        const struct lspping_tlv_downstream_map_ipv4_t *lspping_tlv_downstream_map_ipv4;        const struct lspping_tlv_downstream_map_ipv6_t *lspping_tlv_downstream_map_ipv6;        const struct lspping_tlv_downstream_map_info_t  *lspping_tlv_downstream_map_info;    } tlv_ptr;    union {        const struct lspping_tlv_targetfec_subtlv_ldp_ipv4_t *lspping_tlv_targetfec_subtlv_ldp_ipv4;        const struct lspping_tlv_targetfec_subtlv_ldp_ipv6_t *lspping_tlv_targetfec_subtlv_ldp_ipv6;        const struct lspping_tlv_targetfec_subtlv_rsvp_ipv4_t *lspping_tlv_targetfec_subtlv_rsvp_ipv4;        const struct lspping_tlv_targetfec_subtlv_rsvp_ipv6_t *lspping_tlv_targetfec_subtlv_rsvp_ipv6;        const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv4_t *lspping_tlv_targetfec_subtlv_l3vpn_ipv4;        const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv6_t *lspping_tlv_targetfec_subtlv_l3vpn_ipv6;        const struct lspping_tlv_targetfec_subtlv_l2vpn_endpt_t *lspping_tlv_targetfec_subtlv_l2vpn_endpt;        const struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_old_t *lspping_tlv_targetfec_subtlv_l2vpn_vcid_old;        const struct lspping_tlv_targetfec_subtlv_l2vpn_vcid_t *lspping_tlv_targetfec_subtlv_l2vpn_vcid;        const struct lspping_tlv_targetfec_subtlv_bgp_ipv4_t *lspping_tlv_targetfec_subtlv_bgp_ipv4;        const struct lspping_tlv_targetfec_subtlv_bgp_ipv6_t *lspping_tlv_targetfec_subtlv_bgp_ipv6;    } subtlv_ptr;    tptr=pptr;    lspping_com_header = (const struct lspping_common_header *)pptr;    TCHECK(*lspping_com_header);    /*     * Sanity checking of the header.     */    if (EXTRACT_16BITS(&lspping_com_header->version[0]) != LSPPING_VERSION) {	printf("LSP-PING version %u packet not supported",               EXTRACT_16BITS(&lspping_com_header->version[0]));	return;    }    /* in non-verbose mode just lets print the basic Message Type*/    if (vflag < 1) {        printf("LSP-PINGv%u, %s, seq %u, length: %u",               EXTRACT_16BITS(&lspping_com_header->version[0]),               tok2str(lspping_msg_type_values, "unknown (%u)",lspping_com_header->msg_type),               EXTRACT_32BITS(lspping_com_header->seq_number),               len);        return;    }    /* ok they seem to want to know everything - lets fully decode it */    tlen=len;    printf("\n\tLSP-PINGv%u, msg-type: %s (%u), length: %u\n\t  reply-mode: %s (%u)",           EXTRACT_16BITS(&lspping_com_header->version[0]),           tok2str(lspping_msg_type_values, "unknown",lspping_com_header->msg_type),           lspping_com_header->msg_type,           len,           tok2str(lspping_reply_mode_values, "unknown",lspping_com_header->reply_mode),           lspping_com_header->reply_mode);    /*     *  the following return codes require that the subcode is attached     *  at the end of the translated token output     */    if (lspping_com_header->return_code == 3 ||        lspping_com_header->return_code == 4 ||        lspping_com_header->return_code == 8 ||        lspping_com_header->return_code == 10 ||        lspping_com_header->return_code == 11 ||        lspping_com_header->return_code == 12 )        printf("\n\t  Return Code: %s %u (%u)\n\t  Return Subcode: (%u)",               tok2str(lspping_return_code_values, "unknown",lspping_com_header->return_code),               lspping_com_header->return_subcode,                   lspping_com_header->return_code,               lspping_com_header->return_subcode);    else        printf("\n\t  Return Code: %s (%u)\n\t  Return Subcode: (%u)",               tok2str(lspping_return_code_values, "unknown",lspping_com_header->return_code),                  lspping_com_header->return_code,               lspping_com_header->return_subcode);     printf("\n\t  Sender Handle: 0x%08x, Sequence: %u",           EXTRACT_32BITS(lspping_com_header->sender_handle),           EXTRACT_32BITS(lspping_com_header->seq_number));    timestamp.tv_sec=EXTRACT_32BITS(lspping_com_header->ts_sent_sec);    timestamp.tv_usec=EXTRACT_32BITS(lspping_com_header->ts_sent_usec);         printf("\n\t  Sender Timestamp: ");    ts_print(&timestamp);    timestamp.tv_sec=EXTRACT_32BITS(lspping_com_header->ts_rcvd_sec);    timestamp.tv_usec=EXTRACT_32BITS(lspping_com_header->ts_rcvd_usec);     printf("Receiver Timestamp: ");    if ((timestamp.tv_sec != 0) && (timestamp.tv_usec != 0))        ts_print(&timestamp);    else        printf("no timestamp");    tptr+=sizeof(const struct lspping_common_header);    tlen-=sizeof(const struct lspping_common_header);    while(tlen>(int)sizeof(struct lspping_tlv_header)) {        /* did we capture enough for fully decoding the tlv header ? */        if (!TTEST2(*tptr, sizeof(struct lspping_tlv_header)))            goto trunc;        lspping_tlv_header = (const struct lspping_tlv_header *)tptr;        lspping_tlv_type=EXTRACT_16BITS(lspping_tlv_header->type);        lspping_tlv_len=EXTRACT_16BITS(lspping_tlv_header->length);        /* some little sanity checking */        if (lspping_tlv_type == 0 || lspping_tlv_len == 0)            return;        if(lspping_tlv_len < 4) {            printf("\n\t  ERROR: TLV %u bogus size %u",lspping_tlv_type,lspping_tlv_len);            return;        }

⌨️ 快捷键说明

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