?? print-isoclns.c
字號(hào):
{ 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"}, { 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 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 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,
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -