diff options
author | Xin LI <delphij@FreeBSD.org> | 2012-05-14 08:01:48 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2012-05-14 08:01:48 +0000 |
commit | 60894fde29002aac35c5aff244b0f45c4d590413 (patch) | |
tree | 2d0f73c65ae258539a2146cd435727a18ae62097 /print-pgm.c | |
parent | 6d59e2f382406def185ce5261b8723a174cd28a3 (diff) | |
download | src-60894fde29002aac35c5aff244b0f45c4d590413.tar.gz src-60894fde29002aac35c5aff244b0f45c4d590413.zip |
Vendor import of tcpdump 4.2.1.vendor/tcpdump/4.2.1
Notes
Notes:
svn path=/vendor/tcpdump/dist/; revision=235427
svn path=/vendor/tcpdump/4.2.1/; revision=235428; tag=vendor/tcpdump/4.2.1
Diffstat (limited to 'print-pgm.c')
-rw-r--r-- | print-pgm.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/print-pgm.c b/print-pgm.c index 73a42914c7bd..2d4d7449c91b 100644 --- a/print-pgm.c +++ b/print-pgm.c @@ -72,6 +72,12 @@ struct pgm_nak { /* ... options */ }; +struct pgm_ack { + u_int32_t pgma_rx_max_seq; + u_int32_t pgma_bitmap; + /* ... options */ +}; + struct pgm_poll { u_int32_t pgmp_seq; u_int16_t pgmp_round; @@ -133,6 +139,9 @@ typedef enum _pgm_type { #define PGM_OPT_RST 0x0F #define PGM_OPT_CR 0x10 #define PGM_OPT_CRQST 0x11 + +#define PGM_OPT_PGMCC_DATA 0x12 +#define PGM_OPT_PGMCC_FEEDBACK 0x13 #define PGM_OPT_MASK 0x7f @@ -446,6 +455,17 @@ pgm_print(register const u_char *bp, register u_int length, break; } + case PGM_ACK: { + struct pgm_ack *ack; + + ack = (struct pgm_ack *)(pgm + 1); + TCHECK(*ack); + (void)printf("ACK seq %u", + EXTRACT_32BITS(&ack->pgma_rx_max_seq)); + bp = (u_char *) (ack + 1); + break; + } + case PGM_SPMR: (void)printf("SPMR"); break; @@ -736,6 +756,74 @@ pgm_print(register const u_char *bp, register u_int length, opts_len -= 4; break; + case PGM_OPT_PGMCC_DATA: + flags1 = *bp++; + flags2 = *bp++; + offset = EXTRACT_32BITS(bp); + bp += sizeof(u_int32_t); + 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 != 12 + addr_size) { + (void)printf("[Bad OPT_PGMCC_DATA option, length %u != 12 + 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(" PGMCC DATA %u %s", offset, (char*)nla); + opts_len -= 16; + break; + + case PGM_OPT_PGMCC_FEEDBACK: + flags1 = *bp++; + flags2 = *bp++; + offset = EXTRACT_32BITS(bp); + bp += sizeof(u_int32_t); + 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 != 12 + addr_size) { + (void)printf("[Bad OPT_PGMCC_FEEDBACK option, length %u != 12 + 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(" PGMCC FEEDBACK %u %s", offset, (char*)nla); + opts_len -= 16; + break; + default: (void)printf(" OPT_%02X [%d] ", opt_type, opt_len); bp += opt_len; |