#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);
-u_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 = "sl_if";
- if (caplen < SLIP_HDRLEN) {
- nd_print_trunc(ndo);
- return (caplen);
- }
+ ndo->ndo_protocol = "slip";
+ 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 (caplen + SLIP_HDRLEN);
- }
-
- if (caplen < 1) {
- nd_print_trunc(ndo);
- return (caplen + SLIP_HDRLEN);
- }
+ sliplink_print(ndo, p, ip, length);
switch (IP_V(ip)) {
case 4:
default:
ND_PRINT("ip v%u", IP_V(ip));
}
-
- return (SLIP_HDRLEN);
}
-u_int
+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 = "sl_bsdos_if";
- if (caplen < SLIP_HDRLEN) {
- nd_print_trunc(ndo);
- return (caplen);
- }
+ ndo->ndo_protocol = "slip_bsdos";
+ 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 (SLIP_HDRLEN);
}
-static int
+static void
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;
}
- 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 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 (EXTRACT_U_1(p + SLX_CHDR) & TYPE_COMPRESSED_TCP) {
- if (compressed_sl_print(ndo, p + SLX_CHDR, ip,
- length, dir) == -1)
- goto trunc;
+ if (GET_U_1(p + SLX_CHDR) & TYPE_COMPRESSED_TCP) {
+ compressed_sl_print(ndo, p + SLX_CHDR, ip, length, dir);
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);
{
int16_t i;
- if ((i = EXTRACT_U_1(cp)) == 0) {
+ if ((i = GET_U_1(cp)) == 0) {
cp++;
- i = EXTRACT_BE_S_2(cp);
+ i = GET_BE_S_2(cp);
cp += 2;
}
if (i >= 0)
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)
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;
}