]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ip-demux.c
CI: Add warning exemptions for Sun C (suncc-5.15) on Solaris 10
[tcpdump] / print-ip-demux.c
index 265658e71a165b67c89a20805e952612b0e3f9fb..b5282761ccd86e430cd26f7097c2f1cef2ce8322 100644 (file)
 
 /* \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;
@@ -66,15 +62,14 @@ again:
 
        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:
@@ -106,12 +101,24 @@ again:
                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:
                /*
@@ -120,12 +127,12 @@ again:
                 * (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;
@@ -150,16 +157,18 @@ again:
                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:
@@ -187,7 +196,7 @@ again:
                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;
 
@@ -195,6 +204,20 @@ again:
                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;