13c602fabSXin LI /* 23c602fabSXin LI * Copyright (c) 2013 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 28*3340d773SGleb Smirnoff /* \summary: Ad Hoc Configuration Protocol (AHCP) printer */ 29*3340d773SGleb Smirnoff 30*3340d773SGleb Smirnoff /* Based on draft-chroboczek-ahcp-00 and source code of ahcpd-0.53 */ 31*3340d773SGleb Smirnoff 323c602fabSXin LI #ifdef HAVE_CONFIG_H 333c602fabSXin LI #include "config.h" 343c602fabSXin LI #endif 353c602fabSXin LI 36*3340d773SGleb Smirnoff #include <netdissect-stdinc.h> 373c602fabSXin LI 38*3340d773SGleb Smirnoff #include "netdissect.h" 393c602fabSXin LI #include "extract.h" 403c602fabSXin LI #include "addrtoname.h" 413c602fabSXin LI 423c602fabSXin LI static const char tstr[] = " [|ahcp]"; 433c602fabSXin LI 443c602fabSXin LI #define AHCP_MAGIC_NUMBER 43 453c602fabSXin LI #define AHCP_VERSION_1 1 463c602fabSXin LI #define AHCP1_HEADER_FIX_LEN 24 473c602fabSXin LI #define AHCP1_BODY_MIN_LEN 4 483c602fabSXin LI 493c602fabSXin LI #define AHCP1_MSG_DISCOVER 0 503c602fabSXin LI #define AHCP1_MSG_OFFER 1 513c602fabSXin LI #define AHCP1_MSG_REQUEST 2 523c602fabSXin LI #define AHCP1_MSG_ACK 3 533c602fabSXin LI #define AHCP1_MSG_NACK 4 543c602fabSXin LI #define AHCP1_MSG_RELEASE 5 553c602fabSXin LI 563c602fabSXin LI static const struct tok ahcp1_msg_str[] = { 573c602fabSXin LI { AHCP1_MSG_DISCOVER, "Discover" }, 583c602fabSXin LI { AHCP1_MSG_OFFER, "Offer" }, 593c602fabSXin LI { AHCP1_MSG_REQUEST, "Request" }, 603c602fabSXin LI { AHCP1_MSG_ACK, "Ack" }, 613c602fabSXin LI { AHCP1_MSG_NACK, "Nack" }, 623c602fabSXin LI { AHCP1_MSG_RELEASE, "Release" }, 633c602fabSXin LI { 0, NULL } 643c602fabSXin LI }; 653c602fabSXin LI 663c602fabSXin LI #define AHCP1_OPT_PAD 0 673c602fabSXin LI #define AHCP1_OPT_MANDATORY 1 683c602fabSXin LI #define AHCP1_OPT_ORIGIN_TIME 2 693c602fabSXin LI #define AHCP1_OPT_EXPIRES 3 703c602fabSXin LI #define AHCP1_OPT_MY_IPV6_ADDRESS 4 713c602fabSXin LI #define AHCP1_OPT_MY_IPV4_ADDRESS 5 723c602fabSXin LI #define AHCP1_OPT_IPV6_PREFIX 6 733c602fabSXin LI #define AHCP1_OPT_IPV4_PREFIX 7 743c602fabSXin LI #define AHCP1_OPT_IPV6_ADDRESS 8 753c602fabSXin LI #define AHCP1_OPT_IPV4_ADDRESS 9 763c602fabSXin LI #define AHCP1_OPT_IPV6_PREFIX_DELEGATION 10 773c602fabSXin LI #define AHCP1_OPT_IPV4_PREFIX_DELEGATION 11 783c602fabSXin LI #define AHCP1_OPT_NAME_SERVER 12 793c602fabSXin LI #define AHCP1_OPT_NTP_SERVER 13 803c602fabSXin LI #define AHCP1_OPT_MAX 13 813c602fabSXin LI 823c602fabSXin LI static const struct tok ahcp1_opt_str[] = { 833c602fabSXin LI { AHCP1_OPT_PAD, "Pad" }, 843c602fabSXin LI { AHCP1_OPT_MANDATORY, "Mandatory" }, 853c602fabSXin LI { AHCP1_OPT_ORIGIN_TIME, "Origin Time" }, 863c602fabSXin LI { AHCP1_OPT_EXPIRES, "Expires" }, 873c602fabSXin LI { AHCP1_OPT_MY_IPV6_ADDRESS, "My-IPv6-Address" }, 883c602fabSXin LI { AHCP1_OPT_MY_IPV4_ADDRESS, "My-IPv4-Address" }, 893c602fabSXin LI { AHCP1_OPT_IPV6_PREFIX, "IPv6 Prefix" }, 903c602fabSXin LI { AHCP1_OPT_IPV4_PREFIX, "IPv4 Prefix" }, 913c602fabSXin LI { AHCP1_OPT_IPV6_ADDRESS, "IPv6 Address" }, 923c602fabSXin LI { AHCP1_OPT_IPV4_ADDRESS, "IPv4 Address" }, 933c602fabSXin LI { AHCP1_OPT_IPV6_PREFIX_DELEGATION, "IPv6 Prefix Delegation" }, 943c602fabSXin LI { AHCP1_OPT_IPV4_PREFIX_DELEGATION, "IPv4 Prefix Delegation" }, 953c602fabSXin LI { AHCP1_OPT_NAME_SERVER, "Name Server" }, 963c602fabSXin LI { AHCP1_OPT_NTP_SERVER, "NTP Server" }, 973c602fabSXin LI { 0, NULL } 983c602fabSXin LI }; 993c602fabSXin LI 1003c602fabSXin LI static int 1018bdc5a62SPatrick Kelsey ahcp_time_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) 1028bdc5a62SPatrick Kelsey { 1033c602fabSXin LI time_t t; 1043c602fabSXin LI struct tm *tm; 1053c602fabSXin LI char buf[BUFSIZE]; 1063c602fabSXin LI 1073c602fabSXin LI if (cp + 4 != ep) 108*3340d773SGleb Smirnoff goto invalid; 1093c602fabSXin LI ND_TCHECK2(*cp, 4); 1103c602fabSXin LI t = EXTRACT_32BITS(cp); 1113c602fabSXin LI if (NULL == (tm = gmtime(&t))) 1123c602fabSXin LI ND_PRINT((ndo, ": gmtime() error")); 1133c602fabSXin LI else if (0 == strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm)) 1143c602fabSXin LI ND_PRINT((ndo, ": strftime() error")); 1153c602fabSXin LI else 1163c602fabSXin LI ND_PRINT((ndo, ": %s UTC", buf)); 1173c602fabSXin LI return 0; 1183c602fabSXin LI 119*3340d773SGleb Smirnoff invalid: 120*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 1213c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 1223c602fabSXin LI return 0; 1233c602fabSXin LI trunc: 1243c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 1253c602fabSXin LI return -1; 1263c602fabSXin LI } 1273c602fabSXin LI 1283c602fabSXin LI static int 1298bdc5a62SPatrick Kelsey ahcp_seconds_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) 1308bdc5a62SPatrick Kelsey { 1313c602fabSXin LI if (cp + 4 != ep) 132*3340d773SGleb Smirnoff goto invalid; 1333c602fabSXin LI ND_TCHECK2(*cp, 4); 1343c602fabSXin LI ND_PRINT((ndo, ": %us", EXTRACT_32BITS(cp))); 1353c602fabSXin LI return 0; 1363c602fabSXin LI 137*3340d773SGleb Smirnoff invalid: 138*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 1393c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 1403c602fabSXin LI return 0; 1413c602fabSXin LI trunc: 1423c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 1433c602fabSXin LI return -1; 1443c602fabSXin LI } 1453c602fabSXin LI 1463c602fabSXin LI static int 1478bdc5a62SPatrick Kelsey ahcp_ipv6_addresses_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) 1488bdc5a62SPatrick Kelsey { 1493c602fabSXin LI const char *sep = ": "; 1503c602fabSXin LI 1513c602fabSXin LI while (cp < ep) { 1523c602fabSXin LI if (cp + 16 > ep) 153*3340d773SGleb Smirnoff goto invalid; 1543c602fabSXin LI ND_TCHECK2(*cp, 16); 1553c602fabSXin LI ND_PRINT((ndo, "%s%s", sep, ip6addr_string(ndo, cp))); 1563c602fabSXin LI cp += 16; 1573c602fabSXin LI sep = ", "; 1583c602fabSXin LI } 1593c602fabSXin LI return 0; 1603c602fabSXin LI 161*3340d773SGleb Smirnoff invalid: 162*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 1633c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 1643c602fabSXin LI return 0; 1653c602fabSXin LI trunc: 1663c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 1673c602fabSXin LI return -1; 1683c602fabSXin LI } 1693c602fabSXin LI 1703c602fabSXin LI static int 1718bdc5a62SPatrick Kelsey ahcp_ipv4_addresses_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) 1728bdc5a62SPatrick Kelsey { 1733c602fabSXin LI const char *sep = ": "; 1743c602fabSXin LI 1753c602fabSXin LI while (cp < ep) { 1763c602fabSXin LI if (cp + 4 > ep) 177*3340d773SGleb Smirnoff goto invalid; 1783c602fabSXin LI ND_TCHECK2(*cp, 4); 1793c602fabSXin LI ND_PRINT((ndo, "%s%s", sep, ipaddr_string(ndo, cp))); 1803c602fabSXin LI cp += 4; 1813c602fabSXin LI sep = ", "; 1823c602fabSXin LI } 1833c602fabSXin LI return 0; 1843c602fabSXin LI 185*3340d773SGleb Smirnoff invalid: 186*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 1873c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 1883c602fabSXin LI return 0; 1893c602fabSXin LI trunc: 1903c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 1913c602fabSXin LI return -1; 1923c602fabSXin LI } 1933c602fabSXin LI 1943c602fabSXin LI static int 1958bdc5a62SPatrick Kelsey ahcp_ipv6_prefixes_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) 1968bdc5a62SPatrick Kelsey { 1973c602fabSXin LI const char *sep = ": "; 1983c602fabSXin LI 1993c602fabSXin LI while (cp < ep) { 2003c602fabSXin LI if (cp + 17 > ep) 201*3340d773SGleb Smirnoff goto invalid; 2023c602fabSXin LI ND_TCHECK2(*cp, 17); 2033c602fabSXin LI ND_PRINT((ndo, "%s%s/%u", sep, ip6addr_string(ndo, cp), *(cp + 16))); 2043c602fabSXin LI cp += 17; 2053c602fabSXin LI sep = ", "; 2063c602fabSXin LI } 2073c602fabSXin LI return 0; 2083c602fabSXin LI 209*3340d773SGleb Smirnoff invalid: 210*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 2113c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 2123c602fabSXin LI return 0; 2133c602fabSXin LI trunc: 2143c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 2153c602fabSXin LI return -1; 2163c602fabSXin LI } 2173c602fabSXin LI 2183c602fabSXin LI static int 2198bdc5a62SPatrick Kelsey ahcp_ipv4_prefixes_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) 2208bdc5a62SPatrick Kelsey { 2213c602fabSXin LI const char *sep = ": "; 2223c602fabSXin LI 2233c602fabSXin LI while (cp < ep) { 2243c602fabSXin LI if (cp + 5 > ep) 225*3340d773SGleb Smirnoff goto invalid; 2263c602fabSXin LI ND_TCHECK2(*cp, 5); 2273c602fabSXin LI ND_PRINT((ndo, "%s%s/%u", sep, ipaddr_string(ndo, cp), *(cp + 4))); 2283c602fabSXin LI cp += 5; 2293c602fabSXin LI sep = ", "; 2303c602fabSXin LI } 2313c602fabSXin LI return 0; 2323c602fabSXin LI 233*3340d773SGleb Smirnoff invalid: 234*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 2353c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 2363c602fabSXin LI return 0; 2373c602fabSXin LI trunc: 2383c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 2393c602fabSXin LI return -1; 2403c602fabSXin LI } 2413c602fabSXin LI 2423c602fabSXin LI /* Data decoders signal truncated data with -1. */ 2433c602fabSXin LI static int 2443c602fabSXin LI (* const data_decoders[AHCP1_OPT_MAX + 1])(netdissect_options *, const u_char *, const u_char *) = { 2453c602fabSXin LI /* [AHCP1_OPT_PAD] = */ NULL, 2463c602fabSXin LI /* [AHCP1_OPT_MANDATORY] = */ NULL, 2473c602fabSXin LI /* [AHCP1_OPT_ORIGIN_TIME] = */ ahcp_time_print, 2483c602fabSXin LI /* [AHCP1_OPT_EXPIRES] = */ ahcp_seconds_print, 2493c602fabSXin LI /* [AHCP1_OPT_MY_IPV6_ADDRESS] = */ ahcp_ipv6_addresses_print, 2503c602fabSXin LI /* [AHCP1_OPT_MY_IPV4_ADDRESS] = */ ahcp_ipv4_addresses_print, 2513c602fabSXin LI /* [AHCP1_OPT_IPV6_PREFIX] = */ ahcp_ipv6_prefixes_print, 2523c602fabSXin LI /* [AHCP1_OPT_IPV4_PREFIX] = */ NULL, 2533c602fabSXin LI /* [AHCP1_OPT_IPV6_ADDRESS] = */ ahcp_ipv6_addresses_print, 2543c602fabSXin LI /* [AHCP1_OPT_IPV4_ADDRESS] = */ ahcp_ipv4_addresses_print, 2553c602fabSXin LI /* [AHCP1_OPT_IPV6_PREFIX_DELEGATION] = */ ahcp_ipv6_prefixes_print, 2563c602fabSXin LI /* [AHCP1_OPT_IPV4_PREFIX_DELEGATION] = */ ahcp_ipv4_prefixes_print, 2573c602fabSXin LI /* [AHCP1_OPT_NAME_SERVER] = */ ahcp_ipv6_addresses_print, 2583c602fabSXin LI /* [AHCP1_OPT_NTP_SERVER] = */ ahcp_ipv6_addresses_print, 2593c602fabSXin LI }; 2603c602fabSXin LI 2613c602fabSXin LI static void 2628bdc5a62SPatrick Kelsey ahcp1_options_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) 2638bdc5a62SPatrick Kelsey { 2643c602fabSXin LI uint8_t option_no, option_len; 2653c602fabSXin LI 2663c602fabSXin LI while (cp < ep) { 2673c602fabSXin LI /* Option no */ 2683c602fabSXin LI ND_TCHECK2(*cp, 1); 2693c602fabSXin LI option_no = *cp; 2703c602fabSXin LI cp += 1; 2713c602fabSXin LI ND_PRINT((ndo, "\n\t %s", tok2str(ahcp1_opt_str, "Unknown-%u", option_no))); 2723c602fabSXin LI if (option_no == AHCP1_OPT_PAD || option_no == AHCP1_OPT_MANDATORY) 2733c602fabSXin LI continue; 2743c602fabSXin LI /* Length */ 2753c602fabSXin LI if (cp + 1 > ep) 276*3340d773SGleb Smirnoff goto invalid; 2773c602fabSXin LI ND_TCHECK2(*cp, 1); 2783c602fabSXin LI option_len = *cp; 2793c602fabSXin LI cp += 1; 2803c602fabSXin LI if (cp + option_len > ep) 281*3340d773SGleb Smirnoff goto invalid; 2823c602fabSXin LI /* Value */ 2833c602fabSXin LI if (option_no <= AHCP1_OPT_MAX && data_decoders[option_no] != NULL) { 2843c602fabSXin LI if (data_decoders[option_no](ndo, cp, cp + option_len) < 0) 2853c602fabSXin LI break; /* truncated and already marked up */ 2863c602fabSXin LI } else { 2873c602fabSXin LI ND_PRINT((ndo, " (Length %u)", option_len)); 2883c602fabSXin LI ND_TCHECK2(*cp, option_len); 2893c602fabSXin LI } 2903c602fabSXin LI cp += option_len; 2913c602fabSXin LI } 2923c602fabSXin LI return; 2933c602fabSXin LI 294*3340d773SGleb Smirnoff invalid: 295*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 2963c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 2973c602fabSXin LI return; 2983c602fabSXin LI trunc: 2993c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 3003c602fabSXin LI } 3013c602fabSXin LI 3023c602fabSXin LI static void 3038bdc5a62SPatrick Kelsey ahcp1_body_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) 3048bdc5a62SPatrick Kelsey { 3053c602fabSXin LI uint8_t type, mbz; 3063c602fabSXin LI uint16_t body_len; 3073c602fabSXin LI 3083c602fabSXin LI if (cp + AHCP1_BODY_MIN_LEN > ep) 309*3340d773SGleb Smirnoff goto invalid; 3103c602fabSXin LI /* Type */ 3113c602fabSXin LI ND_TCHECK2(*cp, 1); 3123c602fabSXin LI type = *cp; 3133c602fabSXin LI cp += 1; 3143c602fabSXin LI /* MBZ */ 3153c602fabSXin LI ND_TCHECK2(*cp, 1); 3163c602fabSXin LI mbz = *cp; 3173c602fabSXin LI cp += 1; 3183c602fabSXin LI /* Length */ 3193c602fabSXin LI ND_TCHECK2(*cp, 2); 3203c602fabSXin LI body_len = EXTRACT_16BITS(cp); 3213c602fabSXin LI cp += 2; 3223c602fabSXin LI 3233c602fabSXin LI if (ndo->ndo_vflag) { 3243c602fabSXin LI ND_PRINT((ndo, "\n\t%s", tok2str(ahcp1_msg_str, "Unknown-%u", type))); 3253c602fabSXin LI if (mbz != 0) 3263c602fabSXin LI ND_PRINT((ndo, ", MBZ %u", mbz)); 3273c602fabSXin LI ND_PRINT((ndo, ", Length %u", body_len)); 3283c602fabSXin LI } 3293c602fabSXin LI if (cp + body_len > ep) 330*3340d773SGleb Smirnoff goto invalid; 3313c602fabSXin LI 3323c602fabSXin LI /* Options */ 3333c602fabSXin LI if (ndo->ndo_vflag >= 2) 3343c602fabSXin LI ahcp1_options_print(ndo, cp, cp + body_len); /* not ep (ignore extra data) */ 3353c602fabSXin LI else 3363c602fabSXin LI ND_TCHECK2(*cp, body_len); 3373c602fabSXin LI return; 3383c602fabSXin LI 339*3340d773SGleb Smirnoff invalid: 340*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 3413c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 3423c602fabSXin LI return; 3433c602fabSXin LI trunc: 3443c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 3453c602fabSXin LI } 3463c602fabSXin LI 3473c602fabSXin LI void 3488bdc5a62SPatrick Kelsey ahcp_print(netdissect_options *ndo, const u_char *cp, const u_int len) 3498bdc5a62SPatrick Kelsey { 3503c602fabSXin LI const u_char *ep = cp + len; 3513c602fabSXin LI uint8_t version; 3523c602fabSXin LI 3533c602fabSXin LI ND_PRINT((ndo, "AHCP")); 3543c602fabSXin LI if (len < 2) 355*3340d773SGleb Smirnoff goto invalid; 3563c602fabSXin LI /* Magic */ 3573c602fabSXin LI ND_TCHECK2(*cp, 1); 3583c602fabSXin LI if (*cp != AHCP_MAGIC_NUMBER) 359*3340d773SGleb Smirnoff goto invalid; 3603c602fabSXin LI cp += 1; 3613c602fabSXin LI /* Version */ 3623c602fabSXin LI ND_TCHECK2(*cp, 1); 3633c602fabSXin LI version = *cp; 3643c602fabSXin LI cp += 1; 3653c602fabSXin LI switch (version) { 3663c602fabSXin LI case AHCP_VERSION_1: { 3673c602fabSXin LI ND_PRINT((ndo, " Version 1")); 3683c602fabSXin LI if (len < AHCP1_HEADER_FIX_LEN) 369*3340d773SGleb Smirnoff goto invalid; 3703c602fabSXin LI if (!ndo->ndo_vflag) { 3713c602fabSXin LI ND_TCHECK2(*cp, AHCP1_HEADER_FIX_LEN - 2); 3723c602fabSXin LI cp += AHCP1_HEADER_FIX_LEN - 2; 3733c602fabSXin LI } else { 3743c602fabSXin LI /* Hopcount */ 3753c602fabSXin LI ND_TCHECK2(*cp, 1); 3763c602fabSXin LI ND_PRINT((ndo, "\n\tHopcount %u", *cp)); 3773c602fabSXin LI cp += 1; 3783c602fabSXin LI /* Original Hopcount */ 3793c602fabSXin LI ND_TCHECK2(*cp, 1); 3803c602fabSXin LI ND_PRINT((ndo, ", Original Hopcount %u", *cp)); 3813c602fabSXin LI cp += 1; 3823c602fabSXin LI /* Nonce */ 3833c602fabSXin LI ND_TCHECK2(*cp, 4); 3843c602fabSXin LI ND_PRINT((ndo, ", Nonce 0x%08x", EXTRACT_32BITS(cp))); 3853c602fabSXin LI cp += 4; 3863c602fabSXin LI /* Source Id */ 3873c602fabSXin LI ND_TCHECK2(*cp, 8); 3883c602fabSXin LI ND_PRINT((ndo, ", Source Id %s", linkaddr_string(ndo, cp, 0, 8))); 3893c602fabSXin LI cp += 8; 3903c602fabSXin LI /* Destination Id */ 3913c602fabSXin LI ND_TCHECK2(*cp, 8); 3923c602fabSXin LI ND_PRINT((ndo, ", Destination Id %s", linkaddr_string(ndo, cp, 0, 8))); 3933c602fabSXin LI cp += 8; 3943c602fabSXin LI } 3953c602fabSXin LI /* Body */ 3963c602fabSXin LI ahcp1_body_print(ndo, cp, ep); 3973c602fabSXin LI break; 3983c602fabSXin LI } 3993c602fabSXin LI default: 4003c602fabSXin LI ND_PRINT((ndo, " Version %u (unknown)", version)); 4013c602fabSXin LI break; 4023c602fabSXin LI } 4033c602fabSXin LI return; 4043c602fabSXin LI 405*3340d773SGleb Smirnoff invalid: 406*3340d773SGleb Smirnoff ND_PRINT((ndo, "%s", istr)); 4073c602fabSXin LI ND_TCHECK2(*cp, ep - cp); 4083c602fabSXin LI return; 4093c602fabSXin LI trunc: 4103c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 4113c602fabSXin LI } 412