]> The Tcpdump Group git mirrors - tcpdump/commitdiff
clean up the bootp printer:
authorhannes <hannes>
Mon, 13 Feb 2006 19:02:05 +0000 (19:02 +0000)
committerhannes <hannes>
Mon, 13 Feb 2006 19:02:05 +0000 (19:02 +0000)
-print option/tag numbers and len
-change the tokenstring such that the most common options are human-readable
-add support for option 82 (Agent-ID) suboptions
-make more use ok tok2str() rather thane private lookalives

print-bootp.c

index c0077eeb23dbe30f7e085790ce5442c3d4f2f4ab..636bc1370f0ae9878c2c473fa14a2f53c74d7135 100644 (file)
@@ -22,7 +22,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-bootp.c,v 1.78.2.2 2005-05-06 04:19:39 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-bootp.c,v 1.78.2.3 2006-02-13 19:02:05 hannes Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -77,7 +77,7 @@ bootp_print(register const u_char *cp, u_int length)
                printf(" from %s", etheraddr_string(bp->bp_chaddr));
        }
 
-        printf(", length: %u", length);
+        printf(", length %u", length);
 
         if (!vflag)
             return;
@@ -86,21 +86,21 @@ bootp_print(register const u_char *cp, u_int length)
 
        /* The usual hardware address type is 1 (10Mb Ethernet) */
        if (bp->bp_htype != 1)
-               printf(", htype-#%d", bp->bp_htype);
+               printf(", htype %d", bp->bp_htype);
 
        /* The usual length for 10Mb Ethernet address is 6 bytes */
        if (bp->bp_htype != 1 || bp->bp_hlen != 6)
-               printf(", hlen:%d", bp->bp_hlen);
+               printf(", hlen %d", bp->bp_hlen);
 
        /* Only print interesting fields */
        if (bp->bp_hops)
-               printf(", hops:%d", bp->bp_hops);
+               printf(", hops %d", bp->bp_hops);
        if (bp->bp_xid)
-               printf(", xid:0x%x", EXTRACT_32BITS(&bp->bp_xid));
+               printf(", xid 0x%x", EXTRACT_32BITS(&bp->bp_xid));
        if (bp->bp_secs)
-               printf(", secs:%d", EXTRACT_16BITS(&bp->bp_secs));
+               printf(", secs %d", EXTRACT_16BITS(&bp->bp_secs));
 
