14edb46e9SPaul Traina /* 2699fc314SBill Fenner * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997 34edb46e9SPaul Traina * The Regents of the University of California. All rights reserved. 44edb46e9SPaul Traina * 54edb46e9SPaul Traina * Redistribution and use in source and binary forms, with or without 64edb46e9SPaul Traina * modification, are permitted provided that: (1) source code distributions 74edb46e9SPaul Traina * retain the above copyright notice and this paragraph in its entirety, (2) 84edb46e9SPaul Traina * distributions including binary code include the above copyright notice and 94edb46e9SPaul Traina * this paragraph in its entirety in the documentation or other materials 104edb46e9SPaul Traina * provided with the distribution, and (3) all advertising materials mentioning 114edb46e9SPaul Traina * features or use of this software display the following acknowledgement: 124edb46e9SPaul Traina * ``This product includes software developed by the University of California, 134edb46e9SPaul Traina * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 144edb46e9SPaul Traina * the University nor the names of its contributors may be used to endorse 154edb46e9SPaul Traina * or promote products derived from this software without specific prior 164edb46e9SPaul Traina * written permission. 174edb46e9SPaul Traina * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 184edb46e9SPaul Traina * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 194edb46e9SPaul Traina * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 204edb46e9SPaul Traina * 214edb46e9SPaul Traina * Format and print bootp packets. 22a88113a8SBill Fenner * 23a88113a8SBill Fenner * $FreeBSD$ 244edb46e9SPaul Traina */ 25a88113a8SBill Fenner 263c602fabSXin LI #define NETDISSECT_REWORKED 27a88113a8SBill Fenner #ifdef HAVE_CONFIG_H 28a88113a8SBill Fenner #include "config.h" 294edb46e9SPaul Traina #endif 304edb46e9SPaul Traina 31cc391cceSBruce M Simpson #include <tcpdump-stdinc.h> 324edb46e9SPaul Traina 334edb46e9SPaul Traina #include <string.h> 344edb46e9SPaul Traina 354edb46e9SPaul Traina #include "interface.h" 364edb46e9SPaul Traina #include "addrtoname.h" 37943ee2b1SBill Fenner #include "extract.h" 384edb46e9SPaul Traina 393c602fabSXin LI static const char tstr[] = " [|bootp]"; 404edb46e9SPaul Traina 41*8bdc5a62SPatrick Kelsey /* 42*8bdc5a62SPatrick Kelsey * Bootstrap Protocol (BOOTP). RFC951 and RFC1048. 43*8bdc5a62SPatrick Kelsey * 44*8bdc5a62SPatrick Kelsey * This file specifies the "implementation-independent" BOOTP protocol 45*8bdc5a62SPatrick Kelsey * information which is common to both client and server. 46*8bdc5a62SPatrick Kelsey * 47*8bdc5a62SPatrick Kelsey * Copyright 1988 by Carnegie Mellon. 48*8bdc5a62SPatrick Kelsey * 49*8bdc5a62SPatrick Kelsey * Permission to use, copy, modify, and distribute this program for any 50*8bdc5a62SPatrick Kelsey * purpose and without fee is hereby granted, provided that this copyright 51*8bdc5a62SPatrick Kelsey * and permission notice appear on all copies and supporting documentation, 52*8bdc5a62SPatrick Kelsey * the name of Carnegie Mellon not be used in advertising or publicity 53*8bdc5a62SPatrick Kelsey * pertaining to distribution of the program without specific prior 54*8bdc5a62SPatrick Kelsey * permission, and notice be given in supporting documentation that copying 55*8bdc5a62SPatrick Kelsey * and distribution is by permission of Carnegie Mellon and Stanford 56*8bdc5a62SPatrick Kelsey * University. Carnegie Mellon makes no representations about the 57*8bdc5a62SPatrick Kelsey * suitability of this software for any purpose. It is provided "as is" 58*8bdc5a62SPatrick Kelsey * without express or implied warranty. 59*8bdc5a62SPatrick Kelsey */ 60*8bdc5a62SPatrick Kelsey 61*8bdc5a62SPatrick Kelsey struct bootp { 62*8bdc5a62SPatrick Kelsey uint8_t bp_op; /* packet opcode type */ 63*8bdc5a62SPatrick Kelsey uint8_t bp_htype; /* hardware addr type */ 64*8bdc5a62SPatrick Kelsey uint8_t bp_hlen; /* hardware addr length */ 65*8bdc5a62SPatrick Kelsey uint8_t bp_hops; /* gateway hops */ 66*8bdc5a62SPatrick Kelsey uint32_t bp_xid; /* transaction ID */ 67*8bdc5a62SPatrick Kelsey uint16_t bp_secs; /* seconds since boot began */ 68*8bdc5a62SPatrick Kelsey uint16_t bp_flags; /* flags - see bootp_flag_values[] 69*8bdc5a62SPatrick Kelsey in print-bootp.c */ 70*8bdc5a62SPatrick Kelsey struct in_addr bp_ciaddr; /* client IP address */ 71*8bdc5a62SPatrick Kelsey struct in_addr bp_yiaddr; /* 'your' IP address */ 72*8bdc5a62SPatrick Kelsey struct in_addr bp_siaddr; /* server IP address */ 73*8bdc5a62SPatrick Kelsey struct in_addr bp_giaddr; /* gateway IP address */ 74*8bdc5a62SPatrick Kelsey uint8_t bp_chaddr[16]; /* client hardware address */ 75*8bdc5a62SPatrick Kelsey uint8_t bp_sname[64]; /* server host name */ 76*8bdc5a62SPatrick Kelsey uint8_t bp_file[128]; /* boot file name */ 77*8bdc5a62SPatrick Kelsey uint8_t bp_vend[64]; /* vendor-specific area */ 78*8bdc5a62SPatrick Kelsey } UNALIGNED; 79*8bdc5a62SPatrick Kelsey 80*8bdc5a62SPatrick Kelsey #define BOOTPREPLY 2 81*8bdc5a62SPatrick Kelsey #define BOOTPREQUEST 1 82*8bdc5a62SPatrick Kelsey 83*8bdc5a62SPatrick Kelsey /* 84*8bdc5a62SPatrick Kelsey * Vendor magic cookie (v_magic) for CMU 85*8bdc5a62SPatrick Kelsey */ 86*8bdc5a62SPatrick Kelsey #define VM_CMU "CMU" 87*8bdc5a62SPatrick Kelsey 88*8bdc5a62SPatrick Kelsey /* 89*8bdc5a62SPatrick Kelsey * Vendor magic cookie (v_magic) for RFC1048 90*8bdc5a62SPatrick Kelsey */ 91*8bdc5a62SPatrick Kelsey #define VM_RFC1048 { 99, 130, 83, 99 } 92*8bdc5a62SPatrick Kelsey 93*8bdc5a62SPatrick Kelsey /* 94*8bdc5a62SPatrick Kelsey * RFC1048 tag values used to specify what information is being supplied in 95*8bdc5a62SPatrick Kelsey * the vendor field of the packet. 96*8bdc5a62SPatrick Kelsey */ 97*8bdc5a62SPatrick Kelsey 98*8bdc5a62SPatrick Kelsey #define TAG_PAD ((uint8_t) 0) 99*8bdc5a62SPatrick Kelsey #define TAG_SUBNET_MASK ((uint8_t) 1) 100*8bdc5a62SPatrick Kelsey #define TAG_TIME_OFFSET ((uint8_t) 2) 101*8bdc5a62SPatrick Kelsey #define TAG_GATEWAY ((uint8_t) 3) 102*8bdc5a62SPatrick Kelsey #define TAG_TIME_SERVER ((uint8_t) 4) 103*8bdc5a62SPatrick Kelsey #define TAG_NAME_SERVER ((uint8_t) 5) 104*8bdc5a62SPatrick Kelsey #define TAG_DOMAIN_SERVER ((uint8_t) 6) 105*8bdc5a62SPatrick Kelsey #define TAG_LOG_SERVER ((uint8_t) 7) 106*8bdc5a62SPatrick Kelsey #define TAG_COOKIE_SERVER ((uint8_t) 8) 107*8bdc5a62SPatrick Kelsey #define TAG_LPR_SERVER ((uint8_t) 9) 108*8bdc5a62SPatrick Kelsey #define TAG_IMPRESS_SERVER ((uint8_t) 10) 109*8bdc5a62SPatrick Kelsey #define TAG_RLP_SERVER ((uint8_t) 11) 110*8bdc5a62SPatrick Kelsey #define TAG_HOSTNAME ((uint8_t) 12) 111*8bdc5a62SPatrick Kelsey #define TAG_BOOTSIZE ((uint8_t) 13) 112*8bdc5a62SPatrick Kelsey #define TAG_END ((uint8_t) 255) 113*8bdc5a62SPatrick Kelsey /* RFC1497 tags */ 114*8bdc5a62SPatrick Kelsey #define TAG_DUMPPATH ((uint8_t) 14) 115*8bdc5a62SPatrick Kelsey #define TAG_DOMAINNAME ((uint8_t) 15) 116*8bdc5a62SPatrick Kelsey #define TAG_SWAP_SERVER ((uint8_t) 16) 117*8bdc5a62SPatrick Kelsey #define TAG_ROOTPATH ((uint8_t) 17) 118*8bdc5a62SPatrick Kelsey #define TAG_EXTPATH ((uint8_t) 18) 119*8bdc5a62SPatrick Kelsey /* RFC2132 */ 120*8bdc5a62SPatrick Kelsey #define TAG_IP_FORWARD ((uint8_t) 19) 121*8bdc5a62SPatrick Kelsey #define TAG_NL_SRCRT ((uint8_t) 20) 122*8bdc5a62SPatrick Kelsey #define TAG_PFILTERS ((uint8_t) 21) 123*8bdc5a62SPatrick Kelsey #define TAG_REASS_SIZE ((uint8_t) 22) 124*8bdc5a62SPatrick Kelsey #define TAG_DEF_TTL ((uint8_t) 23) 125*8bdc5a62SPatrick Kelsey #define TAG_MTU_TIMEOUT ((uint8_t) 24) 126*8bdc5a62SPatrick Kelsey #define TAG_MTU_TABLE ((uint8_t) 25) 127*8bdc5a62SPatrick Kelsey #define TAG_INT_MTU ((uint8_t) 26) 128*8bdc5a62SPatrick Kelsey #define TAG_LOCAL_SUBNETS ((uint8_t) 27) 129*8bdc5a62SPatrick Kelsey #define TAG_BROAD_ADDR ((uint8_t) 28) 130*8bdc5a62SPatrick Kelsey #define TAG_DO_MASK_DISC ((uint8_t) 29) 131*8bdc5a62SPatrick Kelsey #define TAG_SUPPLY_MASK ((uint8_t) 30) 132*8bdc5a62SPatrick Kelsey #define TAG_DO_RDISC ((uint8_t) 31) 133*8bdc5a62SPatrick Kelsey #define TAG_RTR_SOL_ADDR ((uint8_t) 32) 134*8bdc5a62SPatrick Kelsey #define TAG_STATIC_ROUTE ((uint8_t) 33) 135*8bdc5a62SPatrick Kelsey #define TAG_USE_TRAILERS ((uint8_t) 34) 136*8bdc5a62SPatrick Kelsey #define TAG_ARP_TIMEOUT ((uint8_t) 35) 137*8bdc5a62SPatrick Kelsey #define TAG_ETH_ENCAP ((uint8_t) 36) 138*8bdc5a62SPatrick Kelsey #define TAG_TCP_TTL ((uint8_t) 37) 139*8bdc5a62SPatrick Kelsey #define TAG_TCP_KEEPALIVE ((uint8_t) 38) 140*8bdc5a62SPatrick Kelsey #define TAG_KEEPALIVE_GO ((uint8_t) 39) 141*8bdc5a62SPatrick Kelsey #define TAG_NIS_DOMAIN ((uint8_t) 40) 142*8bdc5a62SPatrick Kelsey #define TAG_NIS_SERVERS ((uint8_t) 41) 143*8bdc5a62SPatrick Kelsey #define TAG_NTP_SERVERS ((uint8_t) 42) 144*8bdc5a62SPatrick Kelsey #define TAG_VENDOR_OPTS ((uint8_t) 43) 145*8bdc5a62SPatrick Kelsey #define TAG_NETBIOS_NS ((uint8_t) 44) 146*8bdc5a62SPatrick Kelsey #define TAG_NETBIOS_DDS ((uint8_t) 45) 147*8bdc5a62SPatrick Kelsey #define TAG_NETBIOS_NODE ((uint8_t) 46) 148*8bdc5a62SPatrick Kelsey #define TAG_NETBIOS_SCOPE ((uint8_t) 47) 149*8bdc5a62SPatrick Kelsey #define TAG_XWIN_FS ((uint8_t) 48) 150*8bdc5a62SPatrick Kelsey #define TAG_XWIN_DM ((uint8_t) 49) 151*8bdc5a62SPatrick Kelsey #define TAG_NIS_P_DOMAIN ((uint8_t) 64) 152*8bdc5a62SPatrick Kelsey #define TAG_NIS_P_SERVERS ((uint8_t) 65) 153*8bdc5a62SPatrick Kelsey #define TAG_MOBILE_HOME ((uint8_t) 68) 154*8bdc5a62SPatrick Kelsey #define TAG_SMPT_SERVER ((uint8_t) 69) 155*8bdc5a62SPatrick Kelsey #define TAG_POP3_SERVER ((uint8_t) 70) 156*8bdc5a62SPatrick Kelsey #define TAG_NNTP_SERVER ((uint8_t) 71) 157*8bdc5a62SPatrick Kelsey #define TAG_WWW_SERVER ((uint8_t) 72) 158*8bdc5a62SPatrick Kelsey #define TAG_FINGER_SERVER ((uint8_t) 73) 159*8bdc5a62SPatrick Kelsey #define TAG_IRC_SERVER ((uint8_t) 74) 160*8bdc5a62SPatrick Kelsey #define TAG_STREETTALK_SRVR ((uint8_t) 75) 161*8bdc5a62SPatrick Kelsey #define TAG_STREETTALK_STDA ((uint8_t) 76) 162*8bdc5a62SPatrick Kelsey /* DHCP options */ 163*8bdc5a62SPatrick Kelsey #define TAG_REQUESTED_IP ((uint8_t) 50) 164*8bdc5a62SPatrick Kelsey #define TAG_IP_LEASE ((uint8_t) 51) 165*8bdc5a62SPatrick Kelsey #define TAG_OPT_OVERLOAD ((uint8_t) 52) 166*8bdc5a62SPatrick Kelsey #define TAG_TFTP_SERVER ((uint8_t) 66) 167*8bdc5a62SPatrick Kelsey #define TAG_BOOTFILENAME ((uint8_t) 67) 168*8bdc5a62SPatrick Kelsey #define TAG_DHCP_MESSAGE ((uint8_t) 53) 169*8bdc5a62SPatrick Kelsey #define TAG_SERVER_ID ((uint8_t) 54) 170*8bdc5a62SPatrick Kelsey #define TAG_PARM_REQUEST ((uint8_t) 55) 171*8bdc5a62SPatrick Kelsey #define TAG_MESSAGE ((uint8_t) 56) 172*8bdc5a62SPatrick Kelsey #define TAG_MAX_MSG_SIZE ((uint8_t) 57) 173*8bdc5a62SPatrick Kelsey #define TAG_RENEWAL_TIME ((uint8_t) 58) 174*8bdc5a62SPatrick Kelsey #define TAG_REBIND_TIME ((uint8_t) 59) 175*8bdc5a62SPatrick Kelsey #define TAG_VENDOR_CLASS ((uint8_t) 60) 176*8bdc5a62SPatrick Kelsey #define TAG_CLIENT_ID ((uint8_t) 61) 177*8bdc5a62SPatrick Kelsey /* RFC 2241 */ 178*8bdc5a62SPatrick Kelsey #define TAG_NDS_SERVERS ((uint8_t) 85) 179*8bdc5a62SPatrick Kelsey #define TAG_NDS_TREE_NAME ((uint8_t) 86) 180*8bdc5a62SPatrick Kelsey #define TAG_NDS_CONTEXT ((uint8_t) 87) 181*8bdc5a62SPatrick Kelsey /* RFC 2242 */ 182*8bdc5a62SPatrick Kelsey #define TAG_NDS_IPDOMAIN ((uint8_t) 62) 183*8bdc5a62SPatrick Kelsey #define TAG_NDS_IPINFO ((uint8_t) 63) 184*8bdc5a62SPatrick Kelsey /* RFC 2485 */ 185*8bdc5a62SPatrick Kelsey #define TAG_OPEN_GROUP_UAP ((uint8_t) 98) 186*8bdc5a62SPatrick Kelsey /* RFC 2563 */ 187*8bdc5a62SPatrick Kelsey #define TAG_DISABLE_AUTOCONF ((uint8_t) 116) 188*8bdc5a62SPatrick Kelsey /* RFC 2610 */ 189*8bdc5a62SPatrick Kelsey #define TAG_SLP_DA ((uint8_t) 78) 190*8bdc5a62SPatrick Kelsey #define TAG_SLP_SCOPE ((uint8_t) 79) 191*8bdc5a62SPatrick Kelsey /* RFC 2937 */ 192*8bdc5a62SPatrick Kelsey #define TAG_NS_SEARCH ((uint8_t) 117) 193*8bdc5a62SPatrick Kelsey /* RFC 3004 - The User Class Option for DHCP */ 194*8bdc5a62SPatrick Kelsey #define TAG_USER_CLASS ((uint8_t) 77) 195*8bdc5a62SPatrick Kelsey /* RFC 3011 */ 196*8bdc5a62SPatrick Kelsey #define TAG_IP4_SUBNET_SELECT ((uint8_t) 118) 197*8bdc5a62SPatrick Kelsey /* RFC 3442 */ 198*8bdc5a62SPatrick Kelsey #define TAG_CLASSLESS_STATIC_RT ((uint8_t) 121) 199*8bdc5a62SPatrick Kelsey #define TAG_CLASSLESS_STA_RT_MS ((uint8_t) 249) 200*8bdc5a62SPatrick Kelsey /* RFC 5859 - TFTP Server Address Option for DHCPv4 */ 201*8bdc5a62SPatrick Kelsey #define TAG_TFTP_SERVER_ADDRESS ((uint8_t) 150) 202*8bdc5a62SPatrick Kelsey /* ftp://ftp.isi.edu/.../assignments/bootp-dhcp-extensions */ 203*8bdc5a62SPatrick Kelsey #define TAG_SLP_NAMING_AUTH ((uint8_t) 80) 204*8bdc5a62SPatrick Kelsey #define TAG_CLIENT_FQDN ((uint8_t) 81) 205*8bdc5a62SPatrick Kelsey #define TAG_AGENT_CIRCUIT ((uint8_t) 82) 206*8bdc5a62SPatrick Kelsey #define TAG_AGENT_REMOTE ((uint8_t) 83) 207*8bdc5a62SPatrick Kelsey #define TAG_AGENT_MASK ((uint8_t) 84) 208*8bdc5a62SPatrick Kelsey #define TAG_TZ_STRING ((uint8_t) 88) 209*8bdc5a62SPatrick Kelsey #define TAG_FQDN_OPTION ((uint8_t) 89) 210*8bdc5a62SPatrick Kelsey #define TAG_AUTH ((uint8_t) 90) 211*8bdc5a62SPatrick Kelsey #define TAG_VINES_SERVERS ((uint8_t) 91) 212*8bdc5a62SPatrick Kelsey #define TAG_SERVER_RANK ((uint8_t) 92) 213*8bdc5a62SPatrick Kelsey #define TAG_CLIENT_ARCH ((uint8_t) 93) 214*8bdc5a62SPatrick Kelsey #define TAG_CLIENT_NDI ((uint8_t) 94) 215*8bdc5a62SPatrick Kelsey #define TAG_CLIENT_GUID ((uint8_t) 97) 216*8bdc5a62SPatrick Kelsey #define TAG_LDAP_URL ((uint8_t) 95) 217*8bdc5a62SPatrick Kelsey #define TAG_6OVER4 ((uint8_t) 96) 218*8bdc5a62SPatrick Kelsey #define TAG_PRINTER_NAME ((uint8_t) 100) 219*8bdc5a62SPatrick Kelsey #define TAG_MDHCP_SERVER ((uint8_t) 101) 220*8bdc5a62SPatrick Kelsey #define TAG_IPX_COMPAT ((uint8_t) 110) 221*8bdc5a62SPatrick Kelsey #define TAG_NETINFO_PARENT ((uint8_t) 112) 222*8bdc5a62SPatrick Kelsey #define TAG_NETINFO_PARENT_TAG ((uint8_t) 113) 223*8bdc5a62SPatrick Kelsey #define TAG_URL ((uint8_t) 114) 224*8bdc5a62SPatrick Kelsey #define TAG_FAILOVER ((uint8_t) 115) 225*8bdc5a62SPatrick Kelsey #define TAG_EXTENDED_REQUEST ((uint8_t) 126) 226*8bdc5a62SPatrick Kelsey #define TAG_EXTENDED_OPTION ((uint8_t) 127) 227*8bdc5a62SPatrick Kelsey 228*8bdc5a62SPatrick Kelsey /* DHCP Message types (values for TAG_DHCP_MESSAGE option) */ 229*8bdc5a62SPatrick Kelsey #define DHCPDISCOVER 1 230*8bdc5a62SPatrick Kelsey #define DHCPOFFER 2 231*8bdc5a62SPatrick Kelsey #define DHCPREQUEST 3 232*8bdc5a62SPatrick Kelsey #define DHCPDECLINE 4 233*8bdc5a62SPatrick Kelsey #define DHCPACK 5 234*8bdc5a62SPatrick Kelsey #define DHCPNAK 6 235*8bdc5a62SPatrick Kelsey #define DHCPRELEASE 7 236*8bdc5a62SPatrick Kelsey #define DHCPINFORM 8 237*8bdc5a62SPatrick Kelsey 238*8bdc5a62SPatrick Kelsey /* 239*8bdc5a62SPatrick Kelsey * "vendor" data permitted for CMU bootp clients. 240*8bdc5a62SPatrick Kelsey */ 241*8bdc5a62SPatrick Kelsey 242*8bdc5a62SPatrick Kelsey struct cmu_vend { 243*8bdc5a62SPatrick Kelsey uint8_t v_magic[4]; /* magic number */ 244*8bdc5a62SPatrick Kelsey uint32_t v_flags; /* flags/opcodes, etc. */ 245*8bdc5a62SPatrick Kelsey struct in_addr v_smask; /* Subnet mask */ 246*8bdc5a62SPatrick Kelsey struct in_addr v_dgate; /* Default gateway */ 247*8bdc5a62SPatrick Kelsey struct in_addr v_dns1, v_dns2; /* Domain name servers */ 248*8bdc5a62SPatrick Kelsey struct in_addr v_ins1, v_ins2; /* IEN-116 name servers */ 249*8bdc5a62SPatrick Kelsey struct in_addr v_ts1, v_ts2; /* Time servers */ 250*8bdc5a62SPatrick Kelsey uint8_t v_unused[24]; /* currently unused */ 251*8bdc5a62SPatrick Kelsey } UNALIGNED; 252*8bdc5a62SPatrick Kelsey 253*8bdc5a62SPatrick Kelsey 254*8bdc5a62SPatrick Kelsey /* v_flags values */ 255*8bdc5a62SPatrick Kelsey #define VF_SMASK 1 /* Subnet mask field contains valid data */ 256*8bdc5a62SPatrick Kelsey 257*8bdc5a62SPatrick Kelsey /* RFC 4702 DHCP Client FQDN Option */ 258*8bdc5a62SPatrick Kelsey 259*8bdc5a62SPatrick Kelsey #define CLIENT_FQDN_FLAGS_S 0x01 260*8bdc5a62SPatrick Kelsey #define CLIENT_FQDN_FLAGS_O 0x02 261*8bdc5a62SPatrick Kelsey #define CLIENT_FQDN_FLAGS_E 0x04 262*8bdc5a62SPatrick Kelsey #define CLIENT_FQDN_FLAGS_N 0x08 263*8bdc5a62SPatrick Kelsey /* end of original bootp.h */ 264*8bdc5a62SPatrick Kelsey 2653c602fabSXin LI static void rfc1048_print(netdissect_options *, const u_char *); 2663c602fabSXin LI static void cmu_print(netdissect_options *, const u_char *); 2673c602fabSXin LI static char *client_fqdn_flags(u_int flags); 2684edb46e9SPaul Traina 269cc391cceSBruce M Simpson static const struct tok bootp_flag_values[] = { 270cc391cceSBruce M Simpson { 0x8000, "Broadcast" }, 271cc391cceSBruce M Simpson { 0, NULL} 272cc391cceSBruce M Simpson }; 273cc391cceSBruce M Simpson 274cc391cceSBruce M Simpson static const struct tok bootp_op_values[] = { 275cc391cceSBruce M Simpson { BOOTPREQUEST, "Request" }, 276cc391cceSBruce M Simpson { BOOTPREPLY, "Reply" }, 277cc391cceSBruce M Simpson { 0, NULL} 278cc391cceSBruce M Simpson }; 279cc391cceSBruce M Simpson 2804edb46e9SPaul Traina /* 2814edb46e9SPaul Traina * Print bootp requests 2824edb46e9SPaul Traina */ 2834edb46e9SPaul Traina void 2843c602fabSXin LI bootp_print(netdissect_options *ndo, 2853c602fabSXin LI register const u_char *cp, u_int length) 2864edb46e9SPaul Traina { 2874edb46e9SPaul Traina register const struct bootp *bp; 288a1c2090eSBill Fenner static const u_char vm_cmu[4] = VM_CMU; 289a1c2090eSBill Fenner static const u_char vm_rfc1048[4] = VM_RFC1048; 2904edb46e9SPaul Traina 291a1c2090eSBill Fenner bp = (const struct bootp *)cp; 2923c602fabSXin LI ND_TCHECK(bp->bp_op); 2934edb46e9SPaul Traina 2943c602fabSXin LI ND_PRINT((ndo, "BOOTP/DHCP, %s", 2953c602fabSXin LI tok2str(bootp_op_values, "unknown (0x%02x)", bp->bp_op))); 2964edb46e9SPaul Traina 297cc391cceSBruce M Simpson if (bp->bp_htype == 1 && bp->bp_hlen == 6 && bp->bp_op == BOOTPREQUEST) { 2983c602fabSXin LI ND_TCHECK2(bp->bp_chaddr[0], 6); 2993c602fabSXin LI ND_PRINT((ndo, " from %s", etheraddr_string(ndo, bp->bp_chaddr))); 3004edb46e9SPaul Traina } 3014edb46e9SPaul Traina 3023c602fabSXin LI ND_PRINT((ndo, ", length %u", length)); 303cc391cceSBruce M Simpson 3043c602fabSXin LI if (!ndo->ndo_vflag) 305cc391cceSBruce M Simpson return; 306cc391cceSBruce M Simpson 3073c602fabSXin LI ND_TCHECK(bp->bp_secs); 3084edb46e9SPaul Traina 3094edb46e9SPaul Traina /* The usual hardware address type is 1 (10Mb Ethernet) */ 3104edb46e9SPaul Traina if (bp->bp_htype != 1) 3113c602fabSXin LI ND_PRINT((ndo, ", htype %d", bp->bp_htype)); 3124edb46e9SPaul Traina 3134edb46e9SPaul Traina /* The usual length for 10Mb Ethernet address is 6 bytes */ 3144edb46e9SPaul Traina if (bp->bp_htype != 1 || bp->bp_hlen != 6) 3153c602fabSXin LI ND_PRINT((ndo, ", hlen %d", bp->bp_hlen)); 3164edb46e9SPaul Traina 3174edb46e9SPaul Traina /* Only print interesting fields */ 3184edb46e9SPaul Traina if (bp->bp_hops) 3193c602fabSXin LI ND_PRINT((ndo, ", hops %d", bp->bp_hops)); 3203c602fabSXin LI if (EXTRACT_32BITS(&bp->bp_xid)) 3213c602fabSXin LI ND_PRINT((ndo, ", xid 0x%x", EXTRACT_32BITS(&bp->bp_xid))); 3223c602fabSXin LI if (EXTRACT_16BITS(&bp->bp_secs)) 3233c602fabSXin LI ND_PRINT((ndo, ", secs %d", EXTRACT_16BITS(&bp->bp_secs))); 324cc391cceSBruce M Simpson 3253c602fabSXin LI ND_PRINT((ndo, ", Flags [%s]", 3263c602fabSXin LI bittok2str(bootp_flag_values, "none", EXTRACT_16BITS(&bp->bp_flags)))); 3273c602fabSXin LI if (ndo->ndo_vflag > 1) 3283c602fabSXin LI ND_PRINT((ndo, " (0x%04x)", EXTRACT_16BITS(&bp->bp_flags))); 3294edb46e9SPaul Traina 3304edb46e9SPaul Traina /* Client's ip address */ 3313c602fabSXin LI ND_TCHECK(bp->bp_ciaddr); 3323c602fabSXin LI if (EXTRACT_32BITS(&bp->bp_ciaddr.s_addr)) 3333c602fabSXin LI ND_PRINT((ndo, "\n\t Client-IP %s", ipaddr_string(ndo, &bp->bp_ciaddr))); 3344edb46e9SPaul Traina 3354edb46e9SPaul Traina /* 'your' ip address (bootp client) */ 3363c602fabSXin LI ND_TCHECK(bp->bp_yiaddr); 3373c602fabSXin LI if (EXTRACT_32BITS(&bp->bp_yiaddr.s_addr)) 3383c602fabSXin LI ND_PRINT((ndo, "\n\t Your-IP %s", ipaddr_string(ndo, &bp->bp_yiaddr))); 3394edb46e9SPaul Traina 3404edb46e9SPaul Traina /* Server's ip address */ 3413c602fabSXin LI ND_TCHECK(bp->bp_siaddr); 3423c602fabSXin LI if (EXTRACT_32BITS(&bp->bp_siaddr.s_addr)) 3433c602fabSXin LI ND_PRINT((ndo, "\n\t Server-IP %s", ipaddr_string(ndo, &bp->bp_siaddr))); 3444edb46e9SPaul Traina 3454edb46e9SPaul Traina /* Gateway's ip address */ 3463c602fabSXin LI ND_TCHECK(bp->bp_giaddr); 3473c602fabSXin LI if (EXTRACT_32BITS(&bp->bp_giaddr.s_addr)) 3483c602fabSXin LI ND_PRINT((ndo, "\n\t Gateway-IP %s", ipaddr_string(ndo, &bp->bp_giaddr))); 3494edb46e9SPaul Traina 3504edb46e9SPaul Traina /* Client's Ethernet address */ 3514edb46e9SPaul Traina if (bp->bp_htype == 1 && bp->bp_hlen == 6) { 3523c602fabSXin LI ND_TCHECK2(bp->bp_chaddr[0], 6); 3533c602fabSXin LI ND_PRINT((ndo, "\n\t Client-Ethernet-Address %s", etheraddr_string(ndo, bp->bp_chaddr))); 3544edb46e9SPaul Traina } 3554edb46e9SPaul Traina 3563c602fabSXin LI ND_TCHECK2(bp->bp_sname[0], 1); /* check first char only */ 3574edb46e9SPaul Traina if (*bp->bp_sname) { 3583c602fabSXin LI ND_PRINT((ndo, "\n\t sname \"")); 3593c602fabSXin LI if (fn_print(ndo, bp->bp_sname, ndo->ndo_snapend)) { 3603c602fabSXin LI ND_PRINT((ndo, "\"")); 3613c602fabSXin LI ND_PRINT((ndo, "%s", tstr + 1)); 3624edb46e9SPaul Traina return; 3634edb46e9SPaul Traina } 3643c602fabSXin LI ND_PRINT((ndo, "\"")); 3654edb46e9SPaul Traina } 3663c602fabSXin LI ND_TCHECK2(bp->bp_file[0], 1); /* check first char only */ 3674edb46e9SPaul Traina if (*bp->bp_file) { 3683c602fabSXin LI ND_PRINT((ndo, "\n\t file \"")); 3693c602fabSXin LI if (fn_print(ndo, bp->bp_file, ndo->ndo_snapend)) { 3703c602fabSXin LI ND_PRINT((ndo, "\"")); 3713c602fabSXin LI ND_PRINT((ndo, "%s", tstr + 1)); 3724edb46e9SPaul Traina return; 3734edb46e9SPaul Traina } 3743c602fabSXin LI ND_PRINT((ndo, "\"")); 3754edb46e9SPaul Traina } 3764edb46e9SPaul Traina 3774edb46e9SPaul Traina /* Decode the vendor buffer */ 3783c602fabSXin LI ND_TCHECK(bp->bp_vend[0]); 379a1c2090eSBill Fenner if (memcmp((const char *)bp->bp_vend, vm_rfc1048, 3803c602fabSXin LI sizeof(uint32_t)) == 0) 3813c602fabSXin LI rfc1048_print(ndo, bp->bp_vend); 382a1c2090eSBill Fenner else if (memcmp((const char *)bp->bp_vend, vm_cmu, 3833c602fabSXin LI sizeof(uint32_t)) == 0) 3843c602fabSXin LI cmu_print(ndo, bp->bp_vend); 3854edb46e9SPaul Traina else { 3863c602fabSXin LI uint32_t ul; 3874edb46e9SPaul Traina 388943ee2b1SBill Fenner ul = EXTRACT_32BITS(&bp->bp_vend); 3894edb46e9SPaul Traina if (ul != 0) 3903c602fabSXin LI ND_PRINT((ndo, "\n\t Vendor-#0x%x", ul)); 3914edb46e9SPaul Traina } 3924edb46e9SPaul Traina 3934edb46e9SPaul Traina return; 3944edb46e9SPaul Traina trunc: 3953c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 3964edb46e9SPaul Traina } 3974edb46e9SPaul Traina 398a1c2090eSBill Fenner /* 399a1c2090eSBill Fenner * The first character specifies the format to print: 400a1c2090eSBill Fenner * i - ip address (32 bits) 401a1c2090eSBill Fenner * p - ip address pairs (32 bits + 32 bits) 402a1c2090eSBill Fenner * l - long (32 bits) 403a1c2090eSBill Fenner * L - unsigned long (32 bits) 404a1c2090eSBill Fenner * s - short (16 bits) 405a1c2090eSBill Fenner * b - period-seperated decimal bytes (variable length) 406a1c2090eSBill Fenner * x - colon-seperated hex bytes (variable length) 407a1c2090eSBill Fenner * a - ascii string (variable length) 408a1c2090eSBill Fenner * B - on/off (8 bits) 409a1c2090eSBill Fenner * $ - special (explicit code to handle) 410a1c2090eSBill Fenner */ 4113c602fabSXin LI static const struct tok tag2str[] = { 4124edb46e9SPaul Traina /* RFC1048 tags */ 4134edb46e9SPaul Traina { TAG_PAD, " PAD" }, 414abf25193SMax Laier { TAG_SUBNET_MASK, "iSubnet-Mask" }, /* subnet mask (RFC950) */ 415abf25193SMax Laier { TAG_TIME_OFFSET, "LTime-Zone" }, /* seconds from UTC */ 416abf25193SMax Laier { TAG_GATEWAY, "iDefault-Gateway" }, /* default gateway */ 417abf25193SMax Laier { TAG_TIME_SERVER, "iTime-Server" }, /* time servers (RFC868) */ 418abf25193SMax Laier { TAG_NAME_SERVER, "iIEN-Name-Server" }, /* IEN name servers (IEN116) */ 419abf25193SMax Laier { TAG_DOMAIN_SERVER, "iDomain-Name-Server" }, /* domain name (RFC1035) */ 4204edb46e9SPaul Traina { TAG_LOG_SERVER, "iLOG" }, /* MIT log servers */ 4214edb46e9SPaul Traina { TAG_COOKIE_SERVER, "iCS" }, /* cookie servers (RFC865) */ 422abf25193SMax Laier { TAG_LPR_SERVER, "iLPR-Server" }, /* lpr server (RFC1179) */ 4234edb46e9SPaul Traina { TAG_IMPRESS_SERVER, "iIM" }, /* impress servers (Imagen) */ 4244edb46e9SPaul Traina { TAG_RLP_SERVER, "iRL" }, /* resource location (RFC887) */ 425abf25193SMax Laier { TAG_HOSTNAME, "aHostname" }, /* ascii hostname */ 4264edb46e9SPaul Traina { TAG_BOOTSIZE, "sBS" }, /* 512 byte blocks */ 4274edb46e9SPaul Traina { TAG_END, " END" }, 4284edb46e9SPaul Traina /* RFC1497 tags */ 4294edb46e9SPaul Traina { TAG_DUMPPATH, "aDP" }, 430abf25193SMax Laier { TAG_DOMAINNAME, "aDomain-Name" }, 4314edb46e9SPaul Traina { TAG_SWAP_SERVER, "iSS" }, 4324edb46e9SPaul Traina { TAG_ROOTPATH, "aRP" }, 4334edb46e9SPaul Traina { TAG_EXTPATH, "aEP" }, 434a88113a8SBill Fenner /* RFC2132 tags */ 435a88113a8SBill Fenner { TAG_IP_FORWARD, "BIPF" }, 436a88113a8SBill Fenner { TAG_NL_SRCRT, "BSRT" }, 437a88113a8SBill Fenner { TAG_PFILTERS, "pPF" }, 438a88113a8SBill Fenner { TAG_REASS_SIZE, "sRSZ" }, 439a88113a8SBill Fenner { TAG_DEF_TTL, "bTTL" }, 440abf25193SMax Laier { TAG_MTU_TIMEOUT, "lMTU-Timeout" }, 441abf25193SMax Laier { TAG_MTU_TABLE, "sMTU-Table" }, 442a88113a8SBill Fenner { TAG_INT_MTU, "sMTU" }, 443a88113a8SBill Fenner { TAG_LOCAL_SUBNETS, "BLSN" }, 444a88113a8SBill Fenner { TAG_BROAD_ADDR, "iBR" }, 445a88113a8SBill Fenner { TAG_DO_MASK_DISC, "BMD" }, 446a88113a8SBill Fenner { TAG_SUPPLY_MASK, "BMS" }, 447abf25193SMax Laier { TAG_DO_RDISC, "BRouter-Discovery" }, 448a88113a8SBill Fenner { TAG_RTR_SOL_ADDR, "iRSA" }, 449abf25193SMax Laier { TAG_STATIC_ROUTE, "pStatic-Route" }, 450a88113a8SBill Fenner { TAG_USE_TRAILERS, "BUT" }, 451a88113a8SBill Fenner { TAG_ARP_TIMEOUT, "lAT" }, 452a88113a8SBill Fenner { TAG_ETH_ENCAP, "BIE" }, 453a88113a8SBill Fenner { TAG_TCP_TTL, "bTT" }, 454a88113a8SBill Fenner { TAG_TCP_KEEPALIVE, "lKI" }, 455a88113a8SBill Fenner { TAG_KEEPALIVE_GO, "BKG" }, 456a88113a8SBill Fenner { TAG_NIS_DOMAIN, "aYD" }, 457a88113a8SBill Fenner { TAG_NIS_SERVERS, "iYS" }, 458a88113a8SBill Fenner { TAG_NTP_SERVERS, "iNTP" }, 459abf25193SMax Laier { TAG_VENDOR_OPTS, "bVendor-Option" }, 460abf25193SMax Laier { TAG_NETBIOS_NS, "iNetbios-Name-Server" }, 461a88113a8SBill Fenner { TAG_NETBIOS_DDS, "iWDD" }, 462abf25193SMax Laier { TAG_NETBIOS_NODE, "$Netbios-Node" }, 463abf25193SMax Laier { TAG_NETBIOS_SCOPE, "aNetbios-Scope" }, 464a88113a8SBill Fenner { TAG_XWIN_FS, "iXFS" }, 465a88113a8SBill Fenner { TAG_XWIN_DM, "iXDM" }, 466a88113a8SBill Fenner { TAG_NIS_P_DOMAIN, "sN+D" }, 467a88113a8SBill Fenner { TAG_NIS_P_SERVERS, "iN+S" }, 468a88113a8SBill Fenner { TAG_MOBILE_HOME, "iMH" }, 469a88113a8SBill Fenner { TAG_SMPT_SERVER, "iSMTP" }, 470a88113a8SBill Fenner { TAG_POP3_SERVER, "iPOP3" }, 471a88113a8SBill Fenner { TAG_NNTP_SERVER, "iNNTP" }, 472a88113a8SBill Fenner { TAG_WWW_SERVER, "iWWW" }, 473a88113a8SBill Fenner { TAG_FINGER_SERVER, "iFG" }, 474a88113a8SBill Fenner { TAG_IRC_SERVER, "iIRC" }, 475a88113a8SBill Fenner { TAG_STREETTALK_SRVR, "iSTS" }, 476a88113a8SBill Fenner { TAG_STREETTALK_STDA, "iSTDA" }, 477abf25193SMax Laier { TAG_REQUESTED_IP, "iRequested-IP" }, 478abf25193SMax Laier { TAG_IP_LEASE, "lLease-Time" }, 479a1c2090eSBill Fenner { TAG_OPT_OVERLOAD, "$OO" }, 480a88113a8SBill Fenner { TAG_TFTP_SERVER, "aTFTP" }, 481a88113a8SBill Fenner { TAG_BOOTFILENAME, "aBF" }, 482abf25193SMax Laier { TAG_DHCP_MESSAGE, " DHCP-Message" }, 483abf25193SMax Laier { TAG_SERVER_ID, "iServer-ID" }, 484abf25193SMax Laier { TAG_PARM_REQUEST, "bParameter-Request" }, 485a88113a8SBill Fenner { TAG_MESSAGE, "aMSG" }, 486a88113a8SBill Fenner { TAG_MAX_MSG_SIZE, "sMSZ" }, 487a88113a8SBill Fenner { TAG_RENEWAL_TIME, "lRN" }, 488a88113a8SBill Fenner { TAG_REBIND_TIME, "lRB" }, 489abf25193SMax Laier { TAG_VENDOR_CLASS, "aVendor-Class" }, 490abf25193SMax Laier { TAG_CLIENT_ID, "$Client-ID" }, 491943ee2b1SBill Fenner /* RFC 2485 */ 492943ee2b1SBill Fenner { TAG_OPEN_GROUP_UAP, "aUAP" }, 493943ee2b1SBill Fenner /* RFC 2563 */ 494943ee2b1SBill Fenner { TAG_DISABLE_AUTOCONF, "BNOAUTO" }, 495943ee2b1SBill Fenner /* RFC 2610 */ 496943ee2b1SBill Fenner { TAG_SLP_DA, "bSLP-DA" }, /*"b" is a little wrong */ 497943ee2b1SBill Fenner { TAG_SLP_SCOPE, "bSLP-SCOPE" }, /*"b" is a little wrong */ 498943ee2b1SBill Fenner /* RFC 2937 */ 499943ee2b1SBill Fenner { TAG_NS_SEARCH, "sNSSEARCH" }, /* XXX 's' */ 500*8bdc5a62SPatrick Kelsey /* RFC 3004 - The User Class Option for DHCP */ 501*8bdc5a62SPatrick Kelsey { TAG_USER_CLASS, "$User-Class" }, 502943ee2b1SBill Fenner /* RFC 3011 */ 503943ee2b1SBill Fenner { TAG_IP4_SUBNET_SELECT, "iSUBNET" }, 504abf25193SMax Laier /* RFC 3442 */ 505abf25193SMax Laier { TAG_CLASSLESS_STATIC_RT, "$Classless-Static-Route" }, 506abf25193SMax Laier { TAG_CLASSLESS_STA_RT_MS, "$Classless-Static-Route-Microsoft" }, 507*8bdc5a62SPatrick Kelsey /* RFC 5859 - TFTP Server Address Option for DHCPv4 */ 508*8bdc5a62SPatrick Kelsey { TAG_TFTP_SERVER_ADDRESS, "iTFTP-Server-Address" }, 509cc391cceSBruce M Simpson /* http://www.iana.org/assignments/bootp-dhcp-extensions/index.htm */ 510943ee2b1SBill Fenner { TAG_SLP_NAMING_AUTH, "aSLP-NA" }, 511a1c2090eSBill Fenner { TAG_CLIENT_FQDN, "$FQDN" }, 512abf25193SMax Laier { TAG_AGENT_CIRCUIT, "$Agent-Information" }, 513943ee2b1SBill Fenner { TAG_AGENT_REMOTE, "bARMT" }, 514943ee2b1SBill Fenner { TAG_AGENT_MASK, "bAMSK" }, 515943ee2b1SBill Fenner { TAG_TZ_STRING, "aTZSTR" }, 516943ee2b1SBill Fenner { TAG_FQDN_OPTION, "bFQDNS" }, /* XXX 'b' */ 517943ee2b1SBill Fenner { TAG_AUTH, "bAUTH" }, /* XXX 'b' */ 518943ee2b1SBill Fenner { TAG_VINES_SERVERS, "iVINES" }, 519943ee2b1SBill Fenner { TAG_SERVER_RANK, "sRANK" }, 520943ee2b1SBill Fenner { TAG_CLIENT_ARCH, "sARCH" }, 521943ee2b1SBill Fenner { TAG_CLIENT_NDI, "bNDI" }, /* XXX 'b' */ 522943ee2b1SBill Fenner { TAG_CLIENT_GUID, "bGUID" }, /* XXX 'b' */ 523943ee2b1SBill Fenner { TAG_LDAP_URL, "aLDAP" }, 524943ee2b1SBill Fenner { TAG_6OVER4, "i6o4" }, 525943ee2b1SBill Fenner { TAG_PRINTER_NAME, "aPRTR" }, 526943ee2b1SBill Fenner { TAG_MDHCP_SERVER, "bMDHCP" }, /* XXX 'b' */ 527943ee2b1SBill Fenner { TAG_IPX_COMPAT, "bIPX" }, /* XXX 'b' */ 528943ee2b1SBill Fenner { TAG_NETINFO_PARENT, "iNI" }, 529943ee2b1SBill Fenner { TAG_NETINFO_PARENT_TAG, "aNITAG" }, 530943ee2b1SBill Fenner { TAG_URL, "aURL" }, 531943ee2b1SBill Fenner { TAG_FAILOVER, "bFAIL" }, /* XXX 'b' */ 532943ee2b1SBill Fenner { 0, NULL } 533943ee2b1SBill Fenner }; 534943ee2b1SBill Fenner /* 2-byte extended tags */ 5353c602fabSXin LI static const struct tok xtag2str[] = { 5364edb46e9SPaul Traina { 0, NULL } 5374edb46e9SPaul Traina }; 5384edb46e9SPaul Traina 539a1c2090eSBill Fenner /* DHCP "options overload" types */ 5403c602fabSXin LI static const struct tok oo2str[] = { 541a1c2090eSBill Fenner { 1, "file" }, 542a1c2090eSBill Fenner { 2, "sname" }, 543a1c2090eSBill Fenner { 3, "file+sname" }, 544a1c2090eSBill Fenner { 0, NULL } 545a1c2090eSBill Fenner }; 546a1c2090eSBill Fenner 547a1c2090eSBill Fenner /* NETBIOS over TCP/IP node type options */ 5483c602fabSXin LI static const struct tok nbo2str[] = { 549a1c2090eSBill Fenner { 0x1, "b-node" }, 550a1c2090eSBill Fenner { 0x2, "p-node" }, 551a1c2090eSBill Fenner { 0x4, "m-node" }, 552a1c2090eSBill Fenner { 0x8, "h-node" }, 553a1c2090eSBill Fenner { 0, NULL } 554a1c2090eSBill Fenner }; 555a1c2090eSBill Fenner 556a1c2090eSBill Fenner /* ARP Hardware types, for Client-ID option */ 5573c602fabSXin LI static const struct tok arp2str[] = { 558a1c2090eSBill Fenner { 0x1, "ether" }, 559a1c2090eSBill Fenner { 0x6, "ieee802" }, 560a1c2090eSBill Fenner { 0x7, "arcnet" }, 561a1c2090eSBill Fenner { 0xf, "frelay" }, 562a1c2090eSBill Fenner { 0x17, "strip" }, 563a1c2090eSBill Fenner { 0x18, "ieee1394" }, 564a1c2090eSBill Fenner { 0, NULL } 565a1c2090eSBill Fenner }; 566a1c2090eSBill Fenner 5673c602fabSXin LI static const struct tok dhcp_msg_values[] = { 568abf25193SMax Laier { DHCPDISCOVER, "Discover" }, 569abf25193SMax Laier { DHCPOFFER, "Offer" }, 570abf25193SMax Laier { DHCPREQUEST, "Request" }, 571abf25193SMax Laier { DHCPDECLINE, "Decline" }, 572abf25193SMax Laier { DHCPACK, "ACK" }, 573abf25193SMax Laier { DHCPNAK, "NACK" }, 574abf25193SMax Laier { DHCPRELEASE, "Release" }, 575abf25193SMax Laier { DHCPINFORM, "Inform" }, 576abf25193SMax Laier { 0, NULL } 577abf25193SMax Laier }; 578abf25193SMax Laier 579a5779b6eSRui Paulo #define AGENT_SUBOPTION_CIRCUIT_ID 1 /* RFC 3046 */ 580a5779b6eSRui Paulo #define AGENT_SUBOPTION_REMOTE_ID 2 /* RFC 3046 */ 581a5779b6eSRui Paulo #define AGENT_SUBOPTION_SUBSCRIBER_ID 6 /* RFC 3993 */ 5823c602fabSXin LI static const struct tok agent_suboption_values[] = { 583abf25193SMax Laier { AGENT_SUBOPTION_CIRCUIT_ID, "Circuit-ID" }, 584a5779b6eSRui Paulo { AGENT_SUBOPTION_REMOTE_ID, "Remote-ID" }, 585a5779b6eSRui Paulo { AGENT_SUBOPTION_SUBSCRIBER_ID, "Subscriber-ID" }, 586abf25193SMax Laier { 0, NULL } 587abf25193SMax Laier }; 588abf25193SMax Laier 589abf25193SMax Laier 5904edb46e9SPaul Traina static void 5913c602fabSXin LI rfc1048_print(netdissect_options *ndo, 5923c602fabSXin LI register const u_char *bp) 5934edb46e9SPaul Traina { 5943c602fabSXin LI register uint16_t tag; 595abf25193SMax Laier register u_int len; 5964edb46e9SPaul Traina register const char *cp; 5974edb46e9SPaul Traina register char c; 598abf25193SMax Laier int first, idx; 5993c602fabSXin LI uint32_t ul; 6003c602fabSXin LI uint16_t us; 6013c602fabSXin LI uint8_t uc, subopt, suboptlen; 6024edb46e9SPaul Traina 6033c602fabSXin LI ND_PRINT((ndo, "\n\t Vendor-rfc1048 Extensions")); 6044edb46e9SPaul Traina 6054edb46e9SPaul Traina /* Step over magic cookie */ 6063c602fabSXin LI ND_PRINT((ndo, "\n\t Magic Cookie 0x%08x", EXTRACT_32BITS(bp))); 6074edb46e9SPaul Traina bp += sizeof(int32_t); 6084edb46e9SPaul Traina 6094edb46e9SPaul Traina /* Loop while we there is a tag left in the buffer */ 6103c602fabSXin LI while (ND_TTEST2(*bp, 1)) { 6114edb46e9SPaul Traina tag = *bp++; 6123c602fabSXin LI if (tag == TAG_PAD && ndo->ndo_vflag < 3) 6134edb46e9SPaul Traina continue; 6143c602fabSXin LI if (tag == TAG_END && ndo->ndo_vflag < 3) 6154edb46e9SPaul Traina return; 616943ee2b1SBill Fenner if (tag == TAG_EXTENDED_OPTION) { 6173c602fabSXin LI ND_TCHECK2(*(bp + 1), 2); 618943ee2b1SBill Fenner tag = EXTRACT_16BITS(bp + 1); 619943ee2b1SBill Fenner /* XXX we don't know yet if the IANA will 620943ee2b1SBill Fenner * preclude overlap of 1-byte and 2-byte spaces. 621943ee2b1SBill Fenner * If not, we need to offset tag after this step. 622943ee2b1SBill Fenner */ 6230e0def19SBill Fenner cp = tok2str(xtag2str, "?xT%u", tag); 624943ee2b1SBill Fenner } else 6250e0def19SBill Fenner cp = tok2str(tag2str, "?T%u", tag); 6264edb46e9SPaul Traina c = *cp++; 6274edb46e9SPaul Traina 628abf25193SMax Laier if (tag == TAG_PAD || tag == TAG_END) 629abf25193SMax Laier len = 0; 630abf25193SMax Laier else { 6314edb46e9SPaul Traina /* Get the length; check for truncation */ 6323c602fabSXin LI ND_TCHECK2(*bp, 1); 6334edb46e9SPaul Traina len = *bp++; 634abf25193SMax Laier } 635abf25193SMax Laier 6363c602fabSXin LI ND_PRINT((ndo, "\n\t %s Option %u, length %u%s", cp, tag, len, 6373c602fabSXin LI len > 0 ? ": " : "")); 638abf25193SMax Laier 6393c602fabSXin LI if (tag == TAG_PAD && ndo->ndo_vflag > 2) { 640abf25193SMax Laier u_int ntag = 1; 6413c602fabSXin LI while (ND_TTEST2(*bp, 1) && *bp == TAG_PAD) { 642abf25193SMax Laier bp++; 643abf25193SMax Laier ntag++; 644abf25193SMax Laier } 645abf25193SMax Laier if (ntag > 1) 6463c602fabSXin LI ND_PRINT((ndo, ", occurs %u", ntag)); 647abf25193SMax Laier } 648abf25193SMax Laier 6493c602fabSXin LI if (!ND_TTEST2(*bp, len)) { 6503c602fabSXin LI ND_PRINT((ndo, "[|rfc1048 %u]", len)); 6514edb46e9SPaul Traina return; 6524edb46e9SPaul Traina } 6534edb46e9SPaul Traina 654a88113a8SBill Fenner if (tag == TAG_DHCP_MESSAGE && len == 1) { 6550e0def19SBill Fenner uc = *bp++; 6563c602fabSXin LI ND_PRINT((ndo, "%s", tok2str(dhcp_msg_values, "Unknown (%u)", uc))); 657a88113a8SBill Fenner continue; 658a88113a8SBill Fenner } 659a88113a8SBill Fenner 660a88113a8SBill Fenner if (tag == TAG_PARM_REQUEST) { 661abf25193SMax Laier idx = 0; 662a88113a8SBill Fenner while (len-- > 0) { 6630e0def19SBill Fenner uc = *bp++; 664abf25193SMax Laier cp = tok2str(tag2str, "?Option %u", uc); 665abf25193SMax Laier if (idx % 4 == 0) 6663c602fabSXin LI ND_PRINT((ndo, "\n\t ")); 667abf25193SMax Laier else 6683c602fabSXin LI ND_PRINT((ndo, ", ")); 6693c602fabSXin LI ND_PRINT((ndo, "%s", cp + 1)); 670abf25193SMax Laier idx++; 671943ee2b1SBill Fenner } 672943ee2b1SBill Fenner continue; 673943ee2b1SBill Fenner } 674abf25193SMax Laier 675943ee2b1SBill Fenner if (tag == TAG_EXTENDED_REQUEST) { 676943ee2b1SBill Fenner first = 1; 677943ee2b1SBill Fenner while (len > 1) { 678943ee2b1SBill Fenner len -= 2; 6790e0def19SBill Fenner us = EXTRACT_16BITS(bp); 680943ee2b1SBill Fenner bp += 2; 6810e0def19SBill Fenner cp = tok2str(xtag2str, "?xT%u", us); 682a88113a8SBill Fenner if (!first) 6833c602fabSXin LI ND_PRINT((ndo, "+")); 6843c602fabSXin LI ND_PRINT((ndo, "%s", cp + 1)); 685a88113a8SBill Fenner first = 0; 686a88113a8SBill Fenner } 687a88113a8SBill Fenner continue; 688a88113a8SBill Fenner } 689a88113a8SBill Fenner 6904edb46e9SPaul Traina /* Print data */ 6914edb46e9SPaul Traina if (c == '?') { 6924edb46e9SPaul Traina /* Base default formats for unknown tags on data size */ 693abf25193SMax Laier if (len & 1) 6944edb46e9SPaul Traina c = 'b'; 695abf25193SMax Laier else if (len & 2) 6964edb46e9SPaul Traina c = 's'; 6974edb46e9SPaul Traina else 6984edb46e9SPaul Traina c = 'l'; 6994edb46e9SPaul Traina } 7004edb46e9SPaul Traina first = 1; 7014edb46e9SPaul Traina switch (c) { 7024edb46e9SPaul Traina 7034edb46e9SPaul Traina case 'a': 7044edb46e9SPaul Traina /* ascii strings */ 7053c602fabSXin LI ND_PRINT((ndo, "\"")); 7063c602fabSXin LI if (fn_printn(ndo, bp, len, ndo->ndo_snapend)) { 7073c602fabSXin LI ND_PRINT((ndo, "\"")); 70829292c17SSam Leffler goto trunc; 70929292c17SSam Leffler } 7103c602fabSXin LI ND_PRINT((ndo, "\"")); 711abf25193SMax Laier bp += len; 712abf25193SMax Laier len = 0; 7134edb46e9SPaul Traina break; 7144edb46e9SPaul Traina 7154edb46e9SPaul Traina case 'i': 7164edb46e9SPaul Traina case 'l': 717943ee2b1SBill Fenner case 'L': 7184edb46e9SPaul Traina /* ip addresses/32-bit words */ 719abf25193SMax Laier while (len >= sizeof(ul)) { 7204edb46e9SPaul Traina if (!first) 7213c602fabSXin LI ND_PRINT((ndo, ",")); 722943ee2b1SBill Fenner ul = EXTRACT_32BITS(bp); 723943ee2b1SBill Fenner if (c == 'i') { 724943ee2b1SBill Fenner ul = htonl(ul); 7253c602fabSXin LI ND_PRINT((ndo, "%s", ipaddr_string(ndo, &ul))); 726943ee2b1SBill Fenner } else if (c == 'L') 7273c602fabSXin LI ND_PRINT((ndo, "%d", ul)); 7284edb46e9SPaul Traina else 7293c602fabSXin LI ND_PRINT((ndo, "%u", ul)); 7304edb46e9SPaul Traina bp += sizeof(ul); 731abf25193SMax Laier len -= sizeof(ul); 7324edb46e9SPaul Traina first = 0; 7334edb46e9SPaul Traina } 7344edb46e9SPaul Traina break; 7354edb46e9SPaul Traina 736a88113a8SBill Fenner case 'p': 737a88113a8SBill Fenner /* IP address pairs */ 738abf25193SMax Laier while (len >= 2*sizeof(ul)) { 739a88113a8SBill Fenner if (!first) 7403c602fabSXin LI ND_PRINT((ndo, ",")); 741a1c2090eSBill Fenner memcpy((char *)&ul, (const char *)bp, sizeof(ul)); 7423c602fabSXin LI ND_PRINT((ndo, "(%s:", ipaddr_string(ndo, &ul))); 743a88113a8SBill Fenner bp += sizeof(ul); 744a1c2090eSBill Fenner memcpy((char *)&ul, (const char *)bp, sizeof(ul)); 7453c602fabSXin LI ND_PRINT((ndo, "%s)", ipaddr_string(ndo, &ul))); 746a88113a8SBill Fenner bp += sizeof(ul); 747abf25193SMax Laier len -= 2*sizeof(ul); 748a88113a8SBill Fenner first = 0; 749a88113a8SBill Fenner } 750a88113a8SBill Fenner break; 751a88113a8SBill Fenner 7524edb46e9SPaul Traina case 's': 7534edb46e9SPaul Traina /* shorts */ 754abf25193SMax Laier while (len >= sizeof(us)) { 7554edb46e9SPaul Traina if (!first) 7563c602fabSXin LI ND_PRINT((ndo, ",")); 757943ee2b1SBill Fenner us = EXTRACT_16BITS(bp); 7583c602fabSXin LI ND_PRINT((ndo, "%u", us)); 7594edb46e9SPaul Traina bp += sizeof(us); 760abf25193SMax Laier len -= sizeof(us); 7614edb46e9SPaul Traina first = 0; 7624edb46e9SPaul Traina } 7634edb46e9SPaul Traina break; 7644edb46e9SPaul Traina 765a88113a8SBill Fenner case 'B': 766a88113a8SBill Fenner /* boolean */ 767abf25193SMax Laier while (len > 0) { 768a88113a8SBill Fenner if (!first) 7693c602fabSXin LI ND_PRINT((ndo, ",")); 770a88113a8SBill Fenner switch (*bp) { 771a88113a8SBill Fenner case 0: 7723c602fabSXin LI ND_PRINT((ndo, "N")); 773a88113a8SBill Fenner break; 774a88113a8SBill Fenner case 1: 7753c602fabSXin LI ND_PRINT((ndo, "Y")); 776a88113a8SBill Fenner break; 777a88113a8SBill Fenner default: 7783c602fabSXin LI ND_PRINT((ndo, "%u?", *bp)); 779a88113a8SBill Fenner break; 780a88113a8SBill Fenner } 781a88113a8SBill Fenner ++bp; 782abf25193SMax Laier --len; 783a88113a8SBill Fenner first = 0; 784a88113a8SBill Fenner } 785a88113a8SBill Fenner break; 786a88113a8SBill Fenner 7874edb46e9SPaul Traina case 'b': 788943ee2b1SBill Fenner case 'x': 7894edb46e9SPaul Traina default: 7904edb46e9SPaul Traina /* Bytes */ 791abf25193SMax Laier while (len > 0) { 7924edb46e9SPaul Traina if (!first) 7933c602fabSXin LI ND_PRINT((ndo, c == 'x' ? ":" : ".")); 794a1c2090eSBill Fenner if (c == 'x') 7953c602fabSXin LI ND_PRINT((ndo, "%02x", *bp)); 796a1c2090eSBill Fenner else 7973c602fabSXin LI ND_PRINT((ndo, "%u", *bp)); 7984edb46e9SPaul Traina ++bp; 799abf25193SMax Laier --len; 8004edb46e9SPaul Traina first = 0; 8014edb46e9SPaul Traina } 8024edb46e9SPaul Traina break; 803a1c2090eSBill Fenner 804a1c2090eSBill Fenner case '$': 805a1c2090eSBill Fenner /* Guys we can't handle with one of the usual cases */ 806a1c2090eSBill Fenner switch (tag) { 807a1c2090eSBill Fenner 808a1c2090eSBill Fenner case TAG_NETBIOS_NODE: 809abf25193SMax Laier /* this option should be at least 1 byte long */ 810abf25193SMax Laier if (len < 1) { 811*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "ERROR: length < 1 bytes")); 812abf25193SMax Laier break; 813abf25193SMax Laier } 814a1c2090eSBill Fenner tag = *bp++; 815abf25193SMax Laier --len; 8163c602fabSXin LI ND_PRINT((ndo, "%s", tok2str(nbo2str, NULL, tag))); 817a1c2090eSBill Fenner break; 818a1c2090eSBill Fenner 819a1c2090eSBill Fenner case TAG_OPT_OVERLOAD: 820abf25193SMax Laier /* this option should be at least 1 byte long */ 821abf25193SMax Laier if (len < 1) { 822*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "ERROR: length < 1 bytes")); 823abf25193SMax Laier break; 824abf25193SMax Laier } 825a1c2090eSBill Fenner tag = *bp++; 826abf25193SMax Laier --len; 8273c602fabSXin LI ND_PRINT((ndo, "%s", tok2str(oo2str, NULL, tag))); 828a1c2090eSBill Fenner break; 829a1c2090eSBill Fenner 830a1c2090eSBill Fenner case TAG_CLIENT_FQDN: 831abf25193SMax Laier /* this option should be at least 3 bytes long */ 832abf25193SMax Laier if (len < 3) { 833*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "ERROR: length < 3 bytes")); 834abf25193SMax Laier bp += len; 835abf25193SMax Laier len = 0; 836cc391cceSBruce M Simpson break; 83729292c17SSam Leffler } 838a1c2090eSBill Fenner if (*bp) 8393c602fabSXin LI ND_PRINT((ndo, "[%s] ", client_fqdn_flags(*bp))); 840abf25193SMax Laier bp++; 841abf25193SMax Laier if (*bp || *(bp+1)) 8423c602fabSXin LI ND_PRINT((ndo, "%u/%u ", *bp, *(bp+1))); 843a1c2090eSBill Fenner bp += 2; 8443c602fabSXin LI ND_PRINT((ndo, "\"")); 8453c602fabSXin LI if (fn_printn(ndo, bp, len - 3, ndo->ndo_snapend)) { 8463c602fabSXin LI ND_PRINT((ndo, "\"")); 84729292c17SSam Leffler goto trunc; 84829292c17SSam Leffler } 8493c602fabSXin LI ND_PRINT((ndo, "\"")); 850abf25193SMax Laier bp += len - 3; 851abf25193SMax Laier len = 0; 852a1c2090eSBill Fenner break; 853a1c2090eSBill Fenner 854a1c2090eSBill Fenner case TAG_CLIENT_ID: 855*8bdc5a62SPatrick Kelsey { 856*8bdc5a62SPatrick Kelsey int type; 857abf25193SMax Laier 858abf25193SMax Laier /* this option should be at least 1 byte long */ 859abf25193SMax Laier if (len < 1) { 860*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "ERROR: length < 1 bytes")); 861abf25193SMax Laier break; 862abf25193SMax Laier } 863abf25193SMax Laier type = *bp++; 864abf25193SMax Laier len--; 865a1c2090eSBill Fenner if (type == 0) { 8663c602fabSXin LI ND_PRINT((ndo, "\"")); 8673c602fabSXin LI if (fn_printn(ndo, bp, len, ndo->ndo_snapend)) { 8683c602fabSXin LI ND_PRINT((ndo, "\"")); 86929292c17SSam Leffler goto trunc; 87029292c17SSam Leffler } 8713c602fabSXin LI ND_PRINT((ndo, "\"")); 872abf25193SMax Laier bp += len; 873abf25193SMax Laier len = 0; 874a1c2090eSBill Fenner break; 875a1c2090eSBill Fenner } else { 8763c602fabSXin LI ND_PRINT((ndo, "%s ", tok2str(arp2str, "hardware-type %u,", type))); 877abf25193SMax Laier while (len > 0) { 878a1c2090eSBill Fenner if (!first) 8793c602fabSXin LI ND_PRINT((ndo, ":")); 8803c602fabSXin LI ND_PRINT((ndo, "%02x", *bp)); 881a1c2090eSBill Fenner ++bp; 882abf25193SMax Laier --len; 883a1c2090eSBill Fenner first = 0; 884a1c2090eSBill Fenner } 885abf25193SMax Laier } 886a1c2090eSBill Fenner break; 887a1c2090eSBill Fenner } 888a1c2090eSBill Fenner 889abf25193SMax Laier case TAG_AGENT_CIRCUIT: 890abf25193SMax Laier while (len >= 2) { 891abf25193SMax Laier subopt = *bp++; 892abf25193SMax Laier suboptlen = *bp++; 893abf25193SMax Laier len -= 2; 894abf25193SMax Laier if (suboptlen > len) { 8953c602fabSXin LI ND_PRINT((ndo, "\n\t %s SubOption %u, length %u: length goes past end of option", 896abf25193SMax Laier tok2str(agent_suboption_values, "Unknown", subopt), 897abf25193SMax Laier subopt, 8983c602fabSXin LI suboptlen)); 899abf25193SMax Laier bp += len; 900abf25193SMax Laier len = 0; 901abf25193SMax Laier break; 902abf25193SMax Laier } 9033c602fabSXin LI ND_PRINT((ndo, "\n\t %s SubOption %u, length %u: ", 904abf25193SMax Laier tok2str(agent_suboption_values, "Unknown", subopt), 905abf25193SMax Laier subopt, 9063c602fabSXin LI suboptlen)); 907abf25193SMax Laier switch (subopt) { 908abf25193SMax Laier 909a5779b6eSRui Paulo case AGENT_SUBOPTION_CIRCUIT_ID: /* fall through */ 910a5779b6eSRui Paulo case AGENT_SUBOPTION_REMOTE_ID: 911a5779b6eSRui Paulo case AGENT_SUBOPTION_SUBSCRIBER_ID: 912*8bdc5a62SPatrick Kelsey if (fn_printn(ndo, bp, suboptlen, ndo->ndo_snapend)) 913*8bdc5a62SPatrick Kelsey goto trunc; 914abf25193SMax Laier break; 915abf25193SMax Laier 916abf25193SMax Laier default: 9173c602fabSXin LI print_unknown_data(ndo, bp, "\n\t\t", suboptlen); 918abf25193SMax Laier } 919abf25193SMax Laier 920abf25193SMax Laier len -= suboptlen; 921abf25193SMax Laier bp += suboptlen; 922abf25193SMax Laier } 923abf25193SMax Laier break; 924abf25193SMax Laier 925abf25193SMax Laier case TAG_CLASSLESS_STATIC_RT: 926abf25193SMax Laier case TAG_CLASSLESS_STA_RT_MS: 927abf25193SMax Laier { 928abf25193SMax Laier u_int mask_width, significant_octets, i; 929abf25193SMax Laier 930abf25193SMax Laier /* this option should be at least 5 bytes long */ 931abf25193SMax Laier if (len < 5) { 932*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "ERROR: length < 5 bytes")); 933abf25193SMax Laier bp += len; 934abf25193SMax Laier len = 0; 935abf25193SMax Laier break; 936abf25193SMax Laier } 937abf25193SMax Laier while (len > 0) { 938abf25193SMax Laier if (!first) 9393c602fabSXin LI ND_PRINT((ndo, ",")); 940abf25193SMax Laier mask_width = *bp++; 941abf25193SMax Laier len--; 942abf25193SMax Laier /* mask_width <= 32 */ 943abf25193SMax Laier if (mask_width > 32) { 9443c602fabSXin LI ND_PRINT((ndo, "[ERROR: Mask width (%d) > 32]", mask_width)); 945abf25193SMax Laier bp += len; 946abf25193SMax Laier len = 0; 947abf25193SMax Laier break; 948abf25193SMax Laier } 949abf25193SMax Laier significant_octets = (mask_width + 7) / 8; 950abf25193SMax Laier /* significant octets + router(4) */ 951abf25193SMax Laier if (len < significant_octets + 4) { 9523c602fabSXin LI ND_PRINT((ndo, "[ERROR: Remaining length (%u) < %u bytes]", len, significant_octets + 4)); 953abf25193SMax Laier bp += len; 954abf25193SMax Laier len = 0; 955abf25193SMax Laier break; 956abf25193SMax Laier } 9573c602fabSXin LI ND_PRINT((ndo, "(")); 958abf25193SMax Laier if (mask_width == 0) 9593c602fabSXin LI ND_PRINT((ndo, "default")); 960abf25193SMax Laier else { 961abf25193SMax Laier for (i = 0; i < significant_octets ; i++) { 962abf25193SMax Laier if (i > 0) 9633c602fabSXin LI ND_PRINT((ndo, ".")); 9643c602fabSXin LI ND_PRINT((ndo, "%d", *bp++)); 965abf25193SMax Laier } 966abf25193SMax Laier for (i = significant_octets ; i < 4 ; i++) 9673c602fabSXin LI ND_PRINT((ndo, ".0")); 9683c602fabSXin LI ND_PRINT((ndo, "/%d", mask_width)); 969abf25193SMax Laier } 970abf25193SMax Laier memcpy((char *)&ul, (const char *)bp, sizeof(ul)); 9713c602fabSXin LI ND_PRINT((ndo, ":%s)", ipaddr_string(ndo, &ul))); 972abf25193SMax Laier bp += sizeof(ul); 973abf25193SMax Laier len -= (significant_octets + 4); 974abf25193SMax Laier first = 0; 975abf25193SMax Laier } 976*8bdc5a62SPatrick Kelsey break; 977*8bdc5a62SPatrick Kelsey } 978*8bdc5a62SPatrick Kelsey 979*8bdc5a62SPatrick Kelsey case TAG_USER_CLASS: 980*8bdc5a62SPatrick Kelsey { 981*8bdc5a62SPatrick Kelsey u_int suboptnumber = 1; 982*8bdc5a62SPatrick Kelsey 983*8bdc5a62SPatrick Kelsey first = 1; 984*8bdc5a62SPatrick Kelsey if (len < 2) { 985*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "ERROR: length < 2 bytes")); 986*8bdc5a62SPatrick Kelsey bp += len; 987*8bdc5a62SPatrick Kelsey len = 0; 988*8bdc5a62SPatrick Kelsey break; 989*8bdc5a62SPatrick Kelsey } 990*8bdc5a62SPatrick Kelsey while (len > 0) { 991*8bdc5a62SPatrick Kelsey suboptlen = *bp++; 992*8bdc5a62SPatrick Kelsey len--; 993*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "\n\t ")); 994*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "instance#%u: ", suboptnumber)); 995*8bdc5a62SPatrick Kelsey if (suboptlen == 0) { 996*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "ERROR: suboption length must be non-zero")); 997*8bdc5a62SPatrick Kelsey bp += len; 998*8bdc5a62SPatrick Kelsey len = 0; 999*8bdc5a62SPatrick Kelsey break; 1000*8bdc5a62SPatrick Kelsey } 1001*8bdc5a62SPatrick Kelsey if (len < suboptlen) { 1002*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "ERROR: malformed option")); 1003*8bdc5a62SPatrick Kelsey bp += len; 1004*8bdc5a62SPatrick Kelsey len = 0; 1005*8bdc5a62SPatrick Kelsey break; 1006*8bdc5a62SPatrick Kelsey } 1007*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "\"")); 1008*8bdc5a62SPatrick Kelsey if (fn_printn(ndo, bp, suboptlen, ndo->ndo_snapend)) { 1009*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "\"")); 1010*8bdc5a62SPatrick Kelsey goto trunc; 1011*8bdc5a62SPatrick Kelsey } 1012*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, "\"")); 1013*8bdc5a62SPatrick Kelsey ND_PRINT((ndo, ", length %d", suboptlen)); 1014*8bdc5a62SPatrick Kelsey suboptnumber++; 1015*8bdc5a62SPatrick Kelsey len -= suboptlen; 1016*8bdc5a62SPatrick Kelsey bp += suboptlen; 1017abf25193SMax Laier } 1018abf25193SMax Laier break; 1019*8bdc5a62SPatrick Kelsey } 1020abf25193SMax Laier 1021a1c2090eSBill Fenner default: 10223c602fabSXin LI ND_PRINT((ndo, "[unknown special tag %u, size %u]", 10233c602fabSXin LI tag, len)); 1024abf25193SMax Laier bp += len; 1025abf25193SMax Laier len = 0; 1026a1c2090eSBill Fenner break; 1027a1c2090eSBill Fenner } 1028a1c2090eSBill Fenner break; 10294edb46e9SPaul Traina } 10304edb46e9SPaul Traina /* Data left over? */ 1031abf25193SMax Laier if (len) { 10323c602fabSXin LI ND_PRINT((ndo, "\n\t trailing data length %u", len)); 1033abf25193SMax Laier bp += len; 1034cc391cceSBruce M Simpson } 10354edb46e9SPaul Traina } 1036943ee2b1SBill Fenner return; 1037943ee2b1SBill Fenner trunc: 10383c602fabSXin LI ND_PRINT((ndo, "|[rfc1048]")); 10394edb46e9SPaul Traina } 10404edb46e9SPaul Traina 10414edb46e9SPaul Traina static void 10423c602fabSXin LI cmu_print(netdissect_options *ndo, 10433c602fabSXin LI register const u_char *bp) 10444edb46e9SPaul Traina { 10454edb46e9SPaul Traina register const struct cmu_vend *cmu; 10464edb46e9SPaul Traina 10473c602fabSXin LI #define PRINTCMUADDR(m, s) { ND_TCHECK(cmu->m); \ 10484edb46e9SPaul Traina if (cmu->m.s_addr != 0) \ 10493c602fabSXin LI ND_PRINT((ndo, " %s:%s", s, ipaddr_string(ndo, &cmu->m.s_addr))); } 10504edb46e9SPaul Traina 10513c602fabSXin LI ND_PRINT((ndo, " vend-cmu")); 1052a1c2090eSBill Fenner cmu = (const struct cmu_vend *)bp; 10534edb46e9SPaul Traina 10544edb46e9SPaul Traina /* Only print if there are unknown bits */ 10553c602fabSXin LI ND_TCHECK(cmu->v_flags); 10564edb46e9SPaul Traina if ((cmu->v_flags & ~(VF_SMASK)) != 0) 10573c602fabSXin LI ND_PRINT((ndo, " F:0x%x", cmu->v_flags)); 10584edb46e9SPaul Traina PRINTCMUADDR(v_dgate, "DG"); 10594edb46e9SPaul Traina PRINTCMUADDR(v_smask, cmu->v_flags & VF_SMASK ? "SM" : "SM*"); 10604edb46e9SPaul Traina PRINTCMUADDR(v_dns1, "NS1"); 10614edb46e9SPaul Traina PRINTCMUADDR(v_dns2, "NS2"); 10624edb46e9SPaul Traina PRINTCMUADDR(v_ins1, "IEN1"); 10634edb46e9SPaul Traina PRINTCMUADDR(v_ins2, "IEN2"); 10644edb46e9SPaul Traina PRINTCMUADDR(v_ts1, "TS1"); 10654edb46e9SPaul Traina PRINTCMUADDR(v_ts2, "TS2"); 10664edb46e9SPaul Traina return; 10674edb46e9SPaul Traina 10684edb46e9SPaul Traina trunc: 10693c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 10704edb46e9SPaul Traina #undef PRINTCMUADDR 10714edb46e9SPaul Traina } 1072abf25193SMax Laier 1073abf25193SMax Laier static char * 1074abf25193SMax Laier client_fqdn_flags(u_int flags) 1075abf25193SMax Laier { 1076abf25193SMax Laier static char buf[8+1]; 1077abf25193SMax Laier int i = 0; 1078abf25193SMax Laier 1079abf25193SMax Laier if (flags & CLIENT_FQDN_FLAGS_S) 1080abf25193SMax Laier buf[i++] = 'S'; 1081abf25193SMax Laier if (flags & CLIENT_FQDN_FLAGS_O) 1082abf25193SMax Laier buf[i++] = 'O'; 1083abf25193SMax Laier if (flags & CLIENT_FQDN_FLAGS_E) 1084abf25193SMax Laier buf[i++] = 'E'; 1085abf25193SMax Laier if (flags & CLIENT_FQDN_FLAGS_N) 1086abf25193SMax Laier buf[i++] = 'N'; 1087abf25193SMax Laier buf[i] = '\0'; 1088abf25193SMax Laier 1089abf25193SMax Laier return buf; 1090abf25193SMax Laier } 1091