Merge remote-tracking branch 'goog/tcpdump'

* goog/tcpdump: (3066 commits)
  Remove old version. Getting ready for new tcpdump 4.5
  Support -Q for setting the capture direction.
  Clean up the TLV processing loop.
  With -A and -AA, don't send CRs to the standard output.
  Use the new libpcap <pcap/nflog.h> for NFLOG definitions and declarations.
  Do our own isascii(), isprint(), isgraph(), and toascii().
  Fix a compiler warning.
  Don't use the __attribute__((packed)) on most platforms.
  The interval in an AODV HELLO extension is not aligned on a 4-byte boundary.
  As with memcpy, so with memcmp.
  More UNALIGNED_MEM{CPY,CMP} on IP addresses.
  Another case where UNALIGNED_MEMCPY() is probably necessary.
  No need for casting back and forth.
  Only do the unaligned_mem{cpy,cmp} hack if necessary.
  No need to declare unaligned_mem{cpy,cmp} in netdissect.h *and* interface.h.
  More possibly-unaligned memcpy()s and assignments - use unaligned_memcpy().
  Check for compiling for IPv6; don't check whether we can create an IPv6 socket.
  Use unaligned_memcmp() to compare with IPv{4,6} addresses in a packet.
  Use EXTRACT_nBITS even when just testing against zero.
  Fix some more unaligned accesses.
  ...

Change-Id: I9e98707d30c989b9e32dcd5af798bd0746ab4434
diff --git a/print-rx.c b/print-rx.c
index d991066..1b4f949 100644
--- a/print-rx.c
+++ b/print-rx.c
@@ -34,7 +34,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.37.2.2 2007/06/15 19:43:15 guy Exp $";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.42 2008-07-01 07:44:50 guy Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -54,7 +54,7 @@
 
 #include "ip.h"
 
-static struct tok rx_types[] = {
+static const struct tok rx_types[] = {
 	{ RX_PACKET_TYPE_DATA,		"data" },
 	{ RX_PACKET_TYPE_ACK,		"ack" },
 	{ RX_PACKET_TYPE_BUSY,		"busy" },
@@ -82,7 +82,7 @@
 	{ RX_JUMBO_PACKET,	RX_PACKET_TYPE_DATA,	"jumbogram" }
 };
 
-static struct tok fs_req[] = {
+static const struct tok fs_req[] = {
 	{ 130,		"fetch-data" },
 	{ 131,		"fetch-acl" },
 	{ 132,		"fetch-status" },
@@ -118,10 +118,16 @@
 	{ 162,		"dfs-flushcps" },
 	{ 163,		"dfs-symlink" },
 	{ 220,		"residency" },
+	{ 65536,        "inline-bulk-status" },
+	{ 65537,        "fetch-data-64" },
+	{ 65538,        "store-data-64" },
+	{ 65539,        "give-up-all-cbs" },
+	{ 65540,        "get-caps" },
+	{ 65541,        "cb-rx-conn-addr" },
 	{ 0,		NULL },
 };
 
-static struct tok cb_req[] = {
+static const struct tok cb_req[] = {
 	{ 204,		"callback" },
 	{ 205,		"initcb" },
 	{ 206,		"probe" },
@@ -137,10 +143,13 @@
 	{ 216,		"getcellservdb" },
 	{ 217,		"getlocalcell" },
 	{ 218,		"getcacheconf" },
+	{ 65536,        "getce64" },
+	{ 65537,        "getcellbynum" },
+	{ 65538,        "tellmeaboutyourself" },
 	{ 0,		NULL },
 };
 
-static struct tok pt_req[] = {
+static const struct tok pt_req[] = {
 	{ 500,		"new-user" },
 	{ 501,		"where-is-it" },
 	{ 502,		"dump-entry" },
@@ -163,10 +172,11 @@
 	{ 519,		"get-host-cps" },
 	{ 520,		"update-entry" },
 	{ 521,		"list-entries" },
+	{ 530,		"list-super-groups" },
 	{ 0,		NULL },
 };
 
-static struct tok vldb_req[] = {
+static const struct tok vldb_req[] = {
 	{ 501,		"create-entry" },
 	{ 502,		"delete-entry" },
 	{ 503,		"get-entry-by-id" },
@@ -204,7 +214,7 @@
 	{ 0,		NULL },
 };
 
-static struct tok kauth_req[] = {
+static const struct tok kauth_req[] = {
 	{ 1,		"auth-old" },
 	{ 21,		"authenticate" },
 	{ 22,		"authenticate-v2" },
@@ -226,7 +236,7 @@
 	{ 0,		NULL },
 };
 
-static struct tok vol_req[] = {
+static const struct tok vol_req[] = {
 	{ 100,		"create-volume" },
 	{ 101,		"delete-volume" },
 	{ 102,		"restore" },
@@ -256,10 +266,13 @@
 	{ 126,		"set-info" },
 	{ 127,		"x-list-partitions" },
 	{ 128,		"forward-multiple" },
+	{ 65536,	"convert-ro" },
+	{ 65537,	"get-size" },
+	{ 65538,	"dump-v2" },
 	{ 0,		NULL },
 };
 
-static struct tok bos_req[] = {
+static const struct tok bos_req[] = {
 	{ 80,		"create-bnode" },
 	{ 81,		"delete-bnode" },
 	{ 82,		"set-status" },
@@ -300,13 +313,15 @@
 	{ 0,		NULL },
 };
 
-static struct tok ubik_req[] = {
+static const struct tok ubik_req[] = {
 	{ 10000,	"vote-beacon" },
 	{ 10001,	"vote-debug-old" },
 	{ 10002,	"vote-sdebug-old" },
 	{ 10003,	"vote-getsyncsite" },
 	{ 10004,	"vote-debug" },
 	{ 10005,	"vote-sdebug" },
+	{ 10006,	"vote-xdebug" },
+	{ 10007,	"vote-xsdebug" },
 	{ 20000,	"disk-begin" },
 	{ 20001,	"disk-commit" },
 	{ 20002,	"disk-lock" },
@@ -325,18 +340,18 @@
 };
 
 #define VOTE_LOW	10000
-#define VOTE_HIGH	10005
+#define VOTE_HIGH	10007
 #define DISK_LOW	20000
 #define DISK_HIGH	20013
 
-static struct tok cb_types[] = {
+static const struct tok cb_types[] = {
 	{ 1,		"exclusive" },
 	{ 2,		"shared" },
 	{ 3,		"dropped" },
 	{ 0,		NULL },
 };
 
-static struct tok ubik_lock_types[] = {
+static const struct tok ubik_lock_types[] = {
 	{ 1,		"read" },
 	{ 2,		"write" },
 	{ 3,		"wait" },
@@ -345,7 +360,7 @@
 
 static const char *voltype[] = { "read-write", "read-only", "backup" };
 
-static struct tok afs_fs_errors[] = {
+static const struct tok afs_fs_errors[] = {
 	{ 101,		"salvage volume" },
 	{ 102, 		"no such vnode" },
 	{ 103, 		"no such volume" },
@@ -366,7 +381,7 @@
  * Reasons for acknowledging a packet
  */
 
-static struct tok rx_ack_reasons[] = {
+static const struct tok rx_ack_reasons[] = {
 	{ 1,		"ack requested" },
 	{ 2,		"duplicate packet" },
 	{ 3,		"out of sequence" },
@@ -638,7 +653,7 @@
 			*opcode = rxent->opcode;
 			return(1);
 		}
-		if (++i > RX_CACHE_SIZE)
+		if (++i >= RX_CACHE_SIZE)
 			i = 0;
 	} while (i != rx_cache_hint);
 
@@ -688,6 +703,13 @@
 			printf(" %lu", i); \
 		}
 
+#define UINT64OUT() { u_int64_t i; \
+			TCHECK2(bp[0], sizeof(u_int64_t)); \
+			i = EXTRACT_64BITS(bp); \
+			bp += sizeof(u_int64_t); \
+			printf(" %" PRIu64, i); \
+		}
+
 #define DATEOUT() { time_t t; struct tm *tm; char str[256]; \
 			TCHECK2(bp[0], sizeof(int32_t)); \
 			t = (time_t) EXTRACT_32BITS(bp); \
@@ -763,6 +785,17 @@
 			printf("\""); \
 		}
 
+#define DESTSERVEROUT() { unsigned long n1, n2, n3; \
+			TCHECK2(bp[0], sizeof(int32_t) * 3); \
+			n1 = EXTRACT_32BITS(bp); \
+			bp += sizeof(int32_t); \
+			n2 = EXTRACT_32BITS(bp); \
+			bp += sizeof(int32_t); \
+			n3 = EXTRACT_32BITS(bp); \
+			bp += sizeof(int32_t); \
+			printf(" server %d:%d:%d", (int) n1, (int) n2, (int) n3); \
+		}
+
 /*
  * Handle calls to the AFS file service (fs)
  */
@@ -890,6 +923,7 @@
 			STROUT(AFSNAMEMAX);
 			break;
 		case 155:	/* Bulk stat */
+		case 65536:     /* Inline bulk stat */
 		{
 			unsigned long j;
 			TCHECK2(bp[0], 4);
@@ -904,6 +938,26 @@
 			if (j == 0)
 				printf(" <none!>");
 		}
+		case 65537:	/* Fetch data 64 */
+			FIDOUT();
+			printf(" offset");
+			UINT64OUT();
+			printf(" length");
+			UINT64OUT();
+			break;
+		case 65538:	/* Store data 64 */
+			FIDOUT();
+			STOREATTROUT();
+			printf(" offset");
+			UINT64OUT();
+			printf(" length");
+			UINT64OUT();
+			printf(" flen");
+			UINT64OUT();
+			break;
+		case 65541:    /* CallBack rx conn address */
+			printf(" addr");
+			UINTOUT();
 		default:
 			;
 	}
@@ -1267,6 +1321,7 @@
 		case 517:	/* List owned */
 		case 518:	/* Get CPS2 */
 		case 519:	/* Get host CPS */
+		case 530:	/* List super groups */
 			printf(" id");
 			INTOUT();
 			break;
@@ -1915,13 +1970,176 @@
 
 	printf(" vol call %s", tok2str(vol_req, "op#%d", vol_op));
 
-	/*
-	 * Normally there would be a switch statement here to decode the
-	 * arguments to the AFS call, but since I don't have access to
-	 * an AFS server (yet) and I'm not an AFS admin, I can't
-	 * test any of these calls.  Leave this blank for now.
-	 */
+	bp += sizeof(struct rx_header) + 4;
 
+	switch (vol_op) {
+		case 100:	/* Create volume */
+			printf(" partition");
+			UINTOUT();
+			printf(" name");
+			STROUT(AFSNAMEMAX);
+			printf(" type");
+			UINTOUT();
+			printf(" parent");
+			UINTOUT();
+			break;
+		case 101:	/* Delete volume */
+		case 107:	/* Get flags */
+			printf(" trans");
+			UINTOUT();
+			break;
+		case 102:	/* Restore */
+			printf(" totrans");
+			UINTOUT();
+			printf(" flags");
+			UINTOUT();
+			break;
+		case 103:	/* Forward */
+			printf(" fromtrans");
+			UINTOUT();
+			printf(" fromdate");
+			DATEOUT();
+			DESTSERVEROUT();
+			printf(" desttrans");
+			INTOUT();
+			break;
+		case 104:	/* End trans */
+			printf(" trans");
+			UINTOUT();
+			break;
+		case 105:	/* Clone */
+			printf(" trans");
+			UINTOUT();
+			printf(" purgevol");
+			UINTOUT();
+			printf(" newtype");
+			UINTOUT();
+			printf(" newname");
+			STROUT(AFSNAMEMAX);
+			break;
+		case 106:	/* Set flags */
+			printf(" trans");
+			UINTOUT();
+			printf(" flags");
+			UINTOUT();
+			break;
+		case 108:	/* Trans create */
+			printf(" vol");
+			UINTOUT();
+			printf(" partition");
+			UINTOUT();
+			printf(" flags");
+			UINTOUT();
+			break;
+		case 109:	/* Dump */
+		case 655537:	/* Get size */
+			printf(" fromtrans");
+			UINTOUT();
+			printf(" fromdate");
+			DATEOUT();
+			break;
+		case 110:	/* Get n-th volume */
+			printf(" index");
+			UINTOUT();
+			break;
+		case 111:	/* Set forwarding */
+			printf(" tid");
+			UINTOUT();
+			printf(" newsite");
+			UINTOUT();
+			break;
+		case 112:	/* Get name */
+		case 113:	/* Get status */
+			printf(" tid");
+			break;
+		case 114:	/* Signal restore */
+			printf(" name");
+			STROUT(AFSNAMEMAX);
+			printf(" type");
+			UINTOUT();
+			printf(" pid");
+			UINTOUT();
+			printf(" cloneid");
+			UINTOUT();
+			break;
+		case 116:	/* List volumes */
+			printf(" partition");
+			UINTOUT();
+			printf(" flags");
+			UINTOUT();
+			break;
+		case 117:	/* Set id types */
+			printf(" tid");
+			UINTOUT();
+			printf(" name");
+			STROUT(AFSNAMEMAX);
+			printf(" type");
+			UINTOUT();
+			printf(" pid");
+			UINTOUT();
+			printf(" clone");
+			UINTOUT();
+			printf(" backup");
+			UINTOUT();
+			break;
+		case 119:	/* Partition info */
+			printf(" name");
+			STROUT(AFSNAMEMAX);
+			break;
+		case 120:	/* Reclone */
+			printf(" tid");
+			UINTOUT();
+			break;
+		case 121:	/* List one volume */
+		case 122:	/* Nuke volume */
+		case 124:	/* Extended List volumes */
+		case 125:	/* Extended List one volume */
+		case 65536:	/* Convert RO to RW volume */
+			printf(" partid");
+			UINTOUT();
+			printf(" volid");
+			UINTOUT();
+			break;
+		case 123:	/* Set date */
+			printf(" tid");
+			UINTOUT();
+			printf(" date");
+			DATEOUT();
+			break;
+		case 126:	/* Set info */
+			printf(" tid");
+			UINTOUT();
+			break;
+		case 128:	/* Forward multiple */
+			printf(" fromtrans");
+			UINTOUT();
+			printf(" fromdate");
+			DATEOUT();
+			{
+				unsigned long i, j;
+				TCHECK2(bp[0], 4);
+				j = EXTRACT_32BITS(bp);
+				bp += sizeof(int32_t);
+				for (i = 0; i < j; i++) {
+					DESTSERVEROUT();
+					if (i != j - 1)
+						printf(",");
+				}
+				if (j == 0)
+					printf(" <none!>");
+			}
+			break;
+		case 65538:	/* Dump version 2 */
+			printf(" fromtrans");
+			UINTOUT();
+			printf(" fromdate");
+			DATEOUT();
+			printf(" flags");
+			UINTOUT();
+			break;
+		default:
+			;
+	}
 	return;
 
 trunc:
@@ -1955,10 +2173,100 @@
 	 * If it was a data packet, interpret the response.
 	 */
 
-	if (rxh->type == RX_PACKET_TYPE_DATA)
-		/* Well, no, not really.  Leave this for later */
-		;
-	else {
+	if (rxh->type == RX_PACKET_TYPE_DATA) {
+		switch (opcode) {
+			case 100:	/* Create volume */
+				printf(" volid");
+				UINTOUT();
+				printf(" trans");
+				UINTOUT();
+				break;
+			case 104:	/* End transaction */
+				UINTOUT();
+				break;
+			case 105:	/* Clone */
+				printf(" newvol");
+				UINTOUT();
+				break;
+			case 107:	/* Get flags */
+				UINTOUT();
+				break;
+			case 108:	/* Transaction create */
+				printf(" trans");
+				UINTOUT();
+				break;
+			case 110:	/* Get n-th volume */
+				printf(" volume");
+				UINTOUT();
+				printf(" partition");
+				UINTOUT();
+				break;
+			case 112:	/* Get name */
+				STROUT(AFSNAMEMAX);
+				break;
+			case 113:	/* Get status */
+				printf(" volid");
+				UINTOUT();
+				printf(" nextuniq");
+				UINTOUT();
+				printf(" type");
+				UINTOUT();
+				printf(" parentid");
+				UINTOUT();
+				printf(" clone");
+				UINTOUT();
+				printf(" backup");
+				UINTOUT();
+				printf(" restore");
+				UINTOUT();
+				printf(" maxquota");
+				UINTOUT();
+				printf(" minquota");
+				UINTOUT();
+				printf(" owner");
+				UINTOUT();
+				printf(" create");
+				DATEOUT();
+				printf(" access");
+				DATEOUT();
+				printf(" update");
+				DATEOUT();
+				printf(" expire");
+				DATEOUT();
+				printf(" backup");
+				DATEOUT();
+				printf(" copy");
+				DATEOUT();
+				break;
+			case 115:	/* Old list partitions */
+				break;
+			case 116:	/* List volumes */
+			case 121:	/* List one volume */
+				{
+					unsigned long i, j;
+					TCHECK2(bp[0], 4);
+					j = EXTRACT_32BITS(bp);
+					bp += sizeof(int32_t);
+					for (i = 0; i < j; i++) {
+						printf(" name");
+						VECOUT(32);
+						printf(" volid");
+						UINTOUT();
+						printf(" type");
+						bp += sizeof(int32_t) * 21;
+						if (i != j - 1)
+							printf(",");
+					}
+					if (j == 0)
+						printf(" <none!>");
+				}
+				break;
+				
+
+			default:
+				;
+		}
+	} else {
 		/*
 		 * Otherwise, just print out the return code
 		 */