X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/b6303af682e72841f79ac6847f93b0cb0a49c549..refs/pull/482/head:/print-ip.c diff --git a/print-ip.c b/print-ip.c index 252584da..32304aed 100644 --- a/print-ip.c +++ b/print-ip.c @@ -19,18 +19,17 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include +#include #include +#include "netdissect.h" #include "addrtoname.h" -#include "interface.h" -#include "extract.h" /* must come after interface.h */ +#include "extract.h" #include "ip.h" #include "ipproto.h" @@ -71,7 +70,7 @@ ip_printroute(netdissect_options *ndo, ND_PRINT((ndo, " [bad ptr %u]", cp[2])); for (len = 3; len < length; len += 4) { - ND_PRINT((ndo, " %s", ipaddr_string(&cp[len]))); + ND_PRINT((ndo, " %s", ipaddr_string(ndo, &cp[len]))); if (ptr > len) ND_PRINT((ndo, ",")); } @@ -84,14 +83,14 @@ ip_printroute(netdissect_options *ndo, * This is used for UDP and TCP pseudo-header in the checksum * calculation. */ -static u_int32_t +static uint32_t ip_finddst(netdissect_options *ndo, const struct ip *ip) { int length; int len; const u_char *cp; - u_int32_t retval; + uint32_t retval; cp = (const u_char *)(ip + 1); length = (IP_HL(ip) << 2) - sizeof(struct ip); @@ -123,7 +122,7 @@ ip_finddst(netdissect_options *ndo, } } trunc: - UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(u_int32_t)); + UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(uint32_t)); return retval; } @@ -132,29 +131,29 @@ trunc: */ int nextproto4_cksum(netdissect_options *ndo, - const struct ip *ip, const u_int8_t *data, + const struct ip *ip, const uint8_t *data, u_int len, u_int covlen, u_int next_proto) { struct phdr { - u_int32_t src; - u_int32_t dst; + uint32_t src; + uint32_t dst; u_char mbz; u_char proto; - u_int16_t len; + uint16_t len; } ph; struct cksum_vec vec[2]; /* pseudo-header.. */ - ph.len = htons((u_int16_t)len); + ph.len = htons((uint16_t)len); ph.mbz = 0; ph.proto = next_proto; - UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t)); + UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(uint32_t)); if (IP_HL(ip) == 5) - UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t)); + UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(uint32_t)); else ph.dst = ip_finddst(ndo, ip); - vec[0].ptr = (const u_int8_t *)(void *)&ph; + vec[0].ptr = (const uint8_t *)(void *)&ph; vec[0].len = sizeof(ph); vec[1].ptr = data; vec[1].len = covlen; @@ -211,7 +210,7 @@ ip_printts(netdissect_options *ndo, if (ptr == len) type = " ^ "; ND_PRINT((ndo, "%s%d@%s", type, EXTRACT_32BITS(&cp[len+hoplen-4]), - hoplen!=8 ? "" : ipaddr_string(&cp[len]))); + hoplen!=8 ? "" : ipaddr_string(ndo, &cp[len]))); type = " "; } @@ -324,7 +323,6 @@ ip_print_demux(netdissect_options *ndo, struct ip_print_demux_state *ipds) { struct protoent *proto; - struct cksum_vec vec[1]; again: switch (ipds->nh) { @@ -374,7 +372,7 @@ again: case IPPROTO_TCP: /* pass on the MF bit plus the offset to detect fragments */ - tcp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip, + tcp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip, ipds->off & (IP_MF|IP_OFFMASK)); break; @@ -420,7 +418,7 @@ again: break; case IPPROTO_OSPF: - ospf_print(ipds->cp, ipds->len, (const u_char *)ipds->ip); + ospf_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip); break; case IPPROTO_IGMP: @@ -436,15 +434,13 @@ again: } break; -#ifdef INET6 case IPPROTO_IPV6: /* ip6-in-ip encapsulation */ ip6_print(ndo, ipds->cp, ipds->len); break; -#endif /*INET6*/ case IPPROTO_RSVP: - rsvp_print(ipds->cp, ipds->len); + rsvp_print(ndo, ipds->cp, ipds->len); break; case IPPROTO_GRE: @@ -457,23 +453,21 @@ 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: if (ndo->ndo_packettype == PT_CARP) { if (ndo->ndo_vflag) ND_PRINT((ndo, "carp %s > %s: ", - ipaddr_string(&ipds->ip->ip_src), - ipaddr_string(&ipds->ip->ip_dst))); + ipaddr_string(ndo, &ipds->ip->ip_src), + ipaddr_string(ndo, &ipds->ip->ip_dst))); carp_print(ndo, ipds->cp, ipds->len, ipds->ip->ip_ttl); } else { if (ndo->ndo_vflag) ND_PRINT((ndo, "vrrp %s > %s: ", - ipaddr_string(&ipds->ip->ip_src), - ipaddr_string(&ipds->ip->ip_dst))); + ipaddr_string(ndo, &ipds->ip->ip_src), + ipaddr_string(ndo, &ipds->ip->ip_dst))); vrrp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip, ipds->ip->ip_ttl); } @@ -525,22 +519,21 @@ ip_print(netdissect_options *ndo, const u_char *ipend; u_int hlen; struct cksum_vec vec[1]; - u_int16_t sum, ip_sum; + uint16_t sum, ip_sum; struct protoent *proto; ipds->ip = (const struct ip *)bp; + ND_TCHECK(ipds->ip->ip_vhl); if (IP_V(ipds->ip) != 4) { /* print version if != 4 */ - ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip))); if (IP_V(ipds->ip) == 6) - ND_PRINT((ndo, ", wrong link-layer encapsulation")); + ND_PRINT((ndo, "IP6, wrong link-layer encapsulation ")); + else + ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip))); } else if (!ndo->ndo_eflag) ND_PRINT((ndo, "IP ")); - if ((u_char *)(ipds->ip + 1) > ndo->ndo_snapend) { - ND_PRINT((ndo, "%s", tstr)); - return; - } + ND_TCHECK(*ipds->ip); if (length < sizeof (struct ip)) { ND_PRINT((ndo, "truncated-ip %u", length)); return; @@ -618,12 +611,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 u_int8_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) { @@ -647,8 +640,8 @@ ip_print(netdissect_options *ndo, if (ipds->nh != IPPROTO_TCP && ipds->nh != IPPROTO_UDP && ipds->nh != IPPROTO_SCTP && ipds->nh != IPPROTO_DCCP) { ND_PRINT((ndo, "%s > %s: ", - ipaddr_string(&ipds->ip->ip_src), - ipaddr_string(&ipds->ip->ip_dst))); + ipaddr_string(ndo, &ipds->ip->ip_src), + ipaddr_string(ndo, &ipds->ip->ip_dst))); } ip_print_demux(ndo, ipds); } else { @@ -661,14 +654,19 @@ ip_print(netdissect_options *ndo, * and the protocol. */ if (ipds->off & 0x1fff) { - ND_PRINT((ndo, "%s > %s:", ipaddr_string(&ipds->ip->ip_src), - ipaddr_string(&ipds->ip->ip_dst))); + 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; + +trunc: + ND_PRINT((ndo, "%s", tstr)); + return; } void @@ -685,11 +683,9 @@ ipN_print(netdissect_options *ndo, register const u_char *bp, register u_int len case 4: ip_print (ndo, bp, length); return; -#ifdef INET6 case 6: ip6_print (ndo, bp, length); return; -#endif default: ND_PRINT((ndo, "unknown ip %d", IP_V(&hdr))); return;