13c602fabSXin LI /* 23c602fabSXin LI * Copyright (c) 2014 The TCPDUMP project 33c602fabSXin LI * All rights reserved. 43c602fabSXin LI * 53c602fabSXin LI * Redistribution and use in source and binary forms, with or without 63c602fabSXin LI * modification, are permitted provided that the following conditions 73c602fabSXin LI * are met: 83c602fabSXin LI * 1. Redistributions of source code must retain the above copyright 93c602fabSXin LI * notice, this list of conditions and the following disclaimer. 103c602fabSXin LI * 2. Redistributions in binary form must reproduce the above copyright 113c602fabSXin LI * notice, this list of conditions and the following disclaimer in the 123c602fabSXin LI * documentation and/or other materials provided with the distribution. 133c602fabSXin LI * 143c602fabSXin LI * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 153c602fabSXin LI * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 163c602fabSXin LI * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 173c602fabSXin LI * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 183c602fabSXin LI * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 193c602fabSXin LI * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 203c602fabSXin LI * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 213c602fabSXin LI * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 223c602fabSXin LI * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 233c602fabSXin LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 243c602fabSXin LI * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 253c602fabSXin LI * POSSIBILITY OF SUCH DAMAGE. 263c602fabSXin LI */ 273c602fabSXin LI 283340d773SGleb Smirnoff /* \summary: Loopback Protocol printer */ 293340d773SGleb Smirnoff 303340d773SGleb Smirnoff /* 313340d773SGleb Smirnoff * originally defined as the Ethernet Configuration Testing Protocol. 32*0a7e5f1fSJoseph Mingrone * specification: 33*0a7e5f1fSJoseph Mingrone * https://web.archive.org/web/20060919181108/http://www.mit.edu/people/jhawk/ctp.pdf 343340d773SGleb Smirnoff */ 353340d773SGleb Smirnoff 36ee67461eSJoseph Mingrone #include <config.h> 373c602fabSXin LI 38ee67461eSJoseph Mingrone #include "netdissect-stdinc.h" 393c602fabSXin LI 40ee67461eSJoseph Mingrone #define ND_LONGJMP_FROM_TCHECK 413340d773SGleb Smirnoff #include "netdissect.h" 423c602fabSXin LI #include "extract.h" 433c602fabSXin LI #include "addrtoname.h" 443c602fabSXin LI 453c602fabSXin LI 463c602fabSXin LI #define LOOPBACK_REPLY 1 473c602fabSXin LI #define LOOPBACK_FWDDATA 2 483c602fabSXin LI 493c602fabSXin LI static const struct tok fcode_str[] = { 503c602fabSXin LI { LOOPBACK_REPLY, "Reply" }, 513c602fabSXin LI { LOOPBACK_FWDDATA, "Forward Data" }, 523c602fabSXin LI { 0, NULL } 533c602fabSXin LI }; 543c602fabSXin LI 553c602fabSXin LI static void 56ee67461eSJoseph Mingrone loopback_message_print(netdissect_options *ndo, 57ee67461eSJoseph Mingrone const u_char *cp, u_int len) 583c602fabSXin LI { 593c602fabSXin LI uint16_t function; 603c602fabSXin LI 613c602fabSXin LI if (len < 2) 623340d773SGleb Smirnoff goto invalid; 633c602fabSXin LI /* function */ 64ee67461eSJoseph Mingrone function = GET_LE_U_2(cp); 653c602fabSXin LI cp += 2; 66ee67461eSJoseph Mingrone len -= 2; 67ee67461eSJoseph Mingrone ND_PRINT(", %s", tok2str(fcode_str, " invalid (%u)", function)); 683c602fabSXin LI 693c602fabSXin LI switch (function) { 703c602fabSXin LI case LOOPBACK_REPLY: 71ee67461eSJoseph Mingrone if (len < 2) 723340d773SGleb Smirnoff goto invalid; 733c602fabSXin LI /* receipt number */ 74ee67461eSJoseph Mingrone ND_PRINT(", receipt number %u", GET_LE_U_2(cp)); 753c602fabSXin LI cp += 2; 76ee67461eSJoseph Mingrone len -= 2; 773c602fabSXin LI /* data */ 78ee67461eSJoseph Mingrone ND_PRINT(", data (%u octets)", len); 79ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, len); 803c602fabSXin LI break; 813c602fabSXin LI case LOOPBACK_FWDDATA: 82ee67461eSJoseph Mingrone if (len < MAC_ADDR_LEN) 833340d773SGleb Smirnoff goto invalid; 843c602fabSXin LI /* forwarding address */ 85ee67461eSJoseph Mingrone ND_PRINT(", forwarding address %s", GET_ETHERADDR_STRING(cp)); 86ee67461eSJoseph Mingrone cp += MAC_ADDR_LEN; 87ee67461eSJoseph Mingrone len -= MAC_ADDR_LEN; 883c602fabSXin LI /* data */ 89ee67461eSJoseph Mingrone ND_PRINT(", data (%u octets)", len); 90ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, len); 913c602fabSXin LI break; 923c602fabSXin LI default: 93ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, len); 943c602fabSXin LI break; 953c602fabSXin LI } 963c602fabSXin LI return; 973c602fabSXin LI 983340d773SGleb Smirnoff invalid: 99ee67461eSJoseph Mingrone nd_print_invalid(ndo); 100ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, len); 1013c602fabSXin LI } 1023c602fabSXin LI 1033c602fabSXin LI void 104ee67461eSJoseph Mingrone loopback_print(netdissect_options *ndo, 105ee67461eSJoseph Mingrone const u_char *cp, u_int len) 1063c602fabSXin LI { 1073c602fabSXin LI uint16_t skipCount; 1083c602fabSXin LI 109ee67461eSJoseph Mingrone ndo->ndo_protocol = "loopback"; 110ee67461eSJoseph Mingrone ND_PRINT("Loopback"); 1113c602fabSXin LI if (len < 2) 1123340d773SGleb Smirnoff goto invalid; 1133c602fabSXin LI /* skipCount */ 114ee67461eSJoseph Mingrone skipCount = GET_LE_U_2(cp); 1153c602fabSXin LI cp += 2; 116ee67461eSJoseph Mingrone len -= 2; 117ee67461eSJoseph Mingrone ND_PRINT(", skipCount %u", skipCount); 1183c602fabSXin LI if (skipCount % 8) 119ee67461eSJoseph Mingrone ND_PRINT(" (bogus)"); 120ee67461eSJoseph Mingrone if (skipCount > len) 1213340d773SGleb Smirnoff goto invalid; 122ee67461eSJoseph Mingrone /* the octets to skip */ 123ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, skipCount); 124ee67461eSJoseph Mingrone cp += skipCount; 125ee67461eSJoseph Mingrone len -= skipCount; 126ee67461eSJoseph Mingrone /* the first message to decode */ 127ee67461eSJoseph Mingrone loopback_message_print(ndo, cp, len); 1283c602fabSXin LI return; 1293c602fabSXin LI 1303340d773SGleb Smirnoff invalid: 131ee67461eSJoseph Mingrone nd_print_invalid(ndo); 132ee67461eSJoseph Mingrone ND_TCHECK_LEN(cp, len); 1333c602fabSXin LI } 1343c602fabSXin LI 135