/* \summary: IPv4/IPv6 payload printer */
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include "netdissect-stdinc.h"
-#include <string.h>
-
#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
#include "ipproto.h"
void
-ip_print_demux(netdissect_options *ndo,
+ip_demux_print(netdissect_options *ndo,
const u_char *bp,
- u_int length, u_int ver, int fragmented, u_int ttl_hl, u_int nh,
- const u_char *iph)
+ u_int length, u_int ver, int fragmented, u_int ttl_hl,
+ uint8_t nh, const u_char *iph)
{
int advance;
const char *p_name;
case IPPROTO_ESP:
{
- u_int enh, padlen;
- advance = esp_print(ndo, bp, length,
- iph, &enh, &padlen);
- if (advance <= 0)
- break;
- bp += advance;
- length -= advance + padlen;
- nh = enh & 0xff;
- goto again;
+ esp_print(ndo, bp, length, iph, ver, fragmented, ttl_hl);
+ /*
+ * Either this has decrypted 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_IPCOMP:
break;
case IPPROTO_ICMP:
- icmp_print(ndo, bp, length, iph, fragmented);
+ if (ver == 4)
+ icmp_print(ndo, bp, length, fragmented);
+ else {
+ ND_PRINT("[%s requires IPv4]",
+ tok2str(ipproto_values,"unknown",nh));
+ nd_print_invalid(ndo);
+ }
break;
case IPPROTO_ICMPV6:
- icmp6_print(ndo, bp, length, iph, fragmented);
- return;
+ if (ver == 6)
+ icmp6_print(ndo, bp, length, iph, fragmented);
+ else {
+ ND_PRINT("[%s requires IPv6]",
+ tok2str(ipproto_values,"unknown",nh));
+ nd_print_invalid(ndo);
+ }
+ break;
case IPPROTO_PIGP:
/*
* (used by Cisco for their IGRP)" and 88 as
* "EIGRP" from Cisco.
*
- * Recent BSD <netinet/in.h> headers define
- * IP_PROTO_PIGP as 9 and IP_PROTO_IGRP as 88.
- * We define IP_PROTO_PIGP as 9 and
- * IP_PROTO_EIGRP as 88; those names better
- * match was the current protocol number
- * assignments say.
+ * Recent FreeBSD, DragonFly BSD, and macOS <netinet/in.h>
+ * headers define IPPROTO_PIGP as 9 and IPPROTO_IGRP
+ * as 88. We define IPPROTO_PIGP ("private interior
+ * gateway protocol") as 9 and IPPROTO_EIGRP as 88;
+ * those names better match what the current protocol
+ * number assignments say.
*/
igrp_print(ndo, bp, length);
break;
break;
case IPPROTO_IGMP:
- igmp_print(ndo, bp, length);
+ if (ver == 4)
+ igmp_print(ndo, bp, length);
+ else {
+ ND_PRINT("[%s requires IPv4]",
+ tok2str(ipproto_values,"unknown",nh));
+ nd_print_invalid(ndo);
+ }
break;
case IPPROTO_IPV4:
/* ipv4-in-ip encapsulation */
ip_print(ndo, bp, length);
- if (! ndo->ndo_vflag) {
- ND_PRINT(" (ipip-proto-4)");
- return;
- }
break;
case IPPROTO_IPV6:
if (ndo->ndo_packettype == PT_CARP) {
carp_print(ndo, bp, length, ttl_hl);
} else {
- vrrp_print(ndo, bp, length, iph, ttl_hl);
+ vrrp_print(ndo, bp, length, iph, ttl_hl, ver);
}
break;
pgm_print(ndo, bp, length, iph);
break;
+ case IPPROTO_ETHERNET:
+ if (ver == 6)
+ ether_print(ndo, bp, length, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
+ else {
+ ND_PRINT("[%s requires IPv6]",
+ tok2str(ipproto_values,"unknown",nh));
+ nd_print_invalid(ndo);
+ }
+ break;
+
+ case IPPROTO_NHRP:
+ nhrp_print(ndo, bp, length);
+ break;
+
case IPPROTO_NONE:
ND_PRINT("no next header");
break;