diff options
Diffstat (limited to 'contrib/tcpdump/print-ip.c')
-rw-r--r-- | contrib/tcpdump/print-ip.c | 138 |
1 files changed, 75 insertions, 63 deletions
diff --git a/contrib/tcpdump/print-ip.c b/contrib/tcpdump/print-ip.c index edf0076..6071bb2 100644 --- a/contrib/tcpdump/print-ip.c +++ b/contrib/tcpdump/print-ip.c @@ -17,22 +17,21 @@ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * $FreeBSD$ */ -#define NETDISSECT_REWORKED +/* \summary: IP printer */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include <tcpdump-stdinc.h> +#include <netdissect-stdinc.h> #include <string.h> -#include "interface.h" +#include "netdissect.h" #include "addrtoname.h" -#include "extract.h" /* must come after interface.h */ +#include "extract.h" #include "ip.h" #include "ipproto.h" @@ -125,7 +124,7 @@ ip_finddst(netdissect_options *ndo, } } trunc: - UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(uint32_t)); + UNALIGNED_MEMCPY(&retval, &ip->ip_dst, sizeof(uint32_t)); return retval; } @@ -150,9 +149,9 @@ nextproto4_cksum(netdissect_options *ndo, ph.len = htons((uint16_t)len); ph.mbz = 0; ph.proto = next_proto; - UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(uint32_t)); + UNALIGNED_MEMCPY(&ph.src, &ip->ip_src, sizeof(uint32_t)); if (IP_HL(ip) == 5) - UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(uint32_t)); + UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst, sizeof(uint32_t)); else ph.dst = ip_finddst(ndo, ip); @@ -326,12 +325,15 @@ ip_print_demux(netdissect_options *ndo, struct ip_print_demux_state *ipds) { struct protoent *proto; - struct cksum_vec vec[1]; again: switch (ipds->nh) { case IPPROTO_AH: + if (!ND_TTEST(*ipds->cp)) { + ND_PRINT((ndo, "[|AH]")); + break; + } ipds->nh = *ipds->cp; ipds->advance = ah_print(ndo, ipds->cp); if (ipds->advance <= 0) @@ -356,14 +358,14 @@ again: case IPPROTO_IPCOMP: { - int enh; - ipds->advance = ipcomp_print(ndo, ipds->cp, &enh); - if (ipds->advance <= 0) - break; - ipds->cp += ipds->advance; - ipds->len -= ipds->advance; - ipds->nh = enh & 0xff; - goto again; + ipcomp_print(ndo, ipds->cp); + /* + * Either this has decompressed the payload and + * printed it, in which case there's nothing more + * to do, or it hasn't, in which case there's + * nothing more to do. + */ + break; } case IPPROTO_SCTP: @@ -457,9 +459,7 @@ again: break; case IPPROTO_PIM: - vec[0].ptr = ipds->cp; - vec[0].len = ipds->len; - pim_print(ndo, ipds->cp, ipds->len, in_cksum(vec, 1)); + pim_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip); break; case IPPROTO_VRRP: @@ -536,13 +536,14 @@ ip_print(netdissect_options *ndo, ipds->ip = (const struct ip *)bp; ND_TCHECK(ipds->ip->ip_vhl); - if (IP_V(ipds->ip) != 4) { /* print version if != 4 */ + if (IP_V(ipds->ip) != 4) { /* print version and fail if != 4 */ if (IP_V(ipds->ip) == 6) ND_PRINT((ndo, "IP6, wrong link-layer encapsulation ")); else ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip))); + return; } - else if (!ndo->ndo_eflag) + if (!ndo->ndo_eflag) ND_PRINT((ndo, "IP ")); ND_TCHECK(*ipds->ip); @@ -590,17 +591,22 @@ ip_print(netdissect_options *ndo, if (ndo->ndo_vflag) { ND_PRINT((ndo, "(tos 0x%x", (int)ipds->ip->ip_tos)); /* ECN bits */ - if (ipds->ip->ip_tos & 0x03) { - switch (ipds->ip->ip_tos & 0x03) { - case 1: - ND_PRINT((ndo, ",ECT(1)")); - break; - case 2: - ND_PRINT((ndo, ",ECT(0)")); - break; - case 3: - ND_PRINT((ndo, ",CE")); - } + switch (ipds->ip->ip_tos & 0x03) { + + case 0: + break; + + case 1: + ND_PRINT((ndo, ",ECT(1)")); + break; + + case 2: + ND_PRINT((ndo, ",ECT(0)")); + break; + + case 3: + ND_PRINT((ndo, ",CE")); + break; } if (ipds->ip->ip_ttl >= 1) @@ -623,12 +629,12 @@ ip_print(netdissect_options *ndo, if ((hlen - sizeof(struct ip)) > 0) { ND_PRINT((ndo, ", options (")); - ip_optprint(ndo, (u_char *)(ipds->ip + 1), hlen - sizeof(struct ip)); + ip_optprint(ndo, (const u_char *)(ipds->ip + 1), hlen - sizeof(struct ip)); ND_PRINT((ndo, ")")); } - if (!ndo->ndo_Kflag && (u_char *)ipds->ip + hlen <= ndo->ndo_snapend) { - vec[0].ptr = (const uint8_t *)(void *)ipds->ip; + if (!ndo->ndo_Kflag && (const u_char *)ipds->ip + hlen <= ndo->ndo_snapend) { + vec[0].ptr = (const uint8_t *)(const void *)ipds->ip; vec[0].len = hlen; sum = in_cksum(vec, 1); if (sum != 0) { @@ -657,22 +663,24 @@ ip_print(netdissect_options *ndo, } ip_print_demux(ndo, ipds); } else { - /* Ultra quiet now means that all this stuff should be suppressed */ - if (ndo->ndo_qflag > 1) return; + /* + * Ultra quiet now means that all this stuff should be + * suppressed. + */ + if (ndo->ndo_qflag > 1) + return; - /* - * if this isn't the first frag, we're missing the - * next level protocol header. print the ip addr - * and the protocol. - */ - if (ipds->off & 0x1fff) { - ND_PRINT((ndo, "%s > %s:", ipaddr_string(ndo, &ipds->ip->ip_src), - ipaddr_string(ndo, &ipds->ip->ip_dst))); - if (!ndo->ndo_nflag && (proto = getprotobynumber(ipds->ip->ip_p)) != NULL) - ND_PRINT((ndo, " %s", proto->p_name)); - else - ND_PRINT((ndo, " ip-proto-%d", ipds->ip->ip_p)); - } + /* + * This isn't the first frag, so we're missing the + * next level protocol header. print the ip addr + * and the protocol. + */ + ND_PRINT((ndo, "%s > %s:", ipaddr_string(ndo, &ipds->ip->ip_src), + ipaddr_string(ndo, &ipds->ip->ip_dst))); + if (!ndo->ndo_nflag && (proto = getprotobynumber(ipds->ip->ip_p)) != NULL) + ND_PRINT((ndo, " %s", proto->p_name)); + else + ND_PRINT((ndo, " ip-proto-%d", ipds->ip->ip_p)); } return; @@ -684,24 +692,28 @@ trunc: void ipN_print(netdissect_options *ndo, register const u_char *bp, register u_int length) { - struct ip hdr; - - if (length < 4) { + if (length < 1) { ND_PRINT((ndo, "truncated-ip %d", length)); return; } - memcpy (&hdr, bp, 4); - switch (IP_V(&hdr)) { - case 4: + + ND_TCHECK(*bp); + switch (*bp & 0xF0) { + case 0x40: ip_print (ndo, bp, length); - return; - case 6: + break; + case 0x60: ip6_print (ndo, bp, length); - return; + break; default: - ND_PRINT((ndo, "unknown ip %d", IP_V(&hdr))); - return; + ND_PRINT((ndo, "unknown ip %d", (*bp & 0xF0) >> 4)); + break; } + return; + +trunc: + ND_PRINT((ndo, "%s", tstr)); + return; } /* |