#include "netdissect-stdinc.h"
+#define ND_LONGJMP_FROM_TCHECK
#include "netdissect.h"
#include "extract.h"
#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_header_length += caplen;
- return;
- }
- ndo->ndo_ll_header_length += SLIP_HDRLEN;
+ 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:
default:
ND_PRINT("ip v%u", IP_V(ip));
}
-
- return;
}
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_header_length += caplen;
- return;
- }
- ndo->ndo_ll_header_length += SLIP_HDRLEN;
+ ND_TCHECK_LEN(p, SLIP_HDRLEN);
+ ndo->ndo_ll_hdr_len += SLIP_HDRLEN;
length -= SLIP_HDRLEN;
#endif
ip_print(ndo, (const u_char *)ip, length);
-
- return;
}
-static int
+static void
sliplink_print(netdissect_options *ndo,
const u_char *p, const struct ip *ip,
u_int length)
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;
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 *
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)
* '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;
}