⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 print-isoclns.c

📁 TCPDUMP的C语言源代码,是在数据链路层的应用
💻 C
📖 第 1 页 / 共 5 页
字号:
    { 0x04, "Local maintenance required"},    { 0, NULL }};#define ISIS_SUBTLV_AUTH_SIMPLE        1#define ISIS_SUBTLV_AUTH_MD5          54#define ISIS_SUBTLV_AUTH_MD5_LEN      16#define ISIS_SUBTLV_AUTH_PRIVATE     255static struct tok isis_subtlv_auth_values[] = {    { ISIS_SUBTLV_AUTH_SIMPLE,	"simple text password"},    { ISIS_SUBTLV_AUTH_MD5,	"HMAC-MD5 password"},    { ISIS_SUBTLV_AUTH_PRIVATE,	"Routing Domain private password"},    { 0, NULL }};#define ISIS_SUBTLV_IDRP_RES           0#define ISIS_SUBTLV_IDRP_LOCAL         1#define ISIS_SUBTLV_IDRP_ASN           2static struct tok isis_subtlv_idrp_values[] = {    { ISIS_SUBTLV_IDRP_RES,         "Reserved"},    { ISIS_SUBTLV_IDRP_LOCAL,       "Routing-Domain Specific"},    { ISIS_SUBTLV_IDRP_ASN,         "AS Number Tag"},    { 0, NULL}};#define CLNP_SEGMENT_PART  0x80#define CLNP_MORE_SEGMENTS 0x40#define CLNP_REQUEST_ER    0x20static struct tok clnp_flag_values[] = {    { CLNP_SEGMENT_PART, "Segmentation permitted"},    { CLNP_MORE_SEGMENTS, "more Segments"},    { CLNP_REQUEST_ER, "request Error Report"},    { 0, NULL}};#define ISIS_MASK_LSP_OL_BIT(x)            ((x)&0x4)#define ISIS_MASK_LSP_ISTYPE_BITS(x)       ((x)&0x3)#define ISIS_MASK_LSP_PARTITION_BIT(x)     ((x)&0x80)#define ISIS_MASK_LSP_ATT_BITS(x)          ((x)&0x78)#define ISIS_MASK_LSP_ATT_ERROR_BIT(x)     ((x)&0x40)#define ISIS_MASK_LSP_ATT_EXPENSE_BIT(x)   ((x)&0x20)#define ISIS_MASK_LSP_ATT_DELAY_BIT(x)     ((x)&0x10)#define ISIS_MASK_LSP_ATT_DEFAULT_BIT(x)   ((x)&0x8)#define ISIS_MASK_MTID(x)                  ((x)&0x0fff)#define ISIS_MASK_MTFLAGS(x)               ((x)&0xf000)static struct tok isis_mt_flag_values[] = {    { 0x4000,                  "sub-TLVs present"},    { 0x8000,                  "ATT bit set"},    { 0, NULL}};#define ISIS_MASK_TLV_EXTD_IP_UPDOWN(x)     ((x)&0x80)#define ISIS_MASK_TLV_EXTD_IP_SUBTLV(x)     ((x)&0x40)#define ISIS_MASK_TLV_EXTD_IP6_IE(x)        ((x)&0x40)#define ISIS_MASK_TLV_EXTD_IP6_SUBTLV(x)    ((x)&0x20)#define ISIS_LSP_TLV_METRIC_SUPPORTED(x)   ((x)&0x80)#define ISIS_LSP_TLV_METRIC_IE(x)          ((x)&0x40)#define ISIS_LSP_TLV_METRIC_UPDOWN(x)      ((x)&0x80)#define ISIS_LSP_TLV_METRIC_VALUE(x)	   ((x)&0x3f)#define ISIS_MASK_TLV_SHARED_RISK_GROUP(x) ((x)&0x1)static struct tok isis_mt_values[] = {    { 0,    "IPv4 unicast"},    { 1,    "In-Band Management"},    { 2,    "IPv6 unicast"},    { 3,    "Multicast"},    { 4095, "Development, Experimental or Proprietary"},    { 0, NULL }};static struct tok isis_iih_circuit_type_values[] = {    { 1,    "Level 1 only"},    { 2,    "Level 2 only"},    { 3,    "Level 1, Level 2"},    { 0, NULL}};#define ISIS_LSP_TYPE_UNUSED0   0#define ISIS_LSP_TYPE_LEVEL_1   1#define ISIS_LSP_TYPE_UNUSED2   2#define ISIS_LSP_TYPE_LEVEL_2   3static struct tok isis_lsp_istype_values[] = {    { ISIS_LSP_TYPE_UNUSED0,	"Unused 0x0 (invalid)"},    { ISIS_LSP_TYPE_LEVEL_1,	"L1 IS"},    { ISIS_LSP_TYPE_UNUSED2,	"Unused 0x2 (invalid)"},    { ISIS_LSP_TYPE_LEVEL_2,	"L2 IS"},    { 0, NULL }};/* * Katz's point to point adjacency TLV uses codes to tell us the state of * the remote adjacency.  Enumerate them. */#define ISIS_PTP_ADJ_UP   0#define ISIS_PTP_ADJ_INIT 1#define ISIS_PTP_ADJ_DOWN 2static struct tok isis_ptp_adjancey_values[] = {    { ISIS_PTP_ADJ_UP,    "Up" },    { ISIS_PTP_ADJ_INIT,  "Initializing" },    { ISIS_PTP_ADJ_DOWN,  "Down" },    { 0, NULL}};struct isis_tlv_ptp_adj {    u_int8_t adjacency_state;    u_int8_t extd_local_circuit_id[4];    u_int8_t neighbor_sysid[SYSTEM_ID_LEN];    u_int8_t neighbor_extd_local_circuit_id[4];};static void osi_print_cksum(const u_int8_t *pptr, u_int16_t checksum,                            u_int checksum_offset, u_int length);static int clnp_print(const u_int8_t *, u_int);static void esis_print(const u_int8_t *, u_int);static int isis_print(const u_int8_t *, u_int);struct isis_metric_block {    u_int8_t metric_default;    u_int8_t metric_delay;    u_int8_t metric_expense;    u_int8_t metric_error;};struct isis_tlv_is_reach {    struct isis_metric_block isis_metric_block;    u_int8_t neighbor_nodeid[NODE_ID_LEN];};struct isis_tlv_es_reach {    struct isis_metric_block isis_metric_block;    u_int8_t neighbor_sysid[SYSTEM_ID_LEN];};struct isis_tlv_ip_reach {    struct isis_metric_block isis_metric_block;    u_int8_t prefix[4];    u_int8_t mask[4];};static struct tok isis_is_reach_virtual_values[] = {    { 0,    "IsNotVirtual"},    { 1,    "IsVirtual"},    { 0, NULL }};static struct tok isis_restart_flag_values[] = {    { 0x1,  "Restart Request"},    { 0x2,  "Restart Acknowledgement"},    { 0x4,  "Suppress adjacency advertisement"},    { 0, NULL }};struct isis_common_header {    u_int8_t nlpid;    u_int8_t fixed_len;    u_int8_t version;			/* Protocol version */    u_int8_t id_length;    u_int8_t pdu_type;		        /* 3 MSbits are reserved */    u_int8_t pdu_version;		/* Packet format version */    u_int8_t reserved;    u_int8_t max_area;};struct isis_iih_lan_header {    u_int8_t circuit_type;    u_int8_t source_id[SYSTEM_ID_LEN];    u_int8_t holding_time[2];    u_int8_t pdu_len[2];    u_int8_t priority;    u_int8_t lan_id[NODE_ID_LEN];};struct isis_iih_ptp_header {    u_int8_t circuit_type;    u_int8_t source_id[SYSTEM_ID_LEN];    u_int8_t holding_time[2];    u_int8_t pdu_len[2];    u_int8_t circuit_id;};struct isis_lsp_header {    u_int8_t pdu_len[2];    u_int8_t remaining_lifetime[2];    u_int8_t lsp_id[LSP_ID_LEN];    u_int8_t sequence_number[4];    u_int8_t checksum[2];    u_int8_t typeblock;};struct isis_csnp_header {    u_int8_t pdu_len[2];    u_int8_t source_id[NODE_ID_LEN];    u_int8_t start_lsp_id[LSP_ID_LEN];    u_int8_t end_lsp_id[LSP_ID_LEN];};struct isis_psnp_header {    u_int8_t pdu_len[2];    u_int8_t source_id[NODE_ID_LEN];};struct isis_tlv_lsp {    u_int8_t remaining_lifetime[2];    u_int8_t lsp_id[LSP_ID_LEN];    u_int8_t sequence_number[4];    u_int8_t checksum[2];};#define ISIS_COMMON_HEADER_SIZE (sizeof(struct isis_common_header))#define ISIS_IIH_LAN_HEADER_SIZE (sizeof(struct isis_iih_lan_header))#define ISIS_IIH_PTP_HEADER_SIZE (sizeof(struct isis_iih_ptp_header))#define ISIS_LSP_HEADER_SIZE (sizeof(struct isis_lsp_header))#define ISIS_CSNP_HEADER_SIZE (sizeof(struct isis_csnp_header))#define ISIS_PSNP_HEADER_SIZE (sizeof(struct isis_psnp_header))void isoclns_print(const u_int8_t *p, u_int length, u_int caplen){	const struct isis_common_header *header;	header = (const struct isis_common_header *)p;        if (caplen <= 1) { /* enough bytes on the wire ? */            printf("|OSI");            return;        }        if (eflag)            printf("OSI NLPID %s (0x%02x): ",                   tok2str(nlpid_values,"Unknown",*p),                   *p);        	switch (*p) {	case NLPID_CLNP:		if (!clnp_print(p, length))                        print_unknown_data(p,"\n\t",caplen);		break;	case NLPID_ESIS:		esis_print(p, length);		return;	case NLPID_ISIS:		if (!isis_print(p, length))                        print_unknown_data(p,"\n\t",caplen);		break;	case NLPID_NULLNS:		(void)printf("%slength: %u",		             eflag ? "" : ", ",                             length);		break;        case NLPID_Q933:                q933_print(p+1, length-1);                break;        case NLPID_IP:		ip_print(gndo, p+1, length-1);                break;#ifdef INET6        case NLPID_IP6:                ip6_print(p+1, length-1);                break;#endif        case NLPID_PPP:                ppp_print(p+1, length-1);                break;	default:                if (!eflag)                    printf("OSI NLPID 0x%02x unknown",*p);		(void)printf("%slength: %u",		             eflag ? "" : ", ",                             length);		if (caplen > 1)                        print_unknown_data(p,"\n\t",caplen);		break;	}}#define	CLNP_PDU_ER	 1#define	CLNP_PDU_DT	28#define	CLNP_PDU_MD	29#define	CLNP_PDU_ERQ	30#define	CLNP_PDU_ERP	31static struct tok clnp_pdu_values[] = {    { CLNP_PDU_ER,  "Error Report"},    { CLNP_PDU_MD,  "MD"},    { CLNP_PDU_DT,  "Data"},    { CLNP_PDU_ERQ, "Echo Request"},    { CLNP_PDU_ERP, "Echo Response"},    { 0, NULL }};struct clnp_header_t {    u_int8_t nlpid;    u_int8_t length_indicator;    u_int8_t version;    u_int8_t lifetime; /* units of 500ms */    u_int8_t type;    u_int8_t segment_length[2];    u_int8_t cksum[2];};struct clnp_segment_header_t {    u_int8_t data_unit_id[2];    u_int8_t segment_offset[2];    u_int8_t total_length[2];};/* * clnp_print * Decode CLNP packets.  Return 0 on error. */static int clnp_print (const u_int8_t *pptr, u_int length){	const u_int8_t *optr,*source_address,*dest_address;        u_int li,tlen,nsap_offset,source_address_length,dest_address_length, clnp_pdu_type, clnp_flags;	const struct clnp_header_t *clnp_header;	const struct clnp_segment_header_t *clnp_segment_header;        u_int8_t rfd_error_major,rfd_error_minor;	clnp_header = (const struct clnp_header_t *) pptr;        TCHECK(*clnp_header);        li = clnp_header->length_indicator;        optr = pptr;        if (!eflag)            printf("CLNP");        /*         * Sanity checking of the header.         */        if (clnp_header->version != CLNP_VERSION) {            printf("version %d packet not supported", clnp_header->version);            return (0);        }        /* FIXME further header sanity checking */        clnp_pdu_type = clnp_header->type & CLNP_PDU_TYPE_MASK;        clnp_flags = clnp_header->type & CLNP_FLAG_MASK;        pptr += sizeof(struct clnp_header_t);        li -= sizeof(struct clnp_header_t);        dest_address_length = *pptr;        dest_address = pptr + 1;        pptr += (1 + dest_address_length);        li -= (1 + dest_address_length);        source_address_length = *pptr;        source_address = pptr +1;        pptr += (1 + source_address_length);        li -= (1 + source_address_length);        if (vflag < 1) {            printf("%s%s > %s, %s, length %u",                   eflag ? "" : ", ",                   isonsap_string(source_address, source_address_length),                   isonsap_string(dest_address, dest_address_length),                   tok2str(clnp_pdu_values,"unknown (%u)",clnp_pdu_type),                   length);            return (1);        }        printf("%slength %u",eflag ? "" : ", ",length);        printf("\n\t%s PDU, hlen: %u, v: %u, lifetime: %u.%us, Segment PDU length: %u, checksum: 0x%04x",               tok2str(clnp_pdu_values, "unknown (%u)",clnp_pdu_type),               clnp_header->length_indicator,               clnp_header->version,

⌨️ 快捷键说明

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