X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/9f04a5ff81dcc3a0d9b9d65c945eae23d189c8f7..a9a7c86c7875a38358a9ff1f2a35e93febf6f41e:/print-rx.c?ds=sidebyside diff --git a/print-rx.c b/print-rx.c index a9e4692e..70393ea5 100644 --- a/print-rx.c +++ b/print-rx.c @@ -1,3 +1,25 @@ +/* + * Copyright: (c) 2000 United States Government as represented by the + * Secretary of the Navy. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. The names of the authors may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ /* * This code unmangles RX packets. RX is the mutant form of RPC that AFS * uses to communicate between clients and servers. @@ -8,12 +30,11 @@ * Bah. If I never look at rx_packet.h again, it will be too soon. * * Ken Hornstein - * */ #ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.26 2001-09-09 01:41:49 guy Exp $"; +static const char rcsid[] _U_ = + "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.42 2008-07-01 07:44:50 guy Exp $"; #endif #ifdef HAVE_CONFIG_H @@ -23,13 +44,7 @@ static const char rcsid[] = #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include #include "interface.h" #include "addrtoname.h" @@ -56,7 +71,7 @@ static struct tok rx_types[] = { static struct double_tok { int flag; /* Rx flag */ int packetType; /* Packet type */ - char *s; /* Flag string */ + const char *s; /* Flag string */ } rx_flags[] = { { RX_CLIENT_INITIATED, 0, "client-init" }, { RX_REQUEST_ACK, 0, "req-ack" }, @@ -103,6 +118,12 @@ static struct tok fs_req[] = { { 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 }, }; @@ -122,6 +143,9 @@ static struct tok cb_req[] = { { 216, "getcellservdb" }, { 217, "getlocalcell" }, { 218, "getcacheconf" }, + { 65536, "getce64" }, + { 65537, "getcellbynum" }, + { 65538, "tellmeaboutyourself" }, { 0, NULL }, }; @@ -148,6 +172,7 @@ static struct tok pt_req[] = { { 519, "get-host-cps" }, { 520, "update-entry" }, { 521, "list-entries" }, + { 530, "list-super-groups" }, { 0, NULL }, }; @@ -241,6 +266,9 @@ static struct tok vol_req[] = { { 126, "set-info" }, { 127, "x-list-partitions" }, { 128, "forward-multiple" }, + { 65536, "convert-ro" }, + { 65537, "get-size" }, + { 65538, "dump-v2" }, { 0, NULL }, }; @@ -292,6 +320,8 @@ static struct tok ubik_req[] = { { 10003, "vote-getsyncsite" }, { 10004, "vote-debug" }, { 10005, "vote-sdebug" }, + { 10006, "vote-xdebug" }, + { 10007, "vote-xsdebug" }, { 20000, "disk-begin" }, { 20001, "disk-commit" }, { 20002, "disk-lock" }, @@ -310,7 +340,7 @@ static struct tok ubik_req[] = { }; #define VOTE_LOW 10000 -#define VOTE_HIGH 10005 +#define VOTE_HIGH 10007 #define DISK_LOW 20000 #define DISK_HIGH 20013 @@ -328,7 +358,7 @@ static struct tok ubik_lock_types[] = { { 0, NULL }, }; -static char *voltype[] = { "read-write", "read-only", "backup" }; +static const char *voltype[] = { "read-write", "read-only", "backup" }; static struct tok afs_fs_errors[] = { { 101, "salvage volume" }, @@ -360,6 +390,7 @@ static struct tok rx_ack_reasons[] = { { 6, "ping" }, { 7, "ping response" }, { 8, "delay" }, + { 9, "idle" }, { 0, NULL }, }; @@ -383,11 +414,10 @@ static struct rx_cache_entry rx_cache[RX_CACHE_SIZE]; static int rx_cache_next = 0; static int rx_cache_hint = 0; -static void rx_cache_insert(const u_char *, const struct ip *, int, int); +static void rx_cache_insert(const u_char *, const struct ip *, int); static int rx_cache_find(const struct rx_header *, const struct ip *, int, int32_t *); -static void ack_print(const u_char *, int); static void fs_print(const u_char *, int); static void fs_reply_print(const u_char *, int, int32_t); static void acl_print(u_char *, int, u_char *); @@ -403,7 +433,7 @@ static void vol_print(const u_char *, int); static void vol_reply_print(const u_char *, int, int32_t); static void bos_print(const u_char *, int); static void bos_reply_print(const u_char *, int, int32_t); -static void ubik_print(const u_char *, int); +static void ubik_print(const u_char *); static void ubik_reply_print(const u_char *, int, int32_t); static void rx_ack_print(const u_char *, int); @@ -423,7 +453,7 @@ rx_print(register const u_char *bp, int length, int sport, int dport, int i; int32_t opcode; - if (snapend - bp < sizeof (struct rx_header)) { + if (snapend - bp < (int)sizeof (struct rx_header)) { printf(" [|rx] (%d)", length); return; } @@ -474,9 +504,7 @@ rx_print(register const u_char *bp, int length, int sport, int dport, * as well. */ - if (rxh->type == RX_PACKET_TYPE_ACK) - ack_print(bp, length); - else if (rxh->type == RX_PACKET_TYPE_DATA && + if (rxh->type == RX_PACKET_TYPE_DATA && EXTRACT_32BITS(&rxh->seq) == 1 && rxh->flags & RX_CLIENT_INITIATED) { @@ -485,7 +513,7 @@ rx_print(register const u_char *bp, int length, int sport, int dport, * have a chance to print out replies */ - rx_cache_insert(bp, (const struct ip *) bp2, dport, length); + rx_cache_insert(bp, (const struct ip *) bp2, dport); switch (dport) { case FS_RX_PORT: /* AFS file service */ @@ -512,7 +540,7 @@ rx_print(register const u_char *bp, int length, int sport, int dport, default: ; } - + /* * If it's a reply (client-init is _not_ set, but seq is one) * then look it up in the cache. If we find it, call the reply @@ -571,20 +599,19 @@ rx_print(register const u_char *bp, int length, int sport, int dport, */ static void -rx_cache_insert(const u_char *bp, const struct ip *ip, int dport, - int length) +rx_cache_insert(const u_char *bp, const struct ip *ip, int dport) { struct rx_cache_entry *rxent; const struct rx_header *rxh = (const struct rx_header *) bp; - if (snapend - bp + 1 <= sizeof(struct rx_header) + sizeof(int32_t)) + if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) return; rxent = &rx_cache[rx_cache_next]; if (++rx_cache_next >= RX_CACHE_SIZE) rx_cache_next = 0; - + rxent->callnum = rxh->callNumber; rxent->client = ip->ip_src; rxent->server = ip->ip_dst; @@ -616,7 +643,7 @@ rx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport, rxent = &rx_cache[i]; if (rxent->callnum == rxh->callNumber && rxent->client.s_addr == clip && - rxent->server.s_addr == sip && + rxent->server.s_addr == sip && rxent->serviceId == rxh->serviceId && rxent->dport == sport) { @@ -676,6 +703,13 @@ rx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport, 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); \ @@ -689,18 +723,18 @@ rx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport, TCHECK2(bp[0], (sizeof(int32_t)*6)); \ mask = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \ if (mask) printf (" StoreStatus"); \ - if (mask & 1) { printf(" date"); DATEOUT(); } \ + if (mask & 1) { printf(" date"); DATEOUT(); } \ else bp += sizeof(int32_t); \ i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \ - if (mask & 2) printf(" owner %lu", i); \ + if (mask & 2) printf(" owner %lu", i); \ i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \ - if (mask & 4) printf(" group %lu", i); \ + if (mask & 4) printf(" group %lu", i); \ i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \ - if (mask & 8) printf(" mode %lo", i & 07777); \ + if (mask & 8) printf(" mode %lo", i & 07777); \ i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \ - if (mask & 16) printf(" segsize %lu", i); \ + if (mask & 16) printf(" segsize %lu", i); \ /* undocumented in 3.3 docu */ \ - if (mask & 1024) printf(" fsync"); \ + if (mask & 1024) printf(" fsync"); \ } #define UBIK_VERSIONOUT() {int32_t epoch; int32_t counter; \ @@ -734,15 +768,15 @@ rx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport, * This is the sickest one of all */ -#define VECOUT(MAX) { char *sp; \ - char s[AFSNAMEMAX]; \ +#define VECOUT(MAX) { u_char *sp; \ + u_char s[AFSNAMEMAX]; \ int k; \ if ((MAX) + 1 > sizeof(s)) \ goto trunc; \ TCHECK2(bp[0], (MAX) * sizeof(int32_t)); \ sp = s; \ for (k = 0; k < (MAX); k++) { \ - *sp++ = (char) EXTRACT_32BITS(bp); \ + *sp++ = (u_char) EXTRACT_32BITS(bp); \ bp += sizeof(int32_t); \ } \ s[(MAX)] = '\0'; \ @@ -751,74 +785,16 @@ rx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport, printf("\""); \ } -static void -ack_print(register const u_char *bp, int length) -{ - u_char nAcks; - int i; - - if (vflag <= 1) - return; - - if (length <= sizeof(struct rx_header)) - return; - - bp += sizeof(struct rx_header); - - /* - * Packets < firstPacket are implicitly acknowledged and may - * be discarded by the sender. - * - * Packets >= firstPacket+nAcks are implicitly NOT acknowledged. - * - * No packets with sequence numbers >= firstPacket should be - * discarded by the sender (they may thrown out at any time by - * the receiver) - */ -#define RX_ACK_REASONS "RDOXSprn" - /* Requested, Duplicate, Out_of_sequence, eXceeds_window, no_Space, - * Ping, ping_Response, No_{progress, particular_reason}. - */ -#if 0 - struct rx_ackPacket { - u_short bufferSpace; /* Skip! */ - u_short maxSkew; /* Skip! */ - u_long firstPacket; - u_long previousPacket; /* Obsolete! */ - u_long serial; /* Serial that prompted the ack, */ - u_char reason; /* and the reason why. */ - u_char nAcks; - u_char acks[RX_MAXACKS]; /* Selective acks (not a bitmap). */ - }; -#endif -#define RX_ACK_TYPE_NACK 0 - - TCHECK2(bp[0], 8); /* bufferSpace and maxSkew */ - bp += 4; - printf(" fir %u", (unsigned)EXTRACT_32BITS(bp)); - bp += 4; - TCHECK2(bp[0], 8); /* previousPacket and serial */ - bp += 4; - printf(" %u", (unsigned)EXTRACT_32BITS(bp)); - bp += 4; - TCHECK2(bp[0], 1); - printf("%c", RX_ACK_REASONS[(*bp - 1) & 07u]); - bp += 1; /* reason */ - TCHECK2(bp[0], 1); - nAcks = *bp; - bp += 1; /* nAcks */ - - for (i = 0; i < nAcks; i++) { - TCHECK2(bp[0], 1); - putchar(*bp == RX_ACK_TYPE_NACK? '-' : '*'); - bp += 1; - } - - return; - -trunc: - printf(" [|ack]"); -} +#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) @@ -830,10 +806,10 @@ fs_print(register const u_char *bp, int length) int fs_op; unsigned long i; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; - if (snapend - bp + 1 <= sizeof(struct rx_header) + sizeof(int32_t)) { + if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) { goto trunc; } @@ -947,6 +923,7 @@ fs_print(register const u_char *bp, int length) STROUT(AFSNAMEMAX); break; case 155: /* Bulk stat */ + case 65536: /* Inline bulk stat */ { unsigned long j; TCHECK2(bp[0], 4); @@ -961,6 +938,26 @@ fs_print(register const u_char *bp, int length) if (j == 0) printf(" "); } + 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: ; } @@ -981,7 +978,7 @@ fs_reply_print(register const u_char *bp, int length, int32_t opcode) unsigned long i; struct rx_header *rxh; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; rxh = (struct rx_header *) bp; @@ -1032,12 +1029,12 @@ fs_reply_print(register const u_char *bp, int length, int32_t opcode) } else if (rxh->type == RX_PACKET_TYPE_ABORT) { int i; - /* - * Otherwise, just print out the return code - */ - TCHECK2(bp[0], sizeof(int32_t)); - i = (int) EXTRACT_32BITS(bp); - bp += sizeof(int32_t); + /* + * Otherwise, just print out the return code + */ + TCHECK2(bp[0], sizeof(int32_t)); + i = (int) EXTRACT_32BITS(bp); + bp += sizeof(int32_t); printf(" error %s", tok2str(afs_fs_errors, "#%d", i)); } else { @@ -1057,7 +1054,7 @@ trunc: * * * .... - * + * * "positive" and "negative" are integers which contain the number of * positive and negative ACL's in the string. The uid/aclbits pair are * ASCII strings containing the UID/PTS record and and a ascii number @@ -1070,13 +1067,14 @@ acl_print(u_char *s, int maxsize, u_char *end) int pos, neg, acl; int n, i; char *user; + char fmt[1024]; if ((user = (char *)malloc(maxsize)) == NULL) return; if (sscanf((char *) s, "%d %d\n%n", &pos, &neg, &n) != 2) goto finish; - + s += n; if (s > end) @@ -1103,11 +1101,12 @@ acl_print(u_char *s, int maxsize, u_char *end) printf("a"); for (i = 0; i < pos; i++) { - if (sscanf((char *) s, "%s %d\n%n", user, &acl, &n) != 2) + snprintf(fmt, sizeof(fmt), "%%%ds %%d\n%%n", maxsize - 1); + if (sscanf((char *) s, fmt, user, &acl, &n) != 2) goto finish; s += n; printf(" +{"); - fn_print(user, NULL); + fn_print((u_char *)user, NULL); printf(" "); ACLOUT(acl); printf("}"); @@ -1116,11 +1115,12 @@ acl_print(u_char *s, int maxsize, u_char *end) } for (i = 0; i < neg; i++) { - if (sscanf((char *) s, "%s %d\n%n", user, &acl, &n) != 2) + snprintf(fmt, sizeof(fmt), "%%%ds %%d\n%%n", maxsize - 1); + if (sscanf((char *) s, fmt, user, &acl, &n) != 2) goto finish; s += n; printf(" -{"); - fn_print(user, NULL); + fn_print((u_char *)user, NULL); printf(" "); ACLOUT(acl); printf("}"); @@ -1145,10 +1145,10 @@ cb_print(register const u_char *bp, int length) int cb_op; unsigned long i; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; - if (snapend - bp + 1 <= sizeof(struct rx_header) + sizeof(int32_t)) { + if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) { goto trunc; } @@ -1226,7 +1226,7 @@ cb_reply_print(register const u_char *bp, int length, int32_t opcode) { struct rx_header *rxh; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; rxh = (struct rx_header *) bp; @@ -1235,7 +1235,7 @@ cb_reply_print(register const u_char *bp, int length, int32_t opcode) * Print out the afs call we're invoking. The table used here was * gleaned from fsint/afscbint.xg */ - + printf(" cb reply %s", tok2str(cb_req, "op#%d", opcode)); bp += sizeof(struct rx_header); @@ -1276,10 +1276,10 @@ prot_print(register const u_char *bp, int length) unsigned long i; int pt_op; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; - if (snapend - bp + 1 <= sizeof(struct rx_header) + sizeof(int32_t)) { + if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) { goto trunc; } @@ -1293,7 +1293,7 @@ prot_print(register const u_char *bp, int length) printf(" pt"); if (is_ubik(pt_op)) { - ubik_print(bp, length); + ubik_print(bp); return; } @@ -1321,6 +1321,7 @@ prot_print(register const u_char *bp, int length) case 517: /* List owned */ case 518: /* Get CPS2 */ case 519: /* Get host CPS */ + case 530: /* List super groups */ printf(" id"); INTOUT(); break; @@ -1418,7 +1419,7 @@ prot_reply_print(register const u_char *bp, int length, int32_t opcode) struct rx_header *rxh; unsigned long i; - if (length < sizeof(struct rx_header)) + if (length < (int)sizeof(struct rx_header)) return; rxh = (struct rx_header *) bp; @@ -1530,10 +1531,10 @@ vldb_print(register const u_char *bp, int length) int vldb_op; unsigned long i; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; - if (snapend - bp + 1 <= sizeof(struct rx_header) + sizeof(int32_t)) { + if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) { goto trunc; } @@ -1547,7 +1548,7 @@ vldb_print(register const u_char *bp, int length) printf(" vldb"); if (is_ubik(vldb_op)) { - ubik_print(bp, length); + ubik_print(bp); return; } printf(" call %s", tok2str(vldb_req, "op#%d", vldb_op)); @@ -1623,7 +1624,7 @@ vldb_reply_print(register const u_char *bp, int length, int32_t opcode) struct rx_header *rxh; unsigned long i; - if (length < sizeof(struct rx_header)) + if (length < (int)sizeof(struct rx_header)) return; rxh = (struct rx_header *) bp; @@ -1672,7 +1673,7 @@ vldb_reply_print(register const u_char *bp, int length, int32_t opcode) TCHECK2(bp[0], sizeof(int32_t)); if (i < nservers) printf(" %s", - inet_ntoa(*((struct in_addr *) bp))); + intoa(((struct in_addr *) bp)->s_addr)); bp += sizeof(int32_t); } printf(" partitions"); @@ -1719,7 +1720,7 @@ vldb_reply_print(register const u_char *bp, int length, int32_t opcode) TCHECK2(bp[0], sizeof(int32_t)); if (i < nservers) printf(" %s", - inet_ntoa(*((struct in_addr *) bp))); + intoa(((struct in_addr *) bp)->s_addr)); bp += sizeof(int32_t); } printf(" partitions"); @@ -1785,7 +1786,7 @@ vldb_reply_print(register const u_char *bp, int length, int32_t opcode) default: ; } - + else { /* * Otherwise, just print out the return code @@ -1809,10 +1810,10 @@ kauth_print(register const u_char *bp, int length) { int kauth_op; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; - if (snapend - bp + 1 <= sizeof(struct rx_header) + sizeof(int32_t)) { + if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) { goto trunc; } @@ -1826,7 +1827,7 @@ kauth_print(register const u_char *bp, int length) printf(" kauth"); if (is_ubik(kauth_op)) { - ubik_print(bp, length); + ubik_print(bp); return; } @@ -1902,7 +1903,7 @@ kauth_reply_print(register const u_char *bp, int length, int32_t opcode) { struct rx_header *rxh; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; rxh = (struct rx_header *) bp; @@ -1911,7 +1912,7 @@ kauth_reply_print(register const u_char *bp, int length, int32_t opcode) * Print out the afs call we're invoking. The table used here was * gleaned from kauth/kauth.rg */ - + printf(" kauth"); if (is_ubik(opcode)) { @@ -1953,10 +1954,10 @@ vol_print(register const u_char *bp, int length) { int vol_op; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; - if (snapend - bp + 1 <= sizeof(struct rx_header) + sizeof(int32_t)) { + if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) { goto trunc; } @@ -1969,13 +1970,176 @@ vol_print(register const u_char *bp, int length) 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(" "); + } + break; + case 65538: /* Dump version 2 */ + printf(" fromtrans"); + UINTOUT(); + printf(" fromdate"); + DATEOUT(); + printf(" flags"); + UINTOUT(); + break; + default: + ; + } return; trunc: @@ -1991,7 +2155,7 @@ vol_reply_print(register const u_char *bp, int length, int32_t opcode) { struct rx_header *rxh; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; rxh = (struct rx_header *) bp; @@ -2000,7 +2164,7 @@ vol_reply_print(register const u_char *bp, int length, int32_t opcode) * Print out the afs call we're invoking. The table used here was * gleaned from volser/volint.xg */ - + printf(" vol reply %s", tok2str(vol_req, "op#%d", opcode)); bp += sizeof(struct rx_header); @@ -2009,10 +2173,100 @@ vol_reply_print(register const u_char *bp, int length, int32_t opcode) * 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(" "); + } + break; + + + default: + ; + } + } else { /* * Otherwise, just print out the return code */ @@ -2035,10 +2289,10 @@ bos_print(register const u_char *bp, int length) { int bos_op; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; - if (snapend - bp + 1 <= sizeof(struct rx_header) + sizeof(int32_t)) { + if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) { goto trunc; } @@ -2126,7 +2380,7 @@ bos_reply_print(register const u_char *bp, int length, int32_t opcode) { struct rx_header *rxh; - if (length <= sizeof(struct rx_header)) + if (length <= (int)sizeof(struct rx_header)) return; rxh = (struct rx_header *) bp; @@ -2135,7 +2389,7 @@ bos_reply_print(register const u_char *bp, int length, int32_t opcode) * Print out the afs call we're invoking. The table used here was * gleaned from volser/volint.xg */ - + printf(" bos reply %s", tok2str(bos_req, "op#%d", opcode)); bp += sizeof(struct rx_header); @@ -2180,7 +2434,7 @@ is_ubik(u_int32_t opcode) */ static void -ubik_print(register const u_char *bp, int length) +ubik_print(register const u_char *bp) { int ubik_op; int32_t temp; @@ -2293,7 +2547,7 @@ ubik_reply_print(register const u_char *bp, int length, int32_t opcode) { struct rx_header *rxh; - if (length < sizeof(struct rx_header)) + if (length < (int)sizeof(struct rx_header)) return; rxh = (struct rx_header *) bp; @@ -2310,7 +2564,7 @@ ubik_reply_print(register const u_char *bp, int length, int32_t opcode) /* * If it was a data packet, print out the arguments to the Ubik calls */ - + if (rxh->type == RX_PACKET_TYPE_DATA) switch (opcode) { case 10000: /* Beacon */ @@ -2323,7 +2577,7 @@ ubik_reply_print(register const u_char *bp, int length, int32_t opcode) default: ; } - + /* * Otherwise, print out "yes" it it was a beacon packet (because * that's how yes votes are returned, go figure), otherwise @@ -2356,8 +2610,9 @@ rx_ack_print(register const u_char *bp, int length) { struct rx_ackPacket *rxa; int i, start, last; + u_int32_t firstPacket; - if (length < sizeof(struct rx_header)) + if (length < (int)sizeof(struct rx_header)) return; bp += sizeof(struct rx_header); @@ -2383,11 +2638,12 @@ rx_ack_print(register const u_char *bp, int length) printf(" bufspace %d maxskew %d", (int) EXTRACT_16BITS(&rxa->bufferSpace), (int) EXTRACT_16BITS(&rxa->maxSkew)); - + + firstPacket = EXTRACT_32BITS(&rxa->firstPacket); printf(" first %d serial %d reason %s", - EXTRACT_32BITS(&rxa->firstPacket), EXTRACT_32BITS(&rxa->serial), + firstPacket, EXTRACT_32BITS(&rxa->serial), tok2str(rx_ack_reasons, "#%d", (int) rxa->reason)); - + /* * Okay, now we print out the ack array. The way _this_ works * is that we start at "first", and step through the ack array. @@ -2400,7 +2656,7 @@ rx_ack_print(register const u_char *bp, int length) * yield the start of the ack array (because RX_MAXACKS is 255 * and the structure will likely get padded to a 2 or 4 byte * boundary). However, this is the way it's implemented inside - * of AFS - the start of the extra fields are at + * of AFS - the start of the extra fields are at * sizeof(struct rx_ackPacket) - RX_MAXACKS + nAcks, which _isn't_ * the exact start of the ack array. Sigh. That's why we aren't * using bp, but instead use rxa->acks[]. But nAcks gets added @@ -2428,7 +2684,7 @@ rx_ack_print(register const u_char *bp, int length) if (last == -2) { printf(" acked %d", - rxa->firstPacket + i); + firstPacket + i); start = i; } @@ -2442,7 +2698,7 @@ rx_ack_print(register const u_char *bp, int length) */ else if (last != i - 1) { - printf(",%d", rxa->firstPacket + i); + printf(",%d", firstPacket + i); start = i; } @@ -2468,8 +2724,8 @@ rx_ack_print(register const u_char *bp, int length) * range. */ } else if (last == i - 1 && start != last) - printf("-%d", rxa->firstPacket + i - 1); - + printf("-%d", firstPacket + i - 1); + /* * So, what's going on here? We ran off the end of the * ack list, and if we got a range we need to finish it up. @@ -2482,28 +2738,28 @@ rx_ack_print(register const u_char *bp, int length) */ if (last == i - 1 && start != last) - printf("-%d", rxa->firstPacket + i - 1); + printf("-%d", firstPacket + i - 1); /* * Same as above, just without comments */ - + for (i = 0, start = last = -2; i < rxa->nAcks; i++) if (rxa->acks[i] == RX_ACK_TYPE_NACK) { if (last == -2) { printf(" nacked %d", - rxa->firstPacket + i); + firstPacket + i); start = i; } else if (last != i - 1) { - printf(",%d", rxa->firstPacket + i); + printf(",%d", firstPacket + i); start = i; } last = i; } else if (last == i - 1 && start != last) - printf("-%d", rxa->firstPacket + i - 1); - + printf("-%d", firstPacket + i - 1); + if (last == i - 1 && start != last) - printf("-%d", rxa->firstPacket + i - 1); + printf("-%d", firstPacket + i - 1); bp += rxa->nAcks; }