X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/b46ecb0d23a726cd42354e1f62bbf4de0e8437d6..2bd202a06727928f0845c9e4cec573880c58fc5a:/print-ip.c diff --git a/print-ip.c b/print-ip.c index 494eb295..6e76ecf3 100644 --- a/print-ip.c +++ b/print-ip.c @@ -19,11 +19,6 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.159 2007-09-14 01:29:28 guy Exp $ (LBL)"; -#endif - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -41,7 +36,9 @@ static const char rcsid[] _U_ = #include "ip.h" #include "ipproto.h" -struct tok ip_option_values[] = { +static const char tstr[] = "[|ip]"; + +static const struct tok ip_option_values[] = { { IPOPT_EOL, "EOL" }, { IPOPT_NOP, "NOP" }, { IPOPT_TS, "timestamp" }, @@ -120,12 +117,12 @@ ip_finddst(const struct ip *ip) case IPOPT_LSRR: if (len < 7) break; - memcpy(&retval, cp + len - 4, 4); + UNALIGNED_MEMCPY(&retval, cp + len - 4, 4); return retval; } } trunc: - memcpy(&retval, &ip->ip_dst.s_addr, sizeof(u_int32_t)); + UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(u_int32_t)); return retval; } @@ -134,7 +131,7 @@ trunc: */ int nextproto4_cksum(const struct ip *ip, const u_int8_t *data, - u_int len, u_int next_proto) + u_int len, u_int covlen, u_int next_proto) { struct phdr { u_int32_t src; @@ -149,16 +146,16 @@ nextproto4_cksum(const struct ip *ip, const u_int8_t *data, ph.len = htons((u_int16_t)len); ph.mbz = 0; ph.proto = next_proto; - memcpy(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t)); + UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t)); if (IP_HL(ip) == 5) - memcpy(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t)); + UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t)); else ph.dst = ip_finddst(ip); vec[0].ptr = (const u_int8_t *)(void *)&ph; vec[0].len = sizeof(ph); vec[1].ptr = data; - vec[1].len = len; + vec[1].len = covlen; return (in_cksum(vec, 2)); } @@ -298,12 +295,12 @@ ip_optprint(register const u_char *cp, u_int length) return; trunc: - printf("[|ip]"); + printf("%s", tstr); } #define IP_RES 0x8000 -static struct tok ip_frag_values[] = { +static const struct tok ip_frag_values[] = { { IP_MF, "+" }, { IP_DF, "DF" }, { IP_RES, "rsvd" }, /* The RFC3514 evil ;-) bit */ @@ -330,7 +327,7 @@ again: case IPPROTO_AH: ipds->nh = *ipds->cp; - ipds->advance = ah_print(ipds->cp); + ipds->advance = ah_print(gndo, ipds->cp); if (ipds->advance <= 0) break; ipds->cp += ipds->advance; @@ -354,7 +351,7 @@ again: case IPPROTO_IPCOMP: { int enh; - ipds->advance = ipcomp_print(ipds->cp, &enh); + ipds->advance = ipcomp_print(ndo, ipds->cp, &enh); if (ipds->advance <= 0) break; ipds->cp += ipds->advance; @@ -403,7 +400,7 @@ again: * match was the current protocol number * assignments say. */ - igrp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip); + igrp_print(ndo, ipds->cp, ipds->len); break; case IPPROTO_EIGRP: @@ -452,7 +449,7 @@ again: break; case IPPROTO_MOBILE: - mobile_print(ipds->cp, ipds->len); + mobile_print(ndo, ipds->cp, ipds->len); break; case IPPROTO_PIM: @@ -467,13 +464,14 @@ again: (void)printf("carp %s > %s: ", ipaddr_string(&ipds->ip->ip_src), ipaddr_string(&ipds->ip->ip_dst)); - carp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl); + carp_print(ndo, ipds->cp, ipds->len, ipds->ip->ip_ttl); } else { if (vflag) (void)printf("vrrp %s > %s: ", ipaddr_string(&ipds->ip->ip_src), ipaddr_string(&ipds->ip->ip_dst)); - vrrp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl); + vrrp_print(ipds->cp, ipds->len, + (const u_char *)ipds->ip, ipds->ip->ip_ttl); } break; @@ -536,7 +534,7 @@ ip_print(netdissect_options *ndo, printf("IP "); if ((u_char *)(ipds->ip + 1) > ndo->ndo_snapend) { - printf("[|ip]"); + printf("%s", tstr); return; } if (length < sizeof (struct ip)) { @@ -672,14 +670,13 @@ ip_print(netdissect_options *ndo, void ipN_print(register const u_char *bp, register u_int length) { - struct ip *ip, hdr; + struct ip hdr; - ip = (struct ip *)bp; if (length < 4) { (void)printf("truncated-ip %d", length); return; } - memcpy (&hdr, (char *)ip, 4); + memcpy (&hdr, bp, 4); switch (IP_V(&hdr)) { case 4: ip_print (gndo, bp, length);