X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/16b8ef371ad0925361305d8b64554f00478450cb..5663cdab5ec8730ade9938c1ace64a4859d9ef7b:/print-rx.c diff --git a/print-rx.c b/print-rx.c index 34fa304f..8a607652 100644 --- a/print-rx.c +++ b/print-rx.c @@ -5,7 +5,7 @@ * 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 @@ -15,7 +15,7 @@ * 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. @@ -32,11 +32,6 @@ * Ken Hornstein */ -#ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.27 2001-10-20 07:41:55 itojun Exp $"; -#endif - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -44,23 +39,95 @@ static const char rcsid[] = #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include #include "interface.h" #include "addrtoname.h" #include "extract.h" -#include "rx.h" - #include "ip.h" -static struct tok rx_types[] = { +#define FS_RX_PORT 7000 +#define CB_RX_PORT 7001 +#define PROT_RX_PORT 7002 +#define VLDB_RX_PORT 7003 +#define KAUTH_RX_PORT 7004 +#define VOL_RX_PORT 7005 +#define ERROR_RX_PORT 7006 /* Doesn't seem to be used */ +#define BOS_RX_PORT 7007 + +#define AFSNAMEMAX 256 +#define AFSOPAQUEMAX 1024 +#define PRNAMEMAX 64 +#define VLNAMEMAX 65 +#define KANAMEMAX 64 +#define BOSNAMEMAX 256 + +#define PRSFS_READ 1 /* Read files */ +#define PRSFS_WRITE 2 /* Write files */ +#define PRSFS_INSERT 4 /* Insert files into a directory */ +#define PRSFS_LOOKUP 8 /* Lookup files into a directory */ +#define PRSFS_DELETE 16 /* Delete files */ +#define PRSFS_LOCK 32 /* Lock files */ +#define PRSFS_ADMINISTER 64 /* Change ACL's */ + +struct rx_header { + u_int32_t epoch; + u_int32_t cid; + u_int32_t callNumber; + u_int32_t seq; + u_int32_t serial; + u_int8_t type; +#define RX_PACKET_TYPE_DATA 1 +#define RX_PACKET_TYPE_ACK 2 +#define RX_PACKET_TYPE_BUSY 3 +#define RX_PACKET_TYPE_ABORT 4 +#define RX_PACKET_TYPE_ACKALL 5 +#define RX_PACKET_TYPE_CHALLENGE 6 +#define RX_PACKET_TYPE_RESPONSE 7 +#define RX_PACKET_TYPE_DEBUG 8 +#define RX_PACKET_TYPE_PARAMS 9 +#define RX_PACKET_TYPE_VERSION 13 + u_int8_t flags; +#define RX_CLIENT_INITIATED 1 +#define RX_REQUEST_ACK 2 +#define RX_LAST_PACKET 4 +#define RX_MORE_PACKETS 8 +#define RX_FREE_PACKET 16 +#define RX_SLOW_START_OK 32 +#define RX_JUMBO_PACKET 32 + u_int8_t userStatus; + u_int8_t securityIndex; + u_int16_t spare; /* How clever: even though the AFS */ + u_int16_t serviceId; /* header files indicate that the */ +}; /* serviceId is first, it's really */ + /* encoded _after_ the spare field */ + /* I wasted a day figuring that out! */ + +#define NUM_RX_FLAGS 7 + +#define RX_MAXACKS 255 + +struct rx_ackPacket { + u_int16_t bufferSpace; /* Number of packet buffers available */ + u_int16_t maxSkew; /* Max diff between ack'd packet and */ + /* highest packet received */ + u_int32_t firstPacket; /* The first packet in ack list */ + u_int32_t previousPacket; /* Previous packet recv'd (obsolete) */ + u_int32_t serial; /* # of packet that prompted the ack */ + u_int8_t reason; /* Reason for acknowledgement */ + u_int8_t nAcks; /* Number of acknowledgements */ + u_int8_t acks[RX_MAXACKS]; /* Up to RX_MAXACKS acknowledgements */ +}; + +/* + * Values for the acks array + */ + +#define RX_ACK_TYPE_NACK 0 /* Don't have this packet */ +#define RX_ACK_TYPE_ACK 1 /* I have this packet */ + +static const struct tok rx_types[] = { { RX_PACKET_TYPE_DATA, "data" }, { RX_PACKET_TYPE_ACK, "ack" }, { RX_PACKET_TYPE_BUSY, "busy" }, @@ -74,10 +141,10 @@ static struct tok rx_types[] = { { 0, NULL }, }; -static struct double_tok { +static const 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" }, @@ -88,7 +155,7 @@ static struct double_tok { { 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" }, @@ -124,10 +191,16 @@ 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 }, }; -static struct tok cb_req[] = { +static const struct tok cb_req[] = { { 204, "callback" }, { 205, "initcb" }, { 206, "probe" }, @@ -143,10 +216,13 @@ static struct tok cb_req[] = { { 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" }, @@ -169,10 +245,11 @@ static struct tok pt_req[] = { { 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" }, @@ -210,7 +287,7 @@ static struct tok vldb_req[] = { { 0, NULL }, }; -static struct tok kauth_req[] = { +static const struct tok kauth_req[] = { { 1, "auth-old" }, { 21, "authenticate" }, { 22, "authenticate-v2" }, @@ -232,7 +309,7 @@ static struct tok kauth_req[] = { { 0, NULL }, }; -static struct tok vol_req[] = { +static const struct tok vol_req[] = { { 100, "create-volume" }, { 101, "delete-volume" }, { 102, "restore" }, @@ -262,10 +339,13 @@ 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 }, }; -static struct tok bos_req[] = { +static const struct tok bos_req[] = { { 80, "create-bnode" }, { 81, "delete-bnode" }, { 82, "set-status" }, @@ -306,13 +386,15 @@ static struct tok bos_req[] = { { 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" }, @@ -331,27 +413,27 @@ 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 -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" }, { 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[] = { +static const struct tok afs_fs_errors[] = { { 101, "salvage volume" }, { 102, "no such vnode" }, { 103, "no such volume" }, @@ -364,7 +446,7 @@ static struct tok afs_fs_errors[] = { { 110, "volume busy" }, { 111, "volume moved" }, { 112, "AFS IO error" }, - { -100, "restarting fileserver" }, + { 0xffffff9c, "restarting fileserver" }, /* -100, sic! */ { 0, NULL } }; @@ -372,7 +454,7 @@ static struct tok afs_fs_errors[] = { * 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" }, @@ -381,6 +463,7 @@ static struct tok rx_ack_reasons[] = { { 6, "ping" }, { 7, "ping response" }, { 8, "delay" }, + { 9, "idle" }, { 0, NULL }, }; @@ -404,11 +487,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 *); @@ -424,7 +506,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); @@ -444,7 +526,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; } @@ -495,9 +577,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) { @@ -506,7 +586,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 */ @@ -533,7 +613,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 @@ -592,20 +672,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; @@ -637,7 +716,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) { @@ -647,7 +726,7 @@ rx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport, *opcode = rxent->opcode; return(1); } - if (++i > RX_CACHE_SIZE) + if (++i >= RX_CACHE_SIZE) i = 0; } while (i != rx_cache_hint); @@ -697,6 +776,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); \ @@ -710,18 +796,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; \ @@ -755,15 +841,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'; \ @@ -772,74 +858,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) @@ -851,10 +879,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; } @@ -968,6 +996,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); @@ -982,6 +1011,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: ; } @@ -1002,7 +1051,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; @@ -1053,12 +1102,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 { @@ -1078,7 +1127,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 @@ -1091,13 +1140,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) @@ -1124,11 +1174,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("}"); @@ -1137,11 +1188,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("}"); @@ -1166,10 +1218,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; } @@ -1247,7 +1299,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; @@ -1256,7 +1308,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); @@ -1297,10 +1349,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; } @@ -1314,7 +1366,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; } @@ -1342,6 +1394,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; @@ -1439,7 +1492,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; @@ -1551,10 +1604,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; } @@ -1568,7 +1621,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)); @@ -1644,7 +1697,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; @@ -1693,7 +1746,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"); @@ -1740,7 +1793,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"); @@ -1806,7 +1859,7 @@ vldb_reply_print(register const u_char *bp, int length, int32_t opcode) default: ; } - + else { /* * Otherwise, just print out the return code @@ -1830,10 +1883,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; } @@ -1847,7 +1900,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; } @@ -1923,7 +1976,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; @@ -1932,7 +1985,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)) { @@ -1974,10 +2027,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; } @@ -1990,13 +2043,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: @@ -2012,7 +2228,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; @@ -2021,7 +2237,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); @@ -2030,10 +2246,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 */ @@ -2056,10 +2362,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; } @@ -2147,7 +2453,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; @@ -2156,7 +2462,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); @@ -2201,7 +2507,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; @@ -2314,7 +2620,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; @@ -2331,7 +2637,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 */ @@ -2344,7 +2650,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 @@ -2377,8 +2683,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); @@ -2404,11 +2711,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. @@ -2421,7 +2729,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 @@ -2449,7 +2757,7 @@ rx_ack_print(register const u_char *bp, int length) if (last == -2) { printf(" acked %d", - rxa->firstPacket + i); + firstPacket + i); start = i; } @@ -2463,7 +2771,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; } @@ -2489,8 +2797,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. @@ -2503,28 +2811,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; }