]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ipcomp.c
CI: Add warning exemptions for Sun C (suncc-5.14) on Solaris 10
[tcpdump] / print-ipcomp.c
index 2504bfd9ae93511900f15130fe68f64e5c7930ce..a88f679750621343fa716dfcaae59f55df1ca1f8 100644 (file)
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+/* \summary: IP Payload Compression Protocol (IPComp) printer */
 
-#include <tcpdump-stdinc.h>
+#include <config.h>
 
-struct ipcomp {
-       uint8_t comp_nxt;       /* Next Header */
-       uint8_t comp_flags;     /* Length of data, in 32bit */
-       uint16_t comp_cpi;      /* Compression parameter index */
-};
-
-#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
-#include <zlib.h>
-#endif
+#include "netdissect-stdinc.h"
 
-#include "interface.h"
+#include "netdissect.h"
 #include "extract.h"
 
-int
-ipcomp_print(netdissect_options *ndo, register const u_char *bp, int *nhdr _U_)
+struct ipcomp {
+       nd_uint8_t  comp_nxt;   /* Next Header */
+       nd_uint8_t  comp_flags; /* Length of data, in 32bit */
+       nd_uint16_t comp_cpi;   /* Compression parameter index */
+};
+
+void
+ipcomp_print(netdissect_options *ndo, const u_char *bp)
 {
-       register const struct ipcomp *ipcomp;
-       register const u_char *ep;
+       const struct ipcomp *ipcomp;
        uint16_t cpi;
-#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
-       int advance;
-#endif
-
-       ipcomp = (struct ipcomp *)bp;
-       cpi = EXTRACT_16BITS(&ipcomp->comp_cpi);
-
-       /* 'ep' points to the end of available data. */
-       ep = ndo->ndo_snapend;
 
-       if ((u_char *)(ipcomp + 1) >= ep - sizeof(struct ipcomp)) {
-               ND_PRINT((ndo, "[|IPCOMP]"));
-               goto fail;
-       }
-       ND_PRINT((ndo, "IPComp(cpi=0x%04x)", cpi));
+       ndo->ndo_protocol = "ipcomp";
+       ipcomp = (const struct ipcomp *)bp;
+       cpi = GET_BE_U_2(ipcomp->comp_cpi);
 
-#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
-       if (1)
-               goto fail;
+       ND_PRINT("IPComp(cpi=0x%04x)", cpi);
 
        /*
-        * We may want to decompress the packet here.  Packet buffer
-        * management is a headache (if we decompress, packet will become
-        * larger).
+        * XXX - based on the CPI, we could decompress the packet here.
+        * Packet buffer management is a headache (if we decompress,
+        * packet will become larger).
+        *
+        * We would decompress the packet and then call a routine that,
+        * based on ipcomp->comp_nxt, dissects the decompressed data.
+        *
+        * Until we do that, however, we just return -1, so that
+        * the loop that processes "protocol"/"next header" types
+        * stops - there's nothing more it can do with a compressed
+        * payload.
         */
-       if (nhdr)
-               *nhdr = ipcomp->comp_nxt;
-       advance = sizeof(struct ipcomp);
-
-       ND_PRINT((ndo, ": "));
-       return advance;
-
-#endif
-fail:
-       return -1;
 }