print-ldp.c

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

C
624
字号
/* * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code * distributions retain the above copyright notice and this paragraph * in its entirety, and (2) distributions including binary code include * the above copyright notice and this paragraph in its entirety in * the documentation or other materials provided with the distribution. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * * Original code by Hannes Gredler (hannes@juniper.net) *  and Steinar Haug (sthaug@nethelp.no) */#ifndef lintstatic const char rcsid[] _U_ =    "@(#) $Header: /tcpdump/master/tcpdump/print-ldp.c,v 1.20 2006-06-23 02:03:09 hannes Exp $";#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <tcpdump-stdinc.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "interface.h"#include "decode_prefix.h"#include "extract.h"#include "addrtoname.h"#include "l2vpn.h"#include "af.h"/* * ldp common header * *  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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |  Version                      |         PDU Length            | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                         LDP Identifier                        | * +                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                               | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * */struct ldp_common_header {    u_int8_t version[2];    u_int8_t pdu_length[2];    u_int8_t lsr_id[4];    u_int8_t label_space[2];};#define LDP_VERSION 1/* * ldp message header * *  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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |U|   Message Type              |      Message Length           | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                     Message ID                                | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                                                               | * +                                                               + * |                     Mandatory Parameters                      | * +                                                               + * |                                                               | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                                                               | * +                                                               + * |                     Optional Parameters                       | * +                                                               + * |                                                               | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */struct ldp_msg_header {    u_int8_t type[2];    u_int8_t length[2];    u_int8_t id[4];};#define	LDP_MASK_MSG_TYPE(x)  ((x)&0x7fff) #define	LDP_MASK_U_BIT(x)     ((x)&0x8000) #define	LDP_MSG_NOTIF                0x0001#define	LDP_MSG_HELLO                0x0100#define	LDP_MSG_INIT                 0x0200#define	LDP_MSG_KEEPALIVE            0x0201#define	LDP_MSG_ADDRESS              0x0300#define	LDP_MSG_ADDRESS_WITHDRAW     0x0301#define	LDP_MSG_LABEL_MAPPING        0x0400#define	LDP_MSG_LABEL_REQUEST        0x0401#define	LDP_MSG_LABEL_WITHDRAW       0x0402#define	LDP_MSG_LABEL_RELEASE        0x0403#define	LDP_MSG_LABEL_ABORT_REQUEST  0x0404#define	LDP_VENDOR_PRIVATE_MIN       0x3e00#define	LDP_VENDOR_PRIVATE_MAX       0x3eff#define	LDP_EXPERIMENTAL_MIN         0x3f00#define	LDP_EXPERIMENTAL_MAX         0x3fffstatic const struct tok ldp_msg_values[] = {    { LDP_MSG_NOTIF,	             "Notification" },    { LDP_MSG_HELLO,	             "Hello" },    { LDP_MSG_INIT,	             "Initialization" },    { LDP_MSG_KEEPALIVE,             "Keepalive" },    { LDP_MSG_ADDRESS,	             "Address" },    { LDP_MSG_ADDRESS_WITHDRAW,	     "Address Withdraw" },    { LDP_MSG_LABEL_MAPPING,	     "Label Mapping" },    { LDP_MSG_LABEL_REQUEST,	     "Label Request" },    { LDP_MSG_LABEL_WITHDRAW,	     "Label Withdraw" },    { LDP_MSG_LABEL_RELEASE,	     "Label Release" },    { LDP_MSG_LABEL_ABORT_REQUEST,   "Label Abort Request" },    { 0, NULL}};#define	LDP_MASK_TLV_TYPE(x)  ((x)&0x3fff) #define	LDP_MASK_F_BIT(x) ((x)&0x4000) #define	LDP_TLV_FEC                  0x0100#define	LDP_TLV_ADDRESS_LIST         0x0101#define LDP_TLV_ADDRESS_LIST_AFNUM_LEN 2#define	LDP_TLV_HOP_COUNT            0x0103#define	LDP_TLV_PATH_VECTOR          0x0104#define	LDP_TLV_GENERIC_LABEL        0x0200#define	LDP_TLV_ATM_LABEL            0x0201#define	LDP_TLV_FR_LABEL             0x0202#define	LDP_TLV_STATUS               0x0300#define	LDP_TLV_EXTD_STATUS          0x0301#define	LDP_TLV_RETURNED_PDU         0x0302#define	LDP_TLV_RETURNED_MSG         0x0303#define	LDP_TLV_COMMON_HELLO         0x0400#define	LDP_TLV_IPV4_TRANSPORT_ADDR  0x0401#define	LDP_TLV_CONFIG_SEQ_NUMBER    0x0402#define	LDP_TLV_IPV6_TRANSPORT_ADDR  0x0403#define	LDP_TLV_COMMON_SESSION       0x0500#define	LDP_TLV_ATM_SESSION_PARM     0x0501#define	LDP_TLV_FR_SESSION_PARM      0x0502#define LDP_TLV_FT_SESSION	     0x0503#define	LDP_TLV_LABEL_REQUEST_MSG_ID 0x0600#define LDP_TLV_MTU                  0x0601 /* rfc 3988 */static const struct tok ldp_tlv_values[] = {    { LDP_TLV_FEC,	             "FEC" },    { LDP_TLV_ADDRESS_LIST,          "Address List" },    { LDP_TLV_HOP_COUNT,             "Hop Count" },    { LDP_TLV_PATH_VECTOR,           "Path Vector" },    { LDP_TLV_GENERIC_LABEL,         "Generic Label" },    { LDP_TLV_ATM_LABEL,             "ATM Label" },    { LDP_TLV_FR_LABEL,              "Frame-Relay Label" },    { LDP_TLV_STATUS,                "Status" },    { LDP_TLV_EXTD_STATUS,           "Extended Status" },    { LDP_TLV_RETURNED_PDU,          "Returned PDU" },    { LDP_TLV_RETURNED_MSG,          "Returned Message" },    { LDP_TLV_COMMON_HELLO,          "Common Hello Parameters" },    { LDP_TLV_IPV4_TRANSPORT_ADDR,   "IPv4 Transport Address" },    { LDP_TLV_CONFIG_SEQ_NUMBER,     "Configuration Sequence Number" },    { LDP_TLV_IPV6_TRANSPORT_ADDR,   "IPv6 Transport Address" },    { LDP_TLV_COMMON_SESSION,        "Common Session Parameters" },    { LDP_TLV_ATM_SESSION_PARM,      "ATM Session Parameters" },    { LDP_TLV_FR_SESSION_PARM,       "Frame-Relay Session Parameters" },    { LDP_TLV_FT_SESSION,            "Fault-Tolerant Session Parameters" },    { LDP_TLV_LABEL_REQUEST_MSG_ID,  "Label Request Message ID" },    { LDP_TLV_MTU,                   "MTU" },    { 0, NULL}};#define LDP_FEC_WILDCARD	0x01#define LDP_FEC_PREFIX		0x02#define LDP_FEC_HOSTADDRESS	0x03/* From draft-martini-l2circuit-trans-mpls-13.txt */#define LDP_FEC_MARTINI_VC	0x80static const struct tok ldp_fec_values[] = {    { LDP_FEC_WILDCARD,		"Wildcard" },    { LDP_FEC_PREFIX,		"Prefix" },    { LDP_FEC_HOSTADDRESS,	"Host address" },    { LDP_FEC_MARTINI_VC,	"Martini VC" },    { 0, NULL}};#define LDP_FEC_MARTINI_IFPARM_MTU  0x01#define LDP_FEC_MARTINI_IFPARM_DESC 0x03#define LDP_FEC_MARTINI_IFPARM_VCCV 0x0cstatic const struct tok ldp_fec_martini_ifparm_values[] = {    { LDP_FEC_MARTINI_IFPARM_MTU, "MTU" },    { LDP_FEC_MARTINI_IFPARM_DESC, "Description" },    { LDP_FEC_MARTINI_IFPARM_VCCV, "VCCV" },    { 0, NULL}};/* draft-ietf-pwe3-vccv-04.txt */static const struct tok ldp_fec_martini_ifparm_vccv_cc_values[] = {    { 0x01, "PWE3 control word" },    { 0x02, "MPLS Router Alert Label" },    { 0x04, "MPLS inner label TTL = 1" },    { 0, NULL}};/* draft-ietf-pwe3-vccv-04.txt */static const struct tok ldp_fec_martini_ifparm_vccv_cv_values[] = {    { 0x01, "ICMP Ping" },    { 0x02, "LSP Ping" },    { 0x04, "BFD" },    { 0, NULL}};int ldp_msg_print(register const u_char *);int ldp_tlv_print(register const u_char *);   /*  * ldp tlv header * *  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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |U|F|        Type               |            Length             | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                                                               | * |                             Value                             | * ~                                                               ~ * |                                                               | * |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |                               | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */intldp_tlv_print(register const u_char *tptr) {    struct ldp_tlv_header {        u_int8_t type[2];        u_int8_t length[2];    };    const struct ldp_tlv_header *ldp_tlv_header;    u_short tlv_type,tlv_len,tlv_tlen,af,ft_flags;    u_char fec_type;    u_int ui,vc_info_len, vc_info_tlv_type, vc_info_tlv_len,idx;    char buf[100];    int i;    ldp_tlv_header = (const struct ldp_tlv_header *)tptr;        tlv_len=EXTRACT_16BITS(ldp_tlv_header->length);    tlv_tlen=tlv_len;    tlv_type=LDP_MASK_TLV_TYPE(EXTRACT_16BITS(ldp_tlv_header->type));    /* FIXME vendor private / experimental check */    printf("\n\t    %s TLV (0x%04x), length: %u, Flags: [%s and %s forward if unknown]",           tok2str(ldp_tlv_values,                   "Unknown",                   tlv_type),           tlv_type,           tlv_len,           LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "continue processing" : "ignore",           LDP_MASK_F_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "do" : "don't");    tptr+=sizeof(struct ldp_tlv_header);    switch(tlv_type) {    case LDP_TLV_COMMON_HELLO:        printf("\n\t      Hold Time: %us, Flags: [%s Hello%s]",               EXTRACT_16BITS(tptr),               (EXTRACT_16BITS(tptr+2)&0x8000) ? "Targeted" : "Link",               (EXTRACT_16BITS(tptr+2)&0x4000) ? ", Request for targeted Hellos" : "");        break;    case LDP_TLV_IPV4_TRANSPORT_ADDR:        printf("\n\t      IPv4 Transport Address: %s", ipaddr_string(tptr));        break;#ifdef INET6    case LDP_TLV_IPV6_TRANSPORT_ADDR:        printf("\n\t      IPv6 Transport Address: %s", ip6addr_string(tptr));        break;#endif    case LDP_TLV_CONFIG_SEQ_NUMBER:        printf("\n\t      Sequence Number: %u", EXTRACT_32BITS(tptr));        break;    case LDP_TLV_ADDRESS_LIST:	af = EXTRACT_16BITS(tptr);	tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;        tlv_tlen -= LDP_TLV_ADDRESS_LIST_AFNUM_LEN;	printf("\n\t      Address Family: %s, addresses",               tok2str(af_values, "Unknown (%u)", af));        switch (af) {        case AFNUM_INET:	    while(tlv_tlen >= sizeof(struct in_addr)) {		printf(" %s",ipaddr_string(tptr));		tlv_tlen-=sizeof(struct in_addr);		tptr+=sizeof(struct in_addr);                	    }            break;#ifdef INET6        case AFNUM_INET6:	    while(tlv_tlen >= sizeof(struct in6_addr)) {		printf(" %s",ip6addr_string(tptr));		tlv_tlen-=sizeof(struct in6_addr);

⌨️ 快捷键说明

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