struct ip_print_demux_state *ipds)
{
struct protoent *proto;
- struct cksum_vec vec[1];
again:
switch (ipds->nh) {
}
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(ndo, ipds->cp, ipds->len);
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:
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;
ND_PRINT((ndo, " ip-proto-%d", ipds->ip->ip_p));
}
}
+ return;
+
+trunc:
+ ND_PRINT((ndo, "%s", tstr));
+ return;
}
void
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;