X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/1fe6e66ecec3fb7a7cc729038012cbb264542331..7780402e9f67ffe6b98274f16277c8db00d3a95f:/print-loopback.c diff --git a/print-loopback.c b/print-loopback.c index c0297b8d..e0c6efbd 100644 --- a/print-loopback.c +++ b/print-loopback.c @@ -1,9 +1,4 @@ /* - * This module implements decoding of the the Loopback Protocol, originally - * defined as the Configuration Testing Protocol. It is based on the following - * specification: - * http://www.mit.edu/people/jhawk/ctp.pdf - * * Copyright (c) 2014 The TCPDUMP project * All rights reserved. * @@ -30,20 +25,24 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#define NETDISSECT_REWORKED +/* \summary: Loopback Protocol printer */ + +/* + * originally defined as the Ethernet Configuration Testing Protocol. + * specification: http://www.mit.edu/people/jhawk/ctp.pdf + */ + #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif -#include +#include "netdissect-stdinc.h" -#include "interface.h" +#include "netdissect.h" #include "extract.h" -#include "ether.h" #include "addrtoname.h" static const char tstr[] = " [|loopback]"; -static const char cstr[] = " (corrupt)"; #define LOOPBACK_REPLY 1 #define LOOPBACK_FWDDATA 2 @@ -61,48 +60,48 @@ loopback_message_print(netdissect_options *ndo, const u_char *cp, const u_int le uint16_t function; if (len < 2) - goto corrupt; + goto invalid; /* function */ - ND_TCHECK2(*cp, 2); - function = EXTRACT_LE_16BITS(cp); + ND_TCHECK_2(cp); + function = EXTRACT_LE_U_2(cp); cp += 2; - ND_PRINT((ndo, ", %s", tok2str(fcode_str, " invalid (%u)", function))); + ND_PRINT(", %s", tok2str(fcode_str, " invalid (%u)", function)); switch (function) { case LOOPBACK_REPLY: if (len < 4) - goto corrupt; + goto invalid; /* receipt number */ - ND_TCHECK2(*cp, 2); - ND_PRINT((ndo, ", receipt number %u", EXTRACT_LE_16BITS(cp))); + ND_TCHECK_2(cp); + ND_PRINT(", receipt number %u", EXTRACT_LE_U_2(cp)); cp += 2; /* data */ - ND_PRINT((ndo, ", data (%u octets)", len - 4)); - ND_TCHECK2(*cp, len - 4); + ND_PRINT(", data (%u octets)", len - 4); + ND_TCHECK_LEN(cp, len - 4); break; case LOOPBACK_FWDDATA: if (len < 8) - goto corrupt; + goto invalid; /* forwarding address */ - ND_TCHECK2(*cp, ETHER_ADDR_LEN); - ND_PRINT((ndo, ", forwarding address %s", etheraddr_string(cp))); - cp += ETHER_ADDR_LEN; + ND_TCHECK_LEN(cp, MAC_ADDR_LEN); + ND_PRINT(", forwarding address %s", etheraddr_string(ndo, cp)); + cp += MAC_ADDR_LEN; /* data */ - ND_PRINT((ndo, ", data (%u octets)", len - 8)); - ND_TCHECK2(*cp, len - 8); + ND_PRINT(", data (%u octets)", len - 8); + ND_TCHECK_LEN(cp, len - 8); break; default: - ND_TCHECK2(*cp, len - 2); + ND_TCHECK_LEN(cp, len - 2); break; } return; -corrupt: - ND_PRINT((ndo, "%s", cstr)); - ND_TCHECK2(*cp, ep - cp); +invalid: + ND_PRINT("%s", istr); + ND_TCHECK_LEN(cp, ep - cp); return; trunc: - ND_PRINT((ndo, "%s", tstr)); + ND_PRINT("%s", tstr); } void @@ -111,26 +110,26 @@ loopback_print(netdissect_options *ndo, const u_char *cp, const u_int len) const u_char *ep = cp + len; uint16_t skipCount; - ND_PRINT((ndo, "Loopback")); + ND_PRINT("Loopback"); if (len < 2) - goto corrupt; + goto invalid; /* skipCount */ - ND_TCHECK2(*cp, 2); - skipCount = EXTRACT_LE_16BITS(cp); + ND_TCHECK_2(cp); + skipCount = EXTRACT_LE_U_2(cp); cp += 2; - ND_PRINT((ndo, ", skipCount %u", skipCount)); + ND_PRINT(", skipCount %u", skipCount); if (skipCount % 8) - ND_PRINT((ndo, " (bogus)")); + ND_PRINT(" (bogus)"); if (skipCount > len - 2) - goto corrupt; + goto invalid; loopback_message_print(ndo, cp + skipCount, len - 2 - skipCount); return; -corrupt: - ND_PRINT((ndo, "%s", cstr)); - ND_TCHECK2(*cp, ep - cp); +invalid: + ND_PRINT("%s", istr); + ND_TCHECK_LEN(cp, ep - cp); return; trunc: - ND_PRINT((ndo, "%s", tstr)); + ND_PRINT("%s", tstr); }