X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/38700c7f24646dfbc6ac0ed529d3ed727c545cd0..d7b497cac78b6e22a66a6bae9bdec60a8044f67a:/print-aoe.c diff --git a/print-aoe.c b/print-aoe.c index a1dfc66b..75a67342 100644 --- a/print-aoe.c +++ b/print-aoe.c @@ -1,8 +1,4 @@ /* - * This module implements decoding of the ATA over Ethernet (AoE) protocol - * according to the following specification: - * http://support.coraid.com/documents/AoEr11.txt - * * Copyright (c) 2014 The TCPDUMP project * All rights reserved. * @@ -29,19 +25,22 @@ * POSSIBILITY OF SUCH DAMAGE. */ +/* \summary: ATA over Ethernet (AoE) protocol printer */ + +/* specification: http://brantleycoilecompany.com/AoEr11.pdf */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include +#include -#include "interface.h" +#include "netdissect.h" #include "extract.h" #include "addrtoname.h" #include "ether.h" static const char tstr[] = " [|aoe]"; -static const char cstr[] = " (corrupt)"; #define AOE_V1 1 #define ATA_SECTOR_SIZE 512 @@ -147,57 +146,57 @@ aoev1_issue_print(netdissect_options *ndo, const u_char *ep = cp + len; if (len < AOEV1_ISSUE_ARG_LEN) - goto corrupt; + goto invalid; /* AFlags */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, "\n\tAFlags: [%s]", bittok2str(aoev1_aflag_str, "none", *cp))); + ND_TCHECK_1(cp); + ND_PRINT((ndo, "\n\tAFlags: [%s]", bittok2str(aoev1_aflag_str, "none", EXTRACT_U_1(cp)))); cp += 1; /* Err/Feature */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", Err/Feature: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", Err/Feature: %u", EXTRACT_U_1(cp))); cp += 1; /* Sector Count (not correlated with the length) */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", Sector Count: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", Sector Count: %u", EXTRACT_U_1(cp))); cp += 1; /* Cmd/Status */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", Cmd/Status: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", Cmd/Status: %u", EXTRACT_U_1(cp))); cp += 1; /* lba0 */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, "\n\tlba0: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, "\n\tlba0: %u", EXTRACT_U_1(cp))); cp += 1; /* lba1 */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", lba1: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", lba1: %u", EXTRACT_U_1(cp))); cp += 1; /* lba2 */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", lba2: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", lba2: %u", EXTRACT_U_1(cp))); cp += 1; /* lba3 */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", lba3: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", lba3: %u", EXTRACT_U_1(cp))); cp += 1; /* lba4 */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", lba4: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", lba4: %u", EXTRACT_U_1(cp))); cp += 1; /* lba5 */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", lba5: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", lba5: %u", EXTRACT_U_1(cp))); cp += 1; /* Reserved */ - ND_TCHECK2(*cp, 2); + ND_TCHECK_2(cp); cp += 2; /* Data */ if (len > AOEV1_ISSUE_ARG_LEN) ND_PRINT((ndo, "\n\tData: %u bytes", len - AOEV1_ISSUE_ARG_LEN)); return; -corrupt: - ND_PRINT((ndo, "%s", cstr)); +invalid: + ND_PRINT((ndo, "%s", istr)); ND_TCHECK2(*cp, ep - cp); return; trunc: @@ -212,30 +211,30 @@ aoev1_query_print(netdissect_options *ndo, uint16_t cslen; if (len < AOEV1_QUERY_ARG_LEN) - goto corrupt; + goto invalid; /* Buffer Count */ - ND_TCHECK2(*cp, 2); - ND_PRINT((ndo, "\n\tBuffer Count: %u", EXTRACT_16BITS(cp))); + ND_TCHECK_2(cp); + ND_PRINT((ndo, "\n\tBuffer Count: %u", EXTRACT_BE_U_2(cp))); cp += 2; /* Firmware Version */ - ND_TCHECK2(*cp, 2); - ND_PRINT((ndo, ", Firmware Version: %u", EXTRACT_16BITS(cp))); + ND_TCHECK_2(cp); + ND_PRINT((ndo, ", Firmware Version: %u", EXTRACT_BE_U_2(cp))); cp += 2; /* Sector Count */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", Sector Count: %u", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", Sector Count: %u", EXTRACT_U_1(cp))); cp += 1; /* AoE/CCmd */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", AoE: %u, CCmd: %s", (*cp & 0xF0) >> 4, - tok2str(aoev1_ccmd_str, "Unknown (0x02x)", *cp & 0x0F))); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", AoE: %u, CCmd: %s", (EXTRACT_U_1(cp) & 0xF0) >> 4, + tok2str(aoev1_ccmd_str, "Unknown (0x02x)", EXTRACT_U_1(cp) & 0x0F))); cp += 1; /* Config String Length */ - ND_TCHECK2(*cp, 2); - cslen = EXTRACT_16BITS(cp); + ND_TCHECK_2(cp); + cslen = EXTRACT_BE_U_2(cp); cp += 2; if (cslen > AOEV1_MAX_CONFSTR_LEN || AOEV1_QUERY_ARG_LEN + cslen > len) - goto corrupt; + goto invalid; /* Config String */ ND_TCHECK2(*cp, cslen); if (cslen) { @@ -245,8 +244,8 @@ aoev1_query_print(netdissect_options *ndo, } return; -corrupt: - ND_PRINT((ndo, "%s", cstr)); +invalid: + ND_PRINT((ndo, "%s", istr)); ND_TCHECK2(*cp, ep - cp); return; trunc: @@ -261,33 +260,33 @@ aoev1_mac_print(netdissect_options *ndo, uint8_t dircount, i; if (len < AOEV1_MAC_ARG_LEN) - goto corrupt; + goto invalid; /* Reserved */ - ND_TCHECK2(*cp, 1); + ND_TCHECK_1(cp); cp += 1; /* MCmd */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, "\n\tMCmd: %s", tok2str(aoev1_mcmd_str, "Unknown (0x%02x)", *cp))); + ND_TCHECK_1(cp); + ND_PRINT((ndo, "\n\tMCmd: %s", tok2str(aoev1_mcmd_str, "Unknown (0x%02x)", EXTRACT_U_1(cp)))); cp += 1; /* MError */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", MError: %s", tok2str(aoev1_merror_str, "Unknown (0x%02x)", *cp))); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", MError: %s", tok2str(aoev1_merror_str, "Unknown (0x%02x)", EXTRACT_U_1(cp)))); cp += 1; /* Dir Count */ - ND_TCHECK2(*cp, 1); + ND_TCHECK_1(cp); dircount = *cp; cp += 1; ND_PRINT((ndo, ", Dir Count: %u", dircount)); if (AOEV1_MAC_ARG_LEN + dircount * 8 > len) - goto corrupt; + goto invalid; /* directives */ for (i = 0; i < dircount; i++) { /* Reserved */ - ND_TCHECK2(*cp, 1); + ND_TCHECK_1(cp); cp += 1; /* DCmd */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, "\n\t DCmd: %s", tok2str(aoev1_dcmd_str, "Unknown (0x%02x)", *cp))); + ND_TCHECK_1(cp); + ND_PRINT((ndo, "\n\t DCmd: %s", tok2str(aoev1_dcmd_str, "Unknown (0x%02x)", EXTRACT_U_1(cp)))); cp += 1; /* Ethernet Address */ ND_TCHECK2(*cp, ETHER_ADDR_LEN); @@ -296,8 +295,8 @@ aoev1_mac_print(netdissect_options *ndo, } return; -corrupt: - ND_PRINT((ndo, "%s", cstr)); +invalid: + ND_PRINT((ndo, "%s", istr)); ND_TCHECK2(*cp, ep - cp); return; trunc: @@ -312,18 +311,18 @@ aoev1_reserve_print(netdissect_options *ndo, uint8_t nmacs, i; if (len < AOEV1_RESERVE_ARG_LEN || (len - AOEV1_RESERVE_ARG_LEN) % ETHER_ADDR_LEN) - goto corrupt; + goto invalid; /* RCmd */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, "\n\tRCmd: %s", tok2str(aoev1_rcmd_str, "Unknown (0x%02x)", *cp))); + ND_TCHECK_1(cp); + ND_PRINT((ndo, "\n\tRCmd: %s", tok2str(aoev1_rcmd_str, "Unknown (0x%02x)", EXTRACT_U_1(cp)))); cp += 1; /* NMacs (correlated with the length) */ - ND_TCHECK2(*cp, 1); + ND_TCHECK_1(cp); nmacs = *cp; cp += 1; ND_PRINT((ndo, ", NMacs: %u", nmacs)); if (AOEV1_RESERVE_ARG_LEN + nmacs * ETHER_ADDR_LEN != len) - goto corrupt; + goto invalid; /* addresses */ for (i = 0; i < nmacs; i++) { ND_PRINT((ndo, "\n\tEthernet Address %u: %s", i, etheraddr_string(ndo, cp))); @@ -331,8 +330,8 @@ aoev1_reserve_print(netdissect_options *ndo, } return; -corrupt: - ND_PRINT((ndo, "%s", cstr)); +invalid: + ND_PRINT((ndo, "%s", istr)); ND_TCHECK2(*cp, ep - cp); return; trunc: @@ -349,34 +348,34 @@ aoev1_print(netdissect_options *ndo, void (*cmd_decoder)(netdissect_options *, const u_char *, const u_int); if (len < AOEV1_COMMON_HDR_LEN) - goto corrupt; + goto invalid; /* Flags */ - flags = *cp & 0x0F; + flags = EXTRACT_U_1(cp) & 0x0F; ND_PRINT((ndo, ", Flags: [%s]", bittok2str(aoev1_flag_str, "none", flags))); cp += 1; if (! ndo->ndo_vflag) return; /* Error */ - ND_TCHECK2(*cp, 1); + ND_TCHECK_1(cp); if (flags & AOEV1_FLAG_E) - ND_PRINT((ndo, "\n\tError: %s", tok2str(aoev1_errcode_str, "Invalid (%u)", *cp))); + ND_PRINT((ndo, "\n\tError: %s", tok2str(aoev1_errcode_str, "Invalid (%u)", EXTRACT_U_1(cp)))); cp += 1; /* Major */ - ND_TCHECK2(*cp, 2); - ND_PRINT((ndo, "\n\tMajor: 0x%04x", EXTRACT_16BITS(cp))); + ND_TCHECK_2(cp); + ND_PRINT((ndo, "\n\tMajor: 0x%04x", EXTRACT_BE_U_2(cp))); cp += 2; /* Minor */ - ND_TCHECK2(*cp, 1); - ND_PRINT((ndo, ", Minor: 0x%02x", *cp)); + ND_TCHECK_1(cp); + ND_PRINT((ndo, ", Minor: 0x%02x", EXTRACT_U_1(cp))); cp += 1; /* Command */ - ND_TCHECK2(*cp, 1); + ND_TCHECK_1(cp); command = *cp; cp += 1; ND_PRINT((ndo, ", Command: %s", tok2str(cmdcode_str, "Unknown (0x%02x)", command))); /* Tag */ - ND_TCHECK2(*cp, 4); - ND_PRINT((ndo, ", Tag: 0x%08x", EXTRACT_32BITS(cp))); + ND_TCHECK_4(cp); + ND_PRINT((ndo, ", Tag: 0x%08x", EXTRACT_BE_U_4(cp))); cp += 4; /* Arg */ cmd_decoder = @@ -389,8 +388,8 @@ aoev1_print(netdissect_options *ndo, cmd_decoder(ndo, cp, len - AOEV1_COMMON_HDR_LEN); return; -corrupt: - ND_PRINT((ndo, "%s", cstr)); +invalid: + ND_PRINT((ndo, "%s", istr)); ND_TCHECK2(*cp, ep - cp); return; trunc: @@ -407,10 +406,10 @@ aoe_print(netdissect_options *ndo, ND_PRINT((ndo, "AoE length %u", len)); if (len < 1) - goto corrupt; + goto invalid; /* Ver/Flags */ - ND_TCHECK2(*cp, 1); - ver = (*cp & 0xF0) >> 4; + ND_TCHECK_1(cp); + ver = (EXTRACT_U_1(cp) & 0xF0) >> 4; /* Don't advance cp yet: low order 4 bits are version-specific. */ ND_PRINT((ndo, ", Ver %u", ver)); @@ -421,8 +420,8 @@ aoe_print(netdissect_options *ndo, } return; -corrupt: - ND_PRINT((ndo, "%s", cstr)); +invalid: + ND_PRINT((ndo, "%s", istr)); ND_TCHECK2(*cp, ep - cp); return; trunc: