X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/3824a6c0417a551961d1a1bf4f94f10eff736afc..6c78ecd7a8b996bc81cc28d412ed9afa55f0b84c:/print-rx.c diff --git a/print-rx.c b/print-rx.c index bf846f3e..8a607652 100644 --- a/print-rx.c +++ b/print-rx.c @@ -32,7 +32,6 @@ * Ken Hornstein */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -46,15 +45,89 @@ #include "addrtoname.h" #include "extract.h" -#ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.36 2003-11-15 00:39:38 guy Exp $"; -#endif -#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" }, @@ -68,7 +141,7 @@ static struct tok rx_types[] = { { 0, NULL }, }; -static struct double_tok { +static const struct double_tok { int flag; /* Rx flag */ int packetType; /* Packet type */ const char *s; /* Flag string */ @@ -82,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" }, @@ -118,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" }, @@ -137,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" }, @@ -163,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" }, @@ -204,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" }, @@ -226,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" }, @@ -256,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" }, @@ -300,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" }, @@ -325,18 +413,18 @@ 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" }, @@ -345,7 +433,7 @@ static struct tok ubik_lock_types[] = { 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" }, @@ -358,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 } }; @@ -366,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" }, @@ -638,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); @@ -688,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); \ @@ -763,6 +858,17 @@ rx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport, 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 +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); @@ -904,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: ; } @@ -1013,6 +1140,7 @@ 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; @@ -1046,7 +1174,8 @@ 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(" +{"); @@ -1059,7 +1188,8 @@ 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(" -{"); @@ -1264,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; @@ -1912,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: @@ -1952,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 */ @@ -2299,6 +2683,7 @@ rx_ack_print(register const u_char *bp, int length) { struct rx_ackPacket *rxa; int i, start, last; + u_int32_t firstPacket; if (length < (int)sizeof(struct rx_header)) return; @@ -2327,8 +2712,9 @@ rx_ack_print(register const u_char *bp, int length) (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)); /* @@ -2371,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; } @@ -2385,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; } @@ -2411,7 +2797,7 @@ 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 @@ -2425,7 +2811,7 @@ 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 @@ -2435,18 +2821,18 @@ rx_ack_print(register const u_char *bp, int length) 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; }