/* \summary: Compressed Serial Line Internet Protocol printer */
#ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
#endif
-#include <netdissect-stdinc.h>
+#include "netdissect-stdinc.h"
#include "netdissect.h"
#include "extract.h"
#define SLIPDIR_IN 0
#define SLIPDIR_OUT 1
-static const char tstr[] = "[|slip]";
static u_int lastlen[2][256];
static u_int lastconn = 255;
-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);
+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);
u_int
sl_if_print(netdissect_options *ndo,
u_int length = h->len;
const struct ip *ip;
- if (caplen < SLIP_HDRLEN || length < SLIP_HDRLEN) {
- ND_PRINT("%s", tstr);
+ ndo->ndo_protocol = "sl_if";
+ if (caplen < SLIP_HDRLEN) {
+ nd_print_trunc(ndo);
return (caplen);
}
ip = (const struct ip *)(p + SLIP_HDRLEN);
if (ndo->ndo_eflag)
- sliplink_print(ndo, p, ip, length);
+ if (sliplink_print(ndo, p, ip, length) == -1) {
+ nd_print_trunc(ndo);
+ return (caplen + SLIP_HDRLEN);
+ }
- if (caplen < 1 || length < 1) {
- ND_PRINT("%s", tstr);
+ if (caplen < 1) {
+ nd_print_trunc(ndo);
return (caplen + SLIP_HDRLEN);
}
u_int length = h->len;
const struct ip *ip;
+ ndo->ndo_protocol = "sl_bsdos_if";
if (caplen < SLIP_HDRLEN) {
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
return (caplen);
}
return (SLIP_HDRLEN);
}
-static void
+static int
sliplink_print(netdissect_options *ndo,
const u_char *p, const struct ip *ip,
u_int length)
int dir;
u_int hlen;
- dir = EXTRACT_U_1(p + SLX_DIR);
+ dir = GET_U_1(p + SLX_DIR);
switch (dir) {
case SLIPDIR_IN:
dir = -1;
break;
}
- if (ndo->ndo_nflag) {
- /* XXX just dump the header */
- int i;
-
- for (i = SLX_CHDR; i < SLX_CHDR + CHDR_LEN - 1; ++i)
- ND_PRINT("%02x.", EXTRACT_U_1(p + i));
- ND_PRINT("%02x: ", EXTRACT_U_1(p + SLX_CHDR + CHDR_LEN - 1));
- return;
- }
- switch (EXTRACT_U_1(p + SLX_CHDR) & 0xf0) {
+ switch (GET_U_1(p + SLX_CHDR) & 0xf0) {
case TYPE_IP:
ND_PRINT("ip %u: ", length + SLIP_HDRLEN);
* Get it from the link layer since sl_uncompress_tcp()
* has restored the IP header copy to IPPROTO_TCP.
*/
- lastconn = EXTRACT_U_1(((const struct ip *)(p + SLX_CHDR))->ip_p);
+ lastconn = GET_U_1(((const struct ip *)(p + SLX_CHDR))->ip_p);
ND_PRINT("utcp %u: ", lastconn);
if (dir == -1) {
/* Direction is bogus, don't use it */
- return;
+ return 0;
}
+ 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;
+ return 0;
}
- if (EXTRACT_U_1(p + SLX_CHDR) & TYPE_COMPRESSED_TCP) {
- compressed_sl_print(ndo, p + SLX_CHDR, ip,
- length, dir);
+ if (GET_U_1(p + SLX_CHDR) & TYPE_COMPRESSED_TCP) {
+ if (compressed_sl_print(ndo, p + SLX_CHDR, ip,
+ length, dir) == -1)
+ goto trunc;
ND_PRINT(": ");
} else
- ND_PRINT("slip-%u!: ", EXTRACT_U_1(p + SLX_CHDR));
+ ND_PRINT("slip-%u!: ", GET_U_1(p + SLX_CHDR));
}
+ return 0;
+trunc:
+ return -1;
}
static const u_char *
{
u_int i;
- if ((i = EXTRACT_U_1(cp)) == 0) {
+ if ((i = GET_U_1(cp)) == 0) {
cp++;
- i = EXTRACT_BE_U_2(cp);
+ i = GET_BE_U_2(cp);
cp += 2;
}
ND_PRINT(" %s%u", str, i);
print_sl_winchange(netdissect_options *ndo,
const u_char *cp)
{
- u_short i;
+ int16_t i;
- if ((i = EXTRACT_U_1(cp)) == 0) {
+ if ((i = GET_U_1(cp)) == 0) {
cp++;
- i = EXTRACT_BE_U_2(cp);
+ i = GET_BE_S_2(cp);
cp += 2;
}
if (i >= 0)
- ND_PRINT(" W+%u", i);
+ ND_PRINT(" W+%d", i);
else
- ND_PRINT(" W%u", i);
+ ND_PRINT(" W%d", i);
return (cp);
}
-static void
+static int
compressed_sl_print(netdissect_options *ndo,
const u_char *chdr, const struct ip *ip,
u_int length, int dir)
const u_char *cp = chdr;
u_int flags, hlen;
- flags = EXTRACT_U_1(cp);
+ flags = GET_U_1(cp);
cp++;
if (flags & NEW_C) {
- lastconn = EXTRACT_U_1(cp);
+ lastconn = GET_U_1(cp);
cp++;
ND_PRINT("ctcp %u", lastconn);
} else
* '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;
}