?? print-pgm.c
字號:
*/ switch (EXTRACT_16BITS(&nak->pgmn_source_afi)) { case AFI_IP: addr_size = sizeof(struct in_addr); source_af = AF_INET; break;#ifdef INET6 case AFI_IP6: addr_size = sizeof(struct in6_addr); source_af = AF_INET6; break;#endif default: goto trunc; break; } bp = (u_char *) (nak + 1); TCHECK2(*bp, addr_size); source = bp; bp += addr_size; /* * Skip past the group, saving info along the way * and stopping if we don't have enough. */ switch (EXTRACT_16BITS(bp)) { case AFI_IP: addr_size = sizeof(struct in_addr); group_af = AF_INET; break;#ifdef INET6 case AFI_IP6: addr_size = sizeof(struct in6_addr); group_af = AF_INET6; break;#endif default: goto trunc; break; } bp += (2 * sizeof(u_int16_t)); TCHECK2(*bp, addr_size); group = bp; bp += addr_size; /* * Options decoding can go here. */ inet_ntop(source_af, source, source_buf, sizeof(source_buf)); inet_ntop(group_af, group, group_buf, sizeof(group_buf)); switch (pgm->pgm_type) { case PGM_NAK: (void)printf("NAK "); break; case PGM_NULLNAK: (void)printf("NNAK "); break; case PGM_NCF: (void)printf("NCF "); break; default: break; } (void)printf("(%s -> %s), seq %u", source_buf, group_buf, EXTRACT_32BITS(&nak->pgmn_seq)); break; } case PGM_SPMR: (void)printf("SPMR"); break; default: (void)printf("UNKNOWN type %0x02x", pgm->pgm_type); break; } if (pgm->pgm_options & PGM_OPT_BIT_PRESENT) { /* * make sure there's enough for the first option header */ if (!TTEST2(*bp, PGM_MIN_OPT_LEN)) { (void)printf("[|OPT]"); return; } /* * That option header MUST be an OPT_LENGTH option * (see the first paragraph of section 9.1 in RFC 3208). */ opt_type = *bp++; if ((opt_type & PGM_OPT_MASK) != PGM_OPT_LENGTH) { (void)printf("[First option bad, should be PGM_OPT_LENGTH, is %u]", opt_type & PGM_OPT_MASK); return; } opt_len = *bp++; if (opt_len != 4) { (void)printf("[Bad OPT_LENGTH option, length %u != 4]", opt_len); return; } opts_len = EXTRACT_16BITS(bp); if (opts_len < 4) { (void)printf("[Bad total option length %u < 4]", opts_len); return; } bp += sizeof(u_int16_t); (void)printf(" OPTS LEN %d", opts_len); opts_len -= 4; while (opts_len) { if (opts_len < PGM_MIN_OPT_LEN) { (void)printf("[Total option length leaves no room for final option]"); return; } opt_type = *bp++; opt_len = *bp++; if (opt_len < PGM_MIN_OPT_LEN) { (void)printf("[Bad option, length %u < %u]", opt_len, PGM_MIN_OPT_LEN); break; } if (opts_len < opt_len) { (void)printf("[Total option length leaves no room for final option]"); return; } if (!TTEST2(*bp, opt_len - 2)) { (void)printf(" [|OPT]"); return; } switch (opt_type & PGM_OPT_MASK) { case PGM_OPT_LENGTH: if (opt_len != 4) { (void)printf("[Bad OPT_LENGTH option, length %u != 4]", opt_len); return; } (void)printf(" OPTS LEN (extra?) %d", EXTRACT_16BITS(bp)); bp += sizeof(u_int16_t); opts_len -= 4; break; case PGM_OPT_FRAGMENT: if (opt_len != 16) { (void)printf("[Bad OPT_FRAGMENT option, length %u != 16]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); offset = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); len = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); (void)printf(" FRAG seq %u off %u len %u", seq, offset, len); opts_len -= 16; break; case PGM_OPT_NAK_LIST: flags1 = *bp++; flags2 = *bp++; opt_len -= sizeof(u_int32_t); /* option header */ (void)printf(" NAK LIST"); while (opt_len) { if (opt_len < sizeof(u_int32_t)) { (void)printf("[Option length not a multiple of 4]"); return; } TCHECK2(*bp, sizeof(u_int32_t)); (void)printf(" %u", EXTRACT_32BITS(bp)); bp += sizeof(u_int32_t); opt_len -= sizeof(u_int32_t); opts_len -= sizeof(u_int32_t); } break; case PGM_OPT_JOIN: if (opt_len != 8) { (void)printf("[Bad OPT_JOIN option, length %u != 8]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); (void)printf(" JOIN %u", seq); opts_len -= 8; break; case PGM_OPT_NAK_BO_IVL: if (opt_len != 12) { (void)printf("[Bad OPT_NAK_BO_IVL option, length %u != 12]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; offset = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); (void)printf(" BACKOFF ivl %u ivlseq %u", offset, seq); opts_len -= 12; break; case PGM_OPT_NAK_BO_RNG: if (opt_len != 12) { (void)printf("[Bad OPT_NAK_BO_RNG option, length %u != 12]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; offset = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); (void)printf(" BACKOFF max %u min %u", offset, seq); opts_len -= 12; break; case PGM_OPT_REDIRECT: flags1 = *bp++; flags2 = *bp++; switch (EXTRACT_16BITS(bp)) { case AFI_IP: addr_size = sizeof(struct in_addr); nla_af = AF_INET; break;#ifdef INET6 case AFI_IP6: addr_size = sizeof(struct in6_addr); nla_af = AF_INET6; break;#endif default: goto trunc; break; } bp += (2 * sizeof(u_int16_t)); if (opt_len != 4 + addr_size) { (void)printf("[Bad OPT_REDIRECT option, length %u != 4 + address size]", opt_len); return; } TCHECK2(*bp, addr_size); nla = bp; bp += addr_size; inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); (void)printf(" REDIRECT %s", (char *)nla); opts_len -= 4 + addr_size; break; case PGM_OPT_PARITY_PRM: if (opt_len != 8) { (void)printf("[Bad OPT_PARITY_PRM option, length %u != 8]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; len = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); (void)printf(" PARITY MAXTGS %u", len); opts_len -= 8; break; case PGM_OPT_PARITY_GRP: if (opt_len != 8) { (void)printf("[Bad OPT_PARITY_GRP option, length %u != 8]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; seq = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); (void)printf(" PARITY GROUP %u", seq); opts_len -= 8; break; case PGM_OPT_CURR_TGSIZE: if (opt_len != 8) { (void)printf("[Bad OPT_CURR_TGSIZE option, length %u != 8]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; len = EXTRACT_32BITS(bp); bp += sizeof(u_int32_t); (void)printf(" PARITY ATGS %u", len); opts_len -= 8; break; case PGM_OPT_NBR_UNREACH: if (opt_len != 4) { (void)printf("[Bad OPT_NBR_UNREACH option, length %u != 4]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; (void)printf(" NBR_UNREACH"); opts_len -= 4; break; case PGM_OPT_PATH_NLA: (void)printf(" PATH_NLA [%d]", opt_len); bp += opt_len; opts_len -= opt_len; break; case PGM_OPT_SYN: if (opt_len != 4) { (void)printf("[Bad OPT_SYN option, length %u != 4]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; (void)printf(" SYN"); opts_len -= 4; break; case PGM_OPT_FIN: if (opt_len != 4) { (void)printf("[Bad OPT_FIN option, length %u != 4]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; (void)printf(" FIN"); opts_len -= 4; break; case PGM_OPT_RST: if (opt_len != 4) { (void)printf("[Bad OPT_RST option, length %u != 4]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; (void)printf(" RST"); opts_len -= 4; break; case PGM_OPT_CR: (void)printf(" CR"); bp += opt_len; opts_len -= opt_len; break; case PGM_OPT_CRQST: if (opt_len != 4) { (void)printf("[Bad OPT_CRQST option, length %u != 4]", opt_len); return; } flags1 = *bp++; flags2 = *bp++; (void)printf(" CRQST"); opts_len -= 4; break; default: (void)printf(" OPT_%02X [%d] ", opt_type, opt_len); bp += opt_len; opts_len -= opt_len; break; } if (opt_type & PGM_OPT_END) break; } } (void)printf(" [%u]", EXTRACT_16BITS(&pgm->pgm_length)); return;trunc: fputs("[|pgm]", stdout); if (ch != '\0') putchar('>');}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -