]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-sl.c
gre: add support for MikroTik Ethernet-over-IP hack.
[tcpdump] / print-sl.c
index e82128782f69170156adc6d880e98337987a1095..88f9fb0291e10fe48b32cac3cfecd89097477cba 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "netdissect-stdinc.h"
 
+#define ND_LONGJMP_FROM_TCHECK
 #include "netdissect.h"
 #include "extract.h"
 
@@ -42,7 +43,6 @@
 
 #define SLX_DIR 0
 #define SLX_CHDR 1
-#define CHDR_LEN 15
 
 #define SLIPDIR_IN 0
 #define SLIPDIR_OUT 1
 static u_int lastlen[2][256];
 static u_int lastconn = 255;
 
-static int sliplink_print(netdissect_options *, const u_char *, const struct ip *, u_int);
-static int compressed_sl_print(netdissect_options *, const u_char *, const struct ip *, u_int, int);
+static void sliplink_print(netdissect_options *, const u_char *, const struct ip *, u_int);
+static void compressed_sl_print(netdissect_options *, const u_char *, const struct ip *, u_int, int);
 
 void
 sl_if_print(netdissect_options *ndo,
             const struct pcap_pkthdr *h, const u_char *p)
 {
-       u_int caplen = h->caplen;
        u_int length = h->len;
        const struct ip *ip;
 
        ndo->ndo_protocol = "slip";
-       if (caplen < SLIP_HDRLEN) {
-               nd_print_trunc(ndo);
-               ndo->ndo_ll_hdr_len += caplen;
-               return;
-       }
+       ND_TCHECK_LEN(p, SLIP_HDRLEN);
        ndo->ndo_ll_hdr_len += SLIP_HDRLEN;
 
-       caplen -= SLIP_HDRLEN;
        length -= SLIP_HDRLEN;
 
        ip = (const struct ip *)(p + SLIP_HDRLEN);
 
        if (ndo->ndo_eflag)
-               if (sliplink_print(ndo, p, ip, length) == -1) {
-                       nd_print_trunc(ndo);
-                       return;
-               }
+               sliplink_print(ndo, p, ip, length);
 
        switch (IP_V(ip)) {
        case 4:
@@ -97,16 +88,11 @@ void
 sl_bsdos_if_print(netdissect_options *ndo,
                   const struct pcap_pkthdr *h, const u_char *p)
 {
-       u_int caplen = h->caplen;
        u_int length = h->len;
        const struct ip *ip;
 
        ndo->ndo_protocol = "slip_bsdos";
-       if (caplen < SLIP_HDRLEN) {
-               nd_print_trunc(ndo);
-               ndo->ndo_ll_hdr_len += caplen;
-               return;
-       }
+       ND_TCHECK_LEN(p, SLIP_HDRLEN);
        ndo->ndo_ll_hdr_len += SLIP_HDRLEN;
 
        length -= SLIP_HDRLEN;
@@ -121,7 +107,7 @@ sl_bsdos_if_print(netdissect_options *ndo,
        ip_print(ndo, (const u_char *)ip, length);
 }
 
-static int
+static void
 sliplink_print(netdissect_options *ndo,
                const u_char *p, const struct ip *ip,
                u_int length)
@@ -161,11 +147,9 @@ sliplink_print(netdissect_options *ndo,
                ND_PRINT("utcp %u: ", lastconn);
                if (dir == -1) {
                        /* Direction is bogus, don't use it */
-                       return 0;
+                       return;
                }
-               ND_TCHECK_SIZE(ip);
                hlen = IP_HL(ip);
-               ND_TCHECK_SIZE((const struct tcphdr *)&((const int *)ip)[hlen]);
                hlen += TH_OFF((const struct tcphdr *)&((const int *)ip)[hlen]);
                lastlen[dir][lastconn] = length - (hlen << 2);
                break;
@@ -173,19 +157,14 @@ sliplink_print(netdissect_options *ndo,
        default:
                if (dir == -1) {
                        /* Direction is bogus, don't use it */
-                       return 0;
+                       return;
                }
                if (GET_U_1(p + SLX_CHDR) & TYPE_COMPRESSED_TCP) {
-                       if (compressed_sl_print(ndo, p + SLX_CHDR, ip,
-                                               length, dir) == -1)
-                               goto trunc;
+                       compressed_sl_print(ndo, p + SLX_CHDR, ip, length, dir);
                        ND_PRINT(": ");
                } else
                        ND_PRINT("slip-%u!: ", GET_U_1(p + SLX_CHDR));
        }
-       return 0;
-trunc:
-       return -1;
 }
 
 static const u_char *
@@ -221,7 +200,7 @@ print_sl_winchange(netdissect_options *ndo,
        return (cp);
 }
 
-static int
+static void
 compressed_sl_print(netdissect_options *ndo,
                     const u_char *chdr, const struct ip *ip,
                     u_int length, int dir)
@@ -269,13 +248,8 @@ compressed_sl_print(netdissect_options *ndo,
         * 'cp - chdr' is the length of the compressed header.
         * 'length - hlen' is the amount of data in the packet.
         */
-       ND_TCHECK_SIZE(ip);
        hlen = IP_HL(ip);
-       ND_TCHECK_SIZE((const struct tcphdr *)&((const int32_t *)ip)[hlen]);
        hlen += TH_OFF((const struct tcphdr *)&((const int32_t *)ip)[hlen]);
        lastlen[dir][lastconn] = length - (hlen << 2);
        ND_PRINT(" %u (%ld)", lastlen[dir][lastconn], (long)(cp - chdr));
-       return 0;
-trunc:
-       return -1;
 }