print-pim.c
来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 1,094 行 · 第 1/2 页
C
1,094 行
case sizeof(struct in_addr): af = AF_INET; break;#ifdef INET6 case sizeof(struct in6_addr): af = AF_INET6; break;#endif default: return -1; break; } len = pimv2_addr_len; hdrlen = 0; } bp += hdrlen; switch (at) { case pimv2_unicast: TCHECK2(bp[0], len); if (af == AF_INET) { if (!silent) (void)printf("%s", ipaddr_string(bp)); }#ifdef INET6 else if (af == AF_INET6) { if (!silent) (void)printf("%s", ip6addr_string(bp)); }#endif return hdrlen + len; case pimv2_group: case pimv2_source: TCHECK2(bp[0], len + 2); if (af == AF_INET) { if (!silent) { (void)printf("%s", ipaddr_string(bp + 2)); if (bp[1] != 32) (void)printf("/%u", bp[1]); } }#ifdef INET6 else if (af == AF_INET6) { if (!silent) { (void)printf("%s", ip6addr_string(bp + 2)); if (bp[1] != 128) (void)printf("/%u", bp[1]); } }#endif if (bp[0] && !silent) { if (at == pimv2_group) { (void)printf("(0x%02x)", bp[0]); } else { (void)printf("(%s%s%s", bp[0] & 0x04 ? "S" : "", bp[0] & 0x02 ? "W" : "", bp[0] & 0x01 ? "R" : ""); if (bp[0] & 0xf8) { (void) printf("+0x%02x", bp[0] & 0xf8); } (void)printf(")"); } } return hdrlen + 2 + len; default: return -1; }trunc: return -1;}static voidpimv2_print(register const u_char *bp, register u_int len){ register const u_char *ep; register struct pim *pim = (struct pim *)bp; int advance; ep = (const u_char *)snapend; if (bp >= ep) return; if (ep > bp + len) ep = bp + len; TCHECK(pim->pim_rsv); pimv2_addr_len = pim->pim_rsv; if (pimv2_addr_len != 0) (void)printf(", RFC2117-encoding"); printf(", cksum 0x%04x ", EXTRACT_16BITS(&pim->pim_cksum)); if (EXTRACT_16BITS(&pim->pim_cksum) == 0) { printf("(unverified)"); } else { printf("(%scorrect)", TTEST2(bp[0], len) && in_cksum((const u_short*)bp, len, 0) ? "in" : "" ); } switch (PIM_TYPE(pim->pim_typever)) { case PIMV2_TYPE_HELLO: { u_int16_t otype, olen; bp += 4; while (bp < ep) { TCHECK2(bp[0], 4); otype = EXTRACT_16BITS(&bp[0]); olen = EXTRACT_16BITS(&bp[2]); TCHECK2(bp[0], 4 + olen); printf("\n\t %s Option (%u), length %u, Value: ", tok2str( pimv2_hello_option_values,"Unknown",otype), otype, olen); bp += 4; switch (otype) { case PIMV2_HELLO_OPTION_HOLDTIME: relts_print(EXTRACT_16BITS(bp)); break; case PIMV2_HELLO_OPTION_LANPRUNEDELAY: if (olen != 4) { (void)printf("ERROR: Option Lenght != 4 Bytes (%u)", olen); } else { char t_bit; u_int16_t lan_delay, override_interval; lan_delay = EXTRACT_16BITS(bp); override_interval = EXTRACT_16BITS(bp+2); t_bit = (lan_delay & 0x8000)? 1 : 0; lan_delay &= ~0x8000; (void)printf("\n\t T-bit=%d, LAN delay %dms, Override interval %dms", t_bit, lan_delay, override_interval); } break; case PIMV2_HELLO_OPTION_DR_PRIORITY_OLD: case PIMV2_HELLO_OPTION_DR_PRIORITY: switch (olen) { case 0: printf("Bi-Directional Capability (Old)"); break; case 4: printf("%u", EXTRACT_32BITS(bp)); break; default: printf("ERROR: Option Lenght != 4 Bytes (%u)", olen); break; } break; case PIMV2_HELLO_OPTION_GENID: (void)printf("0x%08x", EXTRACT_32BITS(bp)); break; case PIMV2_HELLO_OPTION_REFRESH_CAP: (void)printf("v%d", *bp); if (*(bp+1) != 0) { (void)printf(", interval "); relts_print(*(bp+1)); } if (EXTRACT_16BITS(bp+2) != 0) { (void)printf(" ?0x%04x?", EXTRACT_16BITS(bp+2)); } break; case PIMV2_HELLO_OPTION_BIDIR_CAP: break; case PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD: case PIMV2_HELLO_OPTION_ADDRESS_LIST: if (vflag > 1) { const u_char *ptr = bp; while (ptr < (bp+olen)) { int advance; printf("\n\t "); advance = pimv2_addr_print(ptr, pimv2_unicast, 0); if (advance < 0) { printf("..."); break; } ptr += advance; } } break; default: if (vflag <= 1) print_unknown_data(bp,"\n\t ",olen); break; } /* do we want to see an additionally hexdump ? */ if (vflag> 1) print_unknown_data(bp,"\n\t ",olen); bp += olen; } break; } case PIMV2_TYPE_REGISTER: { struct ip *ip; if (!TTEST2(*(bp+4), PIMV2_REGISTER_FLAG_LEN)) goto trunc; printf(", Flags [ %s ]\n\t", tok2str(pimv2_register_flag_values, "none", EXTRACT_32BITS(bp+4))); bp += 8; len -= 8; /* encapsulated multicast packet */ ip = (struct ip *)bp; switch (IP_V(ip)) { case 0: /* Null header */ (void)printf("IP-Null-header %s > %s", ipaddr_string(&ip->ip_src), ipaddr_string(&ip->ip_dst)); break; case 4: /* IPv4 */ ip_print(gndo, bp, len); break;#ifdef INET6 case 6: /* IPv6 */ ip6_print(bp, len); break;#endif default: (void)printf("IP ver %d", IP_V(ip)); break; } break; } case PIMV2_TYPE_REGISTER_STOP: bp += 4; len -= 4; if (bp >= ep) break; (void)printf(" group="); if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) { (void)printf("..."); break; } bp += advance; len -= advance; if (bp >= ep) break; (void)printf(" source="); if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) { (void)printf("..."); break; } bp += advance; len -= advance; break; case PIMV2_TYPE_JOIN_PRUNE: case PIMV2_TYPE_GRAFT: case PIMV2_TYPE_GRAFT_ACK: /* * 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |PIM Ver| Type | Addr length | Checksum | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Unicast-Upstream Neighbor Address | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Reserved | Num groups | Holdtime | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Encoded-Multicast Group Address-1 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of Joined Sources | Number of Pruned Sources | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Encoded-Joined Source Address-1 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | . | * | . | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Encoded-Joined Source Address-n | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Encoded-Pruned Source Address-1 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | . | * | . | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Encoded-Pruned Source Address-n | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | . | * | . | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Encoded-Multicast Group Address-n | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ { u_int8_t ngroup; u_int16_t holdtime; u_int16_t njoin; u_int16_t nprune; int i, j; bp += 4; len -= 4; if (PIM_TYPE(pim->pim_typever) != 7) { /*not for Graft-ACK*/ if (bp >= ep) break; (void)printf(", upstream-neighbor: "); if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) { (void)printf("..."); break; } bp += advance; len -= advance; } if (bp + 4 > ep) break; ngroup = bp[1]; holdtime = EXTRACT_16BITS(&bp[2]); (void)printf("\n\t %u group(s)", ngroup); if (PIM_TYPE(pim->pim_typever) != 7) { /*not for Graft-ACK*/ (void)printf(", holdtime: "); if (holdtime == 0xffff) (void)printf("infinite"); else relts_print(holdtime); } bp += 4; len -= 4; for (i = 0; i < ngroup; i++) { if (bp >= ep) goto jp_done; (void)printf("\n\t group #%u: ", i+1); if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) { (void)printf("...)"); goto jp_done; } bp += advance; len -= advance; if (bp + 4 > ep) { (void)printf("...)"); goto jp_done; } njoin = EXTRACT_16BITS(&bp[0]); nprune = EXTRACT_16BITS(&bp[2]); (void)printf(", joined sources: %u, pruned sources: %u", njoin,nprune); bp += 4; len -= 4; for (j = 0; j < njoin; j++) { (void)printf("\n\t joined source #%u: ",j+1); if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) { (void)printf("...)"); goto jp_done; } bp += advance; len -= advance; } for (j = 0; j < nprune; j++) { (void)printf("\n\t pruned source #%u: ",j+1); if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) { (void)printf("...)"); goto jp_done; } bp += advance; len -= advance; } } jp_done: break; } case PIMV2_TYPE_BOOTSTRAP: { int i, j, frpcnt; bp += 4; /* Fragment Tag, Hash Mask len, and BSR-priority */ if (bp + sizeof(u_int16_t) >= ep) break; (void)printf(" tag=%x", EXTRACT_16BITS(bp)); bp += sizeof(u_int16_t); if (bp >= ep) break; (void)printf(" hashmlen=%d", bp[0]); if (bp + 1 >= ep) break; (void)printf(" BSRprio=%d", bp[1]); bp += 2; /* Encoded-Unicast-BSR-Address */ if (bp >= ep) break; (void)printf(" BSR="); if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) { (void)printf("..."); break; } bp += advance; for (i = 0; bp < ep; i++) { /* Encoded-Group Address */ (void)printf(" (group%d: ", i); if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) { (void)printf("...)"); goto bs_done; } bp += advance; /* RP-Count, Frag RP-Cnt, and rsvd */ if (bp >= ep) { (void)printf("...)"); goto bs_done; } (void)printf(" RPcnt=%d", bp[0]); if (bp + 1 >= ep) { (void)printf("...)"); goto bs_done; } (void)printf(" FRPcnt=%d", frpcnt = bp[1]); bp += 4; for (j = 0; j < frpcnt && bp < ep; j++) { /* each RP info */ (void)printf(" RP%d=", j); if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) { (void)printf("...)"); goto bs_done; } bp += advance; if (bp + 1 >= ep) { (void)printf("...)"); goto bs_done; } (void)printf(",holdtime="); relts_print(EXTRACT_16BITS(bp)); if (bp + 2 >= ep) { (void)printf("...)"); goto bs_done; } (void)printf(",prio=%d", bp[2]); bp += 4; } (void)printf(")"); } bs_done: break; } case PIMV2_TYPE_ASSERT: bp += 4; len -= 4; if (bp >= ep) break; (void)printf(" group="); if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) { (void)printf("..."); break; } bp += advance; len -= advance; if (bp >= ep) break; (void)printf(" src="); if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) { (void)printf("..."); break; } bp += advance; len -= advance; if (bp + 8 > ep) break; if (bp[0] & 0x80) (void)printf(" RPT"); (void)printf(" pref=%u", EXTRACT_32BITS(&bp[0]) & 0x7fffffff); (void)printf(" metric=%u", EXTRACT_32BITS(&bp[4])); break; case PIMV2_TYPE_CANDIDATE_RP: { int i, pfxcnt; bp += 4; /* Prefix-Cnt, Priority, and Holdtime */ if (bp >= ep) break; (void)printf(" prefix-cnt=%d", bp[0]); pfxcnt = bp[0]; if (bp + 1 >= ep) break; (void)printf(" prio=%d", bp[1]); if (bp + 3 >= ep) break; (void)printf(" holdtime="); relts_print(EXTRACT_16BITS(&bp[2])); bp += 4; /* Encoded-Unicast-RP-Address */ if (bp >= ep) break; (void)printf(" RP="); if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) { (void)printf("..."); break; } bp += advance; /* Encoded-Group Addresses */ for (i = 0; i < pfxcnt && bp < ep; i++) { (void)printf(" Group%d=", i); if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) { (void)printf("..."); break; } bp += advance; } break; } case PIMV2_TYPE_PRUNE_REFRESH: (void)printf(" src="); if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) { (void)printf("..."); break; } bp += advance; (void)printf(" grp="); if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) { (void)printf("..."); break; } bp += advance; (void)printf(" forwarder="); if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) { (void)printf("..."); break; } bp += advance; TCHECK2(bp[0], 2); (void)printf(" TUNR "); relts_print(EXTRACT_16BITS(bp)); break; default: (void)printf(" [type %d]", PIM_TYPE(pim->pim_typever)); break; } return;trunc: (void)printf("[|pim]");}/* * Local Variables: * c-style: whitesmith * c-basic-offset: 8 * End: */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?