]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-bootp.c
OpenFlow: Use bittok2str(), fix OF1.0 port status.
[tcpdump] / print-bootp.c
index 28aa27fb598a5f8b361f69c3c1792f191fd1887e..ce34d13dd0a173e0522e8362e0218e5307c82ac7 100644 (file)
@@ -195,7 +195,7 @@ struct bootp {
 #define TAG_CLASSLESS_STA_RT_MS        ((uint8_t) 249)
 /* RFC 5859 - TFTP Server Address Option for DHCPv4 */
 #define        TAG_TFTP_SERVER_ADDRESS ((uint8_t) 150)
-/* ftp://ftp.isi.edu/.../assignments/bootp-dhcp-extensions */
+/* https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp-parameters.xhtml */
 #define        TAG_SLP_NAMING_AUTH     ((uint8_t)  80)
 #define        TAG_CLIENT_FQDN         ((uint8_t)  81)
 #define        TAG_AGENT_CIRCUIT       ((uint8_t)  82)
@@ -203,8 +203,8 @@ struct bootp {
 #define        TAG_TZ_STRING           ((uint8_t)  88)
 #define        TAG_FQDN_OPTION         ((uint8_t)  89)
 #define        TAG_AUTH                ((uint8_t)  90)
-#define        TAG_VINES_SERVERS       ((uint8_t)  91)
-#define        TAG_SERVER_RANK         ((uint8_t)  92)
+#define        TAG_CLIENT_LAST_TRANSACTION_TIME        ((uint8_t)  91)
+#define        TAG_ASSOCIATED_IP                       ((uint8_t)  92)
 #define        TAG_CLIENT_ARCH         ((uint8_t)  93)
 #define        TAG_CLIENT_NDI          ((uint8_t)  94)
 #define        TAG_CLIENT_GUID         ((uint8_t)  97)
@@ -226,6 +226,12 @@ struct bootp {
 #define DHCPNAK                6
 #define DHCPRELEASE    7
 #define DHCPINFORM     8
+/* Defined in RFC4388 */
+#define DHCPLEASEQUERY       10
+#define DHCPLEASEUNASSIGNED  11
+#define DHCPLEASEUNKNOWN     12
+#define DHCPLEASEACTIVE      13
+
 
 /*
  * "vendor" data permitted for CMU bootp clients.
@@ -283,16 +289,13 @@ bootp_print(netdissect_options *ndo,
 
        ndo->ndo_protocol = "bootp";
        bp = (const struct bootp *)cp;
-       ND_TCHECK_1(bp->bp_op);
        bp_op = GET_U_1(bp->bp_op);
        ND_PRINT("BOOTP/DHCP, %s",
                  tok2str(bootp_op_values, "unknown (0x%02x)", bp_op));
 
-       ND_TCHECK_1(bp->bp_hlen);
        bp_htype = GET_U_1(bp->bp_htype);
        bp_hlen = GET_U_1(bp->bp_hlen);
        if (bp_htype == 1 && bp_hlen == 6 && bp_op == BOOTPREQUEST) {
-               ND_TCHECK_6(bp->bp_chaddr);
                ND_PRINT(" from %s", GET_ETHERADDR_STRING(bp->bp_chaddr));
        }
 
@@ -319,40 +322,33 @@ bootp_print(netdissect_options *ndo,
        if (GET_BE_U_2(bp->bp_secs))
                ND_PRINT(", secs %u", GET_BE_U_2(bp->bp_secs));
 
-       ND_TCHECK_2(bp->bp_flags);
        ND_PRINT(", Flags [%s]",
                  bittok2str(bootp_flag_values, "none", GET_BE_U_2(bp->bp_flags)));
        if (ndo->ndo_vflag > 1)
                ND_PRINT(" (0x%04x)", GET_BE_U_2(bp->bp_flags));
 
        /* Client's ip address */
-       ND_TCHECK_4(bp->bp_ciaddr);
        if (GET_IPV4_TO_NETWORK_ORDER(bp->bp_ciaddr))
                ND_PRINT("\n\t  Client-IP %s", GET_IPADDR_STRING(bp->bp_ciaddr));
 
        /* 'your' ip address (bootp client) */
-       ND_TCHECK_4(bp->bp_yiaddr);
        if (GET_IPV4_TO_NETWORK_ORDER(bp->bp_yiaddr))
                ND_PRINT("\n\t  Your-IP %s", GET_IPADDR_STRING(bp->bp_yiaddr));
 
        /* Server's ip address */
-       ND_TCHECK_4(bp->bp_siaddr);
        if (GET_IPV4_TO_NETWORK_ORDER(bp->bp_siaddr))
                ND_PRINT("\n\t  Server-IP %s", GET_IPADDR_STRING(bp->bp_siaddr));
 
        /* Gateway's ip address */
-       ND_TCHECK_4(bp->bp_giaddr);
        if (GET_IPV4_TO_NETWORK_ORDER(bp->bp_giaddr))
                ND_PRINT("\n\t  Gateway-IP %s", GET_IPADDR_STRING(bp->bp_giaddr));
 
        /* Client's Ethernet address */
        if (bp_htype == 1 && bp_hlen == 6) {
-               ND_TCHECK_6(bp->bp_chaddr);
                ND_PRINT("\n\t  Client-Ethernet-Address %s", GET_ETHERADDR_STRING(bp->bp_chaddr));
        }
 
-       ND_TCHECK_1(bp->bp_sname);              /* check first char only */
-       if (GET_U_1(bp->bp_sname)) {
+       if (GET_U_1(bp->bp_sname)) {    /* get first char only */
                ND_PRINT("\n\t  sname \"");
                if (nd_printztn(ndo, bp->bp_sname, (u_int)sizeof(bp->bp_sname),
                                ndo->ndo_snapend) == 0) {
@@ -362,8 +358,7 @@ bootp_print(netdissect_options *ndo,
                }
                ND_PRINT("\"");
        }
-       ND_TCHECK_1(bp->bp_file);               /* check first char only */
-       if (GET_U_1(bp->bp_file)) {
+       if (GET_U_1(bp->bp_file)) {     /* get first char only */
                ND_PRINT("\n\t  file \"");
                if (nd_printztn(ndo, bp->bp_file, (u_int)sizeof(bp->bp_file),
                                ndo->ndo_snapend) == 0) {
@@ -514,8 +509,8 @@ static const struct tok tag2str[] = {
        { TAG_TZ_STRING,        "aTZSTR" },
        { TAG_FQDN_OPTION,      "bFQDNS" },     /* XXX 'b' */
        { TAG_AUTH,             "bAUTH" },      /* XXX 'b' */
-       { TAG_VINES_SERVERS,    "iVINES" },
-       { TAG_SERVER_RANK,      "sRANK" },
+       { TAG_CLIENT_LAST_TRANSACTION_TIME, "LLast-Transaction-Time" },
+       { TAG_ASSOCIATED_IP,    "iAssociated-IP" },
        { TAG_CLIENT_ARCH,      "sARCH" },
        { TAG_CLIENT_NDI,       "bNDI" },       /* XXX 'b' */
        { TAG_CLIENT_GUID,      "bGUID" },      /* XXX 'b' */
@@ -558,14 +553,18 @@ static const struct tok arp2str[] = {
 };
 
 static const struct tok dhcp_msg_values[] = {
-       { DHCPDISCOVER, "Discover" },
-       { DHCPOFFER,    "Offer" },
-       { DHCPREQUEST,  "Request" },
-       { DHCPDECLINE,  "Decline" },
-       { DHCPACK,      "ACK" },
-       { DHCPNAK,      "NACK" },
-       { DHCPRELEASE,  "Release" },
-       { DHCPINFORM,   "Inform" },
+       { DHCPDISCOVER,        "Discover" },
+       { DHCPOFFER,           "Offer" },
+       { DHCPREQUEST,         "Request" },
+       { DHCPDECLINE,         "Decline" },
+       { DHCPACK,             "ACK" },
+       { DHCPNAK,             "NACK" },
+       { DHCPRELEASE,         "Release" },
+       { DHCPINFORM,          "Inform" },
+       { DHCPLEASEQUERY,      "LeaseQuery" },
+       { DHCPLEASEUNASSIGNED, "LeaseUnassigned" },
+       { DHCPLEASEUNKNOWN,    "LeaseUnknown" },
+       { DHCPLEASEACTIVE,     "LeaseActive" },
        { 0, NULL }
 };
 
@@ -605,19 +604,18 @@ rfc1048_print(netdissect_options *ndo,
                        continue;
                if (tag == TAG_END && ndo->ndo_vflag < 3)
                        return;
-               cp = tok2str(tag2str, "?T%u", tag);
+               cp = tok2str(tag2str, "?Unknown", tag);
                c = *cp++;
 
                if (tag == TAG_PAD || tag == TAG_END)
                        len = 0;
                else {
                        /* Get the length; check for truncation */
-                       ND_TCHECK_1(bp);
                        len = GET_U_1(bp);
                        bp++;
                }
 
-               ND_PRINT("\n\t    %s Option %u, length %u%s", cp, tag, len,
+               ND_PRINT("\n\t    %s (%u), length %u%s", cp, tag, len,
                          len > 0 ? ": " : "");
 
                if (tag == TAG_PAD && ndo->ndo_vflag > 2) {
@@ -643,15 +641,15 @@ rfc1048_print(netdissect_options *ndo,
                if (tag == TAG_PARM_REQUEST) {
                        idx = 0;
                        while (len > 0) {
-                               cp = tok2str(tag2str, "?Option %u",
-                                            GET_U_1(bp));
+                               uint8_t innertag = GET_U_1(bp);
                                bp++;
                                len--;
+                               cp = tok2str(tag2str, "?Unknown", innertag);
                                if (idx % 4 == 0)
                                        ND_PRINT("\n\t      ");
                                else
                                        ND_PRINT(", ");
-                               ND_PRINT("%s", cp + 1);
+                               ND_PRINT("%s (%u)", cp + 1, innertag);
                                idx++;
                        }
                        continue;