From Kevin Steves: in the client FQDN option:
authorguy <guy>
Mon, 29 Jan 2007 20:56:00 +0000 (20:56 +0000)
committerguy <guy>
Mon, 29 Jan 2007 20:56:00 +0000 (20:56 +0000)
0) fix off by one (4 vs. 3)
1) print flag bits
2) print rcode fields if either is non-zero

bootp.h
print-bootp.c

diff --git a/bootp.h b/bootp.h
index d348379ba91394d6d2a1c523f0a8ea264b69d72d..e78e10bb0fe350023d94a6c420bd336d65892395 100644 (file)
--- a/bootp.h
+++ b/bootp.h
@@ -1,4 +1,4 @@
-/* @(#) $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.15.4.1 2007-01-29 20:56:00 guy Exp $ (LBL) */
 /*
  * Bootstrap Protocol (BOOTP).  RFC951 and RFC1048.
  *
@@ -218,3 +218,10 @@ struct cmu_vend {
 
 /* 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
index ddf678b9e4b76dca2ad0edbc61f7e19b59cbc1c8..bf3bcf8eb8a90f6b236fa62c170fcf779c03e42a 100644 (file)
@@ -22,7 +22,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-bootp.c,v 1.78.2.6 2007-01-14 22:40:57 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-bootp.c,v 1.78.2.7 2007-01-29 20:56:00 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -42,6 +42,7 @@ static const char rcsid[] _U_ =
 
 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]";
 
@@ -586,15 +587,16 @@ rfc1048_print(register const u_char *bp)
                                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)) {
@@ -714,3 +716,22 @@ trunc:
        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;
+}