]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-rx.c
add boundary, infinite loop checks
[tcpdump] / print-rx.c
index 1a18124ea1c5d4893ac13a7a8f0adb99f7ae5543..5daaf7e00211d7891c85625b0c3bc4db2bf2b81e 100644 (file)
@@ -33,8 +33,8 @@
  */
 
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.32 2002-08-06 04:42:06 guy Exp $";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.37 2003-11-16 09:36:36 guy Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -71,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" },
@@ -343,7 +343,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" },
@@ -375,6 +375,7 @@ static struct tok rx_ack_reasons[] = {
        { 6,            "ping" },
        { 7,            "ping response" },
        { 8,            "delay" },
+       { 9,            "idle" },
        { 0,            NULL },
 };
 
@@ -398,11 +399,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 *);
@@ -418,7 +418,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);
@@ -438,7 +438,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;
        }
@@ -489,9 +489,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) {
 
@@ -500,7 +498,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 */
@@ -586,13 +584,12 @@ 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];
@@ -766,75 +763,6 @@ 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]");
-}
-
 /*
  * Handle calls to the AFS file service (fs)
  */
@@ -845,10 +773,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;
        }
 
@@ -996,7 +924,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;
@@ -1160,10 +1088,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;
        }
 
@@ -1241,7 +1169,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;
@@ -1291,10 +1219,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;
        }
 
@@ -1308,7 +1236,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;
        }
 
@@ -1433,7 +1361,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;
@@ -1545,10 +1473,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;
        }
 
@@ -1562,7 +1490,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));
@@ -1638,7 +1566,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;
@@ -1687,7 +1615,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");
@@ -1734,7 +1662,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");
@@ -1824,10 +1752,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;
        }
 
@@ -1841,7 +1769,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;
        }
 
@@ -1917,7 +1845,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;
@@ -1968,10 +1896,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;
        }
 
@@ -2006,7 +1934,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;
@@ -2050,10 +1978,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;
        }
 
@@ -2141,7 +2069,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;
@@ -2195,7 +2123,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;
@@ -2308,7 +2236,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;
@@ -2372,7 +2300,7 @@ rx_ack_print(register const u_char *bp, int length)
        struct rx_ackPacket *rxa;
        int i, start, last;
 
-       if (length < sizeof(struct rx_header))
+       if (length < (int)sizeof(struct rx_header))
                return;
 
        bp += sizeof(struct rx_header);