-       printf(", flags: [%s]",
+       printf(", Flags [ %s ]",
               bittok2str(bootp_flag_values, "none", EXTRACT_16BITS(&bp->bp_flags)));
        if (vflag>1)
          printf( " (0x%04x)", EXTRACT_16BITS(&bp->bp_flags));
@@ -108,27 +108,27 @@ bootp_print(register const u_char *cp, u_int length)
        /* Client's ip address */
        TCHECK(bp->bp_ciaddr);
        if (bp->bp_ciaddr.s_addr)
-               printf("\n\t  Client IP: %s", ipaddr_string(&bp->bp_ciaddr));
+               printf("\n\t  Client-IP %s", ipaddr_string(&bp->bp_ciaddr));
 
        /* 'your' ip address (bootp client) */
        TCHECK(bp->bp_yiaddr);
        if (bp->bp_yiaddr.s_addr)
-               printf("\n\t  Your IP: %s", ipaddr_string(&bp->bp_yiaddr));
+               printf("\n\t  Your-IP %s", ipaddr_string(&bp->bp_yiaddr));
 
        /* Server's ip address */
        TCHECK(bp->bp_siaddr);
        if (bp->bp_siaddr.s_addr)
-               printf("\n\t  Server IP: %s", ipaddr_string(&bp->bp_siaddr));
+               printf("\n\t  Server-IP %s", ipaddr_string(&bp->bp_siaddr));
 
        /* Gateway's ip address */
        TCHECK(bp->bp_giaddr);
        if (bp->bp_giaddr.s_addr)
-               printf("\n\t  Gateway IP: %s", ipaddr_string(&bp->bp_giaddr));
+               printf("\n\t  Gateway-IP %s", ipaddr_string(&bp->bp_giaddr));
 
        /* Client's Ethernet address */
        if (bp->bp_htype == 1 && bp->bp_hlen == 6) {
                TCHECK2(bp->bp_chaddr[0], 6);
-               printf("\n\t  Client Ethernet Address: %s", etheraddr_string(bp->bp_chaddr));
+               printf("\n\t  Client-Ethernet-Address %s", etheraddr_string(bp->bp_chaddr));
        }
 
        TCHECK2(bp->bp_sname[0], 1);            /* check first char only */
@@ -189,23 +189,23 @@ trunc:
 static struct tok tag2str[] = {
 /* RFC1048 tags */
        { TAG_PAD,              " PAD" },
-       { TAG_SUBNET_MASK,      "iSM" },        /* subnet mask (RFC950) */
-       { TAG_TIME_OFFSET,      "LTZ" },        /* seconds from UTC */
-       { TAG_GATEWAY,          "iDG" },        /* default gateway */
-       { TAG_TIME_SERVER,      "iTS" },        /* time servers (RFC868) */
-       { TAG_NAME_SERVER,      "iIEN" },       /* IEN name servers (IEN116) */
-       { TAG_DOMAIN_SERVER,    "iNS" },        /* domain name (RFC1035) */
+       { TAG_SUBNET_MASK,      "iSubnet-Mask" },       /* subnet mask (RFC950) */
+       { TAG_TIME_OFFSET,      "LTime-Zone" }, /* seconds from UTC */
+       { TAG_GATEWAY,          "iDefault-Gateway" },   /* default gateway */
+       { TAG_TIME_SERVER,      "iTime-Server" },       /* time servers (RFC868) */
+       { TAG_NAME_SERVER,      "iIEN-Name-Server" },   /* IEN name servers (IEN116) */
+       { TAG_DOMAIN_SERVER,    "iDomain-Name-Server" },        /* domain name (RFC1035) */
        { TAG_LOG_SERVER,       "iLOG" },       /* MIT log servers */
        { TAG_COOKIE_SERVER,    "iCS" },        /* cookie servers (RFC865) */
-       { TAG_LPR_SERVER,       "iLPR" },       /* lpr server (RFC1179) */
+       { TAG_LPR_SERVER,       "iLPR-Server" },        /* lpr server (RFC1179) */
        { TAG_IMPRESS_SERVER,   "iIM" },        /* impress servers (Imagen) */
        { TAG_RLP_SERVER,       "iRL" },        /* resource location (RFC887) */
-       { TAG_HOSTNAME,         "aHN" },        /* ascii hostname */
+       { TAG_HOSTNAME,         "aHostname" },  /* ascii hostname */
        { TAG_BOOTSIZE,         "sBS" },        /* 512 byte blocks */
        { TAG_END,              " END" },
 /* RFC1497 tags */
        { TAG_DUMPPATH,         "aDP" },
-       { TAG_DOMAINNAME,       "aDN" },
+       { TAG_DOMAINNAME,       "aDomain-Name" },
        { TAG_SWAP_SERVER,      "iSS" },
        { TAG_ROOTPATH,         "aRP" },
        { TAG_EXTPATH,          "aEP" },
@@ -215,16 +215,16 @@ static struct tok tag2str[] = {
        { TAG_PFILTERS,         "pPF" },
        { TAG_REASS_SIZE,       "sRSZ" },
        { TAG_DEF_TTL,          "bTTL" },
-       { TAG_MTU_TIMEOUT,      "lMA" },
-       { TAG_MTU_TABLE,        "sMT" },
+       { TAG_MTU_TIMEOUT,      "lMTU-Timeout" },
+       { TAG_MTU_TABLE,        "sMTU-Table" },
        { TAG_INT_MTU,          "sMTU" },
        { TAG_LOCAL_SUBNETS,    "BLSN" },
        { TAG_BROAD_ADDR,       "iBR" },
        { TAG_DO_MASK_DISC,     "BMD" },
        { TAG_SUPPLY_MASK,      "BMS" },
-       { TAG_DO_RDISC,         "BRD" },
+       { TAG_DO_RDISC,         "BRouter-Discovery" },
        { TAG_RTR_SOL_ADDR,     "iRSA" },
-       { TAG_STATIC_ROUTE,     "pSR" },
+       { TAG_STATIC_ROUTE,     "pStatic-Route" },
        { TAG_USE_TRAILERS,     "BUT" },
        { TAG_ARP_TIMEOUT,      "lAT" },
        { TAG_ETH_ENCAP,        "BIE" },
@@ -234,11 +234,11 @@ static struct tok tag2str[] = {
        { TAG_NIS_DOMAIN,       "aYD" },
        { TAG_NIS_SERVERS,      "iYS" },
        { TAG_NTP_SERVERS,      "iNTP" },
-       { TAG_VENDOR_OPTS,      "bVO" },
-       { TAG_NETBIOS_NS,       "iWNS" },
+       { TAG_VENDOR_OPTS,      "bVendor-Option" },
+       { TAG_NETBIOS_NS,       "iNetbios-Name-Server" },
        { TAG_NETBIOS_DDS,      "iWDD" },
-       { TAG_NETBIOS_NODE,     "$WNT" },
-       { TAG_NETBIOS_SCOPE,    "aWSC" },
+       { TAG_NETBIOS_NODE,     "$Netbios-Node" },
+       { TAG_NETBIOS_SCOPE,    "aNetbios-Scope" },
        { TAG_XWIN_FS,          "iXFS" },
        { TAG_XWIN_DM,          "iXDM" },
        { TAG_NIS_P_DOMAIN,     "sN+D" },
@@ -252,20 +252,20 @@ static struct tok tag2str[] = {
        { TAG_IRC_SERVER,       "iIRC" },
        { TAG_STREETTALK_SRVR,  "iSTS" },
        { TAG_STREETTALK_STDA,  "iSTDA" },
-       { TAG_REQUESTED_IP,     "iRQ" },
-       { TAG_IP_LEASE,         "lLT" },
+       { TAG_REQUESTED_IP,     "iRequested-IP" },
+       { TAG_IP_LEASE,         "lLease-Time" },
        { TAG_OPT_OVERLOAD,     "$OO" },
        { TAG_TFTP_SERVER,      "aTFTP" },
        { TAG_BOOTFILENAME,     "aBF" },
-       { TAG_DHCP_MESSAGE,     " DHCP" },
-       { TAG_SERVER_ID,        "iSID" },
-       { TAG_PARM_REQUEST,     "bPR" },
+       { TAG_DHCP_MESSAGE,     " DHCP-Message" },
+       { TAG_SERVER_ID,        "iServer-ID" },
+       { TAG_PARM_REQUEST,     "bParameter-Request" },
        { TAG_MESSAGE,          "aMSG" },
        { TAG_MAX_MSG_SIZE,     "sMSZ" },
        { TAG_RENEWAL_TIME,     "lRN" },
        { TAG_REBIND_TIME,      "lRB" },
-       { TAG_VENDOR_CLASS,     "aVC" },
-       { TAG_CLIENT_ID,        "$CID" },
+       { TAG_VENDOR_CLASS,     "aVendor-Class" },
+       { TAG_CLIENT_ID,        "$Client-ID" },
 /* RFC 2485 */
        { TAG_OPEN_GROUP_UAP,   "aUAP" },
 /* RFC 2563 */
@@ -281,7 +281,7 @@ static struct tok tag2str[] = {
        { TAG_USER_CLASS,       "aCLASS" },
        { TAG_SLP_NAMING_AUTH,  "aSLP-NA" },
        { TAG_CLIENT_FQDN,      "$FQDN" },
-       { TAG_AGENT_CIRCUIT,    "bACKT" },
+       { TAG_AGENT_CIRCUIT,    "$Agent-Information" },
        { TAG_AGENT_REMOTE,     "bARMT" },
        { TAG_AGENT_MASK,       "bAMSK" },
        { TAG_TZ_STRING,        "aTZSTR" },
@@ -336,6 +336,25 @@ static struct tok arp2str[] = {
        { 0,                    NULL }
 };
 
+static struct tok dhcp_msg_values[] = {
+        { DHCPDISCOVER, "Discover" },
+        { DHCPOFFER, "Offer" },
+        { DHCPREQUEST, "Request" },
+        { DHCPDECLINE, "Decline" },
+        { DHCPACK, "ACK" },
+        { DHCPNAK, "NACK" },
+        { DHCPRELEASE, "Release" },
+        { DHCPINFORM, "Inform" },
+        { 0,                   NULL }
+};
+
+#define AGENT_SUBOPTION_CIRCUIT_ID 1
+static struct tok agent_suboption_values[] = {
+        { AGENT_SUBOPTION_CIRCUIT_ID, "Circuit-ID" },
+        { 0,                   NULL }
+};
+
+
 static void
 rfc1048_print(register const u_char *bp)
 {
@@ -343,14 +362,15 @@ rfc1048_print(register const u_char *bp)
        register u_int len, size;
        register const char *cp;
        register char c;
-       int first;
+       int first, idx;
        u_int32_t ul;
        u_int16_t us;
-       u_int8_t uc;
+       u_int8_t uc, subopt, suboptlen;
 
-       printf("\n\t  Vendor-rfc1048:");
+       printf("\n\t  Vendor-rfc1048 Extensions");
 
        /* Step over magic cookie */
+        printf("\n\t    Magic Cookie 0x%08x", EXTRACT_32BITS(bp));
        bp += sizeof(int32_t);
 
        /* Loop while we there is a tag left in the buffer */
@@ -371,7 +391,6 @@ rfc1048_print(register const u_char *bp)
                } else
                        cp = tok2str(tag2str, "?T%u", tag);
                c = *cp++;
-               printf("\n\t    %s:", cp);
 
                /* Get the length; check for truncation */
                if (bp + 1 >= snapend) {
@@ -379,6 +398,9 @@ rfc1048_print(register const u_char *bp)
                        return;
                }
                len = *bp++;
+
+               printf("\n\t    %s Option %u, length %u: ", cp, tag, len);
+
                if (bp + len >= snapend) {
                        printf("[|bootp %u]", len);
                        return;
@@ -386,29 +408,24 @@ rfc1048_print(register const u_char *bp)
 
                if (tag == TAG_DHCP_MESSAGE && len == 1) {
                        uc = *bp++;
-                       switch (uc) {
-                       case DHCPDISCOVER:      printf("DISCOVER");     break;
-                       case DHCPOFFER:         printf("OFFER");        break;
-                       case DHCPREQUEST:       printf("REQUEST");      break;
-                       case DHCPDECLINE:       printf("DECLINE");      break;
-                       case DHCPACK:           printf("ACK");          break;
-                       case DHCPNAK:           printf("NACK");         break;
-                       case DHCPRELEASE:       printf("RELEASE");      break;
-                       case DHCPINFORM:        printf("INFORM");       break;
-                       default:                printf("%u", uc);       break;
-                       }
-                       continue;
+                        printf("%s", tok2str(dhcp_msg_values, "Unknown (%u)", uc));
+                        continue;
                }
 
                if (tag == TAG_PARM_REQUEST) {
                        first = 1;
+                        idx = 0;
+                        printf("\n\t      ");
                        while (len-- > 0) {
                                uc = *bp++;
-                               cp = tok2str(tag2str, "?T%u", uc);
-                               if (!first)
-                                       putchar('+');
-                               printf("%s", cp + 1);
+                               cp = tok2str(tag2str, "?Option %u", uc);
+                               printf("%s%s", (first || (!(idx %4))) ? "" : ", ", cp + 1);
+
+                                if ((idx %4) == 3) {
+                                    printf("\n\t      ");
+                                }
                                first = 0;
+                                idx ++;
                        }
                        continue;
                }
@@ -593,7 +610,7 @@ rfc1048_print(register const u_char *bp)
                                        size = 0;
                                        break;
                                } else {
-                                       printf("[%s]", tok2str(arp2str, "type-%d", type));
+                                       printf("%s ", tok2str(arp2str, "hardware-type %u,", type));
                                }
                                while (size > 0) {
                                        if (!first)
@@ -606,6 +623,37 @@ rfc1048_print(register const u_char *bp)
                                break;
                            }
 
+                        case TAG_AGENT_CIRCUIT:
+                        {
+                            while (size > 0 ) {
+                            subopt = *bp++;
+                            suboptlen = *bp++;
+                            size -= 2;
+                            printf("\n\t      %s SubOption %u, length %u: ",
+                                   tok2str(agent_suboption_values, "Unknown", subopt),
+                                   subopt,
+                                   suboptlen);
+
+                            if (subopt == 0 || suboptlen == 0) {
+                                break;
+                            }
+
+                            switch(subopt) {
+                            case AGENT_SUBOPTION_CIRCUIT_ID:
+                                for (idx = 0; idx < suboptlen; idx++) {
+                                    safeputchar(*(bp+idx));
+                                }
+                                break;
+                            default:
+                                print_unknown_data(bp, "\n\t\t", suboptlen);
+                            }
+
+                            size -= suboptlen;
+                            bp += suboptlen;
+                            }
+                        }
+                            break;
+
                        default:
                                printf("[unknown special tag %u, size %u]",
                                    tag, size);
@@ -617,7 +665,7 @@ rfc1048_print(register const u_char *bp)
                }
                /* Data left over? */
                if (size) {
-                       printf("[len %u]", len);
+                       printf("\n\t  trailing data length %u", len);
                        bp += size;
                }
        }