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;
}
*/
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;
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));
}
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;
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;
break;
case IPPROTO_DCCP:
- dccp_print(ipds->cp, (const u_char *)ipds->ip, ipds->len);
+ dccp_print(ndo, ipds->cp, (const u_char *)ipds->ip, ipds->len);
break;
case IPPROTO_TCP:
case IPPROTO_UDP:
/* pass on the MF bit plus the offset to detect fragments */
- udp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
+ udp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip,
ipds->off & (IP_MF|IP_OFFMASK));
break;
case IPPROTO_ICMP:
/* pass on the MF bit plus the offset to detect fragments */
- icmp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
+ icmp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip,
ipds->off & (IP_MF|IP_OFFMASK));
break;
* 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:
- eigrp_print(ipds->cp, ipds->len);
+ eigrp_print(ndo, ipds->cp, ipds->len);
break;
case IPPROTO_ND:
case IPPROTO_GRE:
/* do it */
- gre_print(ipds->cp, ipds->len);
+ gre_print(ndo, ipds->cp, ipds->len);
break;
case IPPROTO_MOBILE:
- mobile_print(ipds->cp, ipds->len);
+ mobile_print(ndo, ipds->cp, ipds->len);
break;
case IPPROTO_PIM:
(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;
}
void
-ipN_print(register const u_char *bp, register u_int length)
+ipN_print(netdissect_options *ndo, 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);
+ ip_print (ndo, bp, length);
return;
#ifdef INET6
case 6:
- ip6_print (gndo, bp, length);
+ ip6_print (ndo, bp, length);
return;
#endif
default: