-/* @(#) $Header: /tcpdump/master/tcpdump/bootp.h,v 1.15 2003-07-01 19:16:06 guy Exp $ (LBL) */
+/* @(#) $Header: /tcpdump/master/tcpdump/bootp.h,v 1.16 2007-01-29 20:55:01 guy Exp $ (LBL) */
/*
* Bootstrap Protocol (BOOTP). RFC951 and RFC1048.
*
/* v_flags values */
#define VF_SMASK 1 /* Subnet mask field contains valid data */
+
+/* RFC 4702 DHCP Client FQDN Option */
+
+#define CLIENT_FQDN_FLAGS_S 0x01
+#define CLIENT_FQDN_FLAGS_O 0x02
+#define CLIENT_FQDN_FLAGS_E 0x04
+#define CLIENT_FQDN_FLAGS_N 0x08
*/
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-bootp.c,v 1.84 2007-01-14 22:40:40 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-bootp.c,v 1.85 2007-01-29 20:55:01 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
static void rfc1048_print(const u_char *);
static void cmu_print(const u_char *);
+static char *client_fqdn_flags(u_int flags);
static char tstr[] = " [|bootp]";
break;
case TAG_CLIENT_FQDN:
- /* option 81 should be at least 4 bytes long */
- if (len < 4) {
- printf("ERROR: options 81 len %u < 4 bytes", len);
+ /* option 81 should be at least 3 bytes long */
+ if (len < 3) {
+ printf("ERROR: option 81 len %u < 3 bytes", len);
break;
}
- if (*bp++)
- printf("[svrreg]");
if (*bp)
- printf("%u/%u/", *bp, *(bp+1));
+ printf("[%s] ", client_fqdn_flags(*bp));
+ bp++;
+ if (*bp || *(bp+1))
+ printf("%u/%u ", *bp, *(bp+1));
bp += 2;
putchar('"');
if (fn_printn(bp, size - 3, snapend)) {
fputs(tstr, stdout);
#undef PRINTCMUADDR
}
+
+static char *
+client_fqdn_flags(u_int flags)
+{
+ static char buf[8+1];
+ int i = 0;
+
+ if (flags & CLIENT_FQDN_FLAGS_S)
+ buf[i++] = 'S';
+ if (flags & CLIENT_FQDN_FLAGS_O)
+ buf[i++] = 'O';
+ if (flags & CLIENT_FQDN_FLAGS_E)
+ buf[i++] = 'E';
+ if (flags & CLIENT_FQDN_FLAGS_N)
+ buf[i++] = 'N';
+ buf[i] = '\0';
+
+ return buf;
+}