X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/55f499c9eb6d645d7a1e7ac14931123a1f1918e2..a63600a1fc28dbc7ae7ce9f996829c49a25fb33c:/print-sl.c?ds=inline diff --git a/print-sl.c b/print-sl.c index e9b82fa2..88f9fb02 100644 --- a/print-sl.c +++ b/print-sl.c @@ -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 @@ -51,38 +51,26 @@ 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: @@ -94,23 +82,18 @@ sl_if_print(netdissect_options *ndo, 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; @@ -122,11 +105,9 @@ sl_bsdos_if_print(netdissect_options *ndo, #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) @@ -134,7 +115,7 @@ sliplink_print(netdissect_options *ndo, int dir; u_int hlen; - dir = EXTRACT_U_1(p + SLX_DIR); + dir = GET_U_1(p + SLX_DIR); switch (dir) { case SLIPDIR_IN: @@ -150,7 +131,7 @@ sliplink_print(netdissect_options *ndo, 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); @@ -162,15 +143,13 @@ sliplink_print(netdissect_options *ndo, * 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; @@ -178,19 +157,14 @@ sliplink_print(netdissect_options *ndo, 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 * @@ -199,9 +173,9 @@ print_sl_change(netdissect_options *ndo, { 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); @@ -214,9 +188,9 @@ print_sl_winchange(netdissect_options *ndo, { 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) @@ -226,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) @@ -234,10 +208,10 @@ compressed_sl_print(netdissect_options *ndo, 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 @@ -274,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; }