]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-rx.c
OpenFlow: Have a function for each message type.
[tcpdump] / print-rx.c
index 1464fa395860d504c59327a19e5d432fcb576ff3..4f0195282ff6340db97a2f2bd23ef74225e02d28 100644 (file)
 #define ERROR_RX_PORT  7006            /* Doesn't seem to be used */
 #define BOS_RX_PORT    7007
 
-#define AFSNAMEMAX 256
 #define AFSOPAQUEMAX 1024
+#define AFSNAMEMAX 256                 /* Must be >= PRNAMEMAX + 1, VLNAMEMAX + 1, and 32 + 1 */
 #define PRNAMEMAX 64
 #define VLNAMEMAX 65
 #define KANAMEMAX 64
 #define BOSNAMEMAX 256
+#define USERNAMEMAX 1024               /* AFSOPAQUEMAX was used for this; does it need to be this big? */
 
 #define        PRSFS_READ              1 /* Read files */
 #define        PRSFS_WRITE             2 /* Write files */
@@ -480,9 +481,9 @@ static const struct tok rx_ack_reasons[] = {
 
 struct rx_cache_entry {
        uint32_t        callnum;        /* Call number (net order) */
-       struct in_addr  client;         /* client IP address (net order) */
-       struct in_addr  server;         /* server IP address (net order) */
-       u_int           dport;          /* server port (host order) */
+       uint32_t        client;         /* client IP address (net order) */
+       uint32_t        server;         /* server IP address (net order) */
+       uint16_t        dport;          /* server UDP port (host order) */
        uint16_t        serviceId;      /* Service identifier (net order) */
        uint32_t        opcode;         /* RX opcode (host order) */
 };
@@ -493,13 +494,13 @@ static struct rx_cache_entry      rx_cache[RX_CACHE_SIZE];
 
 static uint32_t        rx_cache_next = 0;
 static uint32_t        rx_cache_hint = 0;
-static void    rx_cache_insert(netdissect_options *, const u_char *, const struct ip *, u_int);
+static void    rx_cache_insert(netdissect_options *, const u_char *, const struct ip *, uint16_t);
 static int     rx_cache_find(netdissect_options *, const struct rx_header *,
-                             const struct ip *, uint32_t, uint32_t *);
+                             const struct ip *, uint16_t, uint32_t *);
 
 static void fs_print(netdissect_options *, const u_char *, u_int);
 static void fs_reply_print(netdissect_options *, const u_char *, u_int, uint32_t);
-static void acl_print(netdissect_options *, u_char *, int, u_char *);
+static void acl_print(netdissect_options *, u_char *, u_char *);
 static void cb_print(netdissect_options *, const u_char *, u_int);
 static void cb_reply_print(netdissect_options *, const u_char *, u_int, uint32_t);
 static void prot_print(netdissect_options *, const u_char *, u_int);
@@ -526,7 +527,7 @@ static int is_ubik(uint32_t);
 
 void
 rx_print(netdissect_options *ndo,
-         const u_char *bp, u_int length, u_int sport, u_int dport,
+         const u_char *bp, u_int length, uint16_t sport, uint16_t dport,
          const u_char *bp2)
 {
        const struct rx_header *rxh;
@@ -684,7 +685,7 @@ rx_print(netdissect_options *ndo,
 
 static void
 rx_cache_insert(netdissect_options *ndo,
-                const u_char *bp, const struct ip *ip, u_int dport)
+                const u_char *bp, const struct ip *ip, uint16_t dport)
 {
        struct rx_cache_entry *rxent;
        const struct rx_header *rxh = (const struct rx_header *) bp;
@@ -698,8 +699,8 @@ rx_cache_insert(netdissect_options *ndo,
                rx_cache_next = 0;
 
        rxent->callnum = GET_BE_U_4(rxh->callNumber);
-       UNALIGNED_MEMCPY(&rxent->client, ip->ip_src, sizeof(uint32_t));
-       UNALIGNED_MEMCPY(&rxent->server, ip->ip_dst, sizeof(uint32_t));
+       rxent->client = GET_IPV4_TO_NETWORK_ORDER(ip->ip_src);
+       rxent->server = GET_IPV4_TO_NETWORK_ORDER(ip->ip_dst);
        rxent->dport = dport;
        rxent->serviceId = GET_BE_U_2(rxh->serviceId);
        rxent->opcode = GET_BE_U_4(bp + sizeof(struct rx_header));
@@ -714,15 +715,15 @@ rx_cache_insert(netdissect_options *ndo,
 
 static int
 rx_cache_find(netdissect_options *ndo, const struct rx_header *rxh,
-             const struct ip *ip, u_int sport, uint32_t *opcode)
+             const struct ip *ip, uint16_t sport, uint32_t *opcode)
 {
        uint32_t i;
        struct rx_cache_entry *rxent;
        uint32_t clip;
        uint32_t sip;
 
-       UNALIGNED_MEMCPY(&clip, ip->ip_dst, sizeof(uint32_t));
-       UNALIGNED_MEMCPY(&sip, ip->ip_src, sizeof(uint32_t));
+       clip = GET_IPV4_TO_NETWORK_ORDER(ip->ip_dst);
+       sip = GET_IPV4_TO_NETWORK_ORDER(ip->ip_src);
 
        /* Start the search where we last left off */
 
@@ -730,8 +731,8 @@ rx_cache_find(netdissect_options *ndo, const struct rx_header *rxh,
        do {
                rxent = &rx_cache[i];
                if (rxent->callnum == GET_BE_U_4(rxh->callNumber) &&
-                   rxent->client.s_addr == clip &&
-                   rxent->server.s_addr == sip &&
+                   rxent->client == clip &&
+                   rxent->server == sip &&
                    rxent->serviceId == GET_BE_U_2(rxh->serviceId) &&
                    rxent->dport == sport) {
 
@@ -765,7 +766,6 @@ rx_cache_find(netdissect_options *ndo, const struct rx_header *rxh,
                }
 
 #define STROUT(MAX) { uint32_t _i; \
-                       ND_TCHECK_LEN(bp, sizeof(uint32_t)); \
                        _i = GET_BE_U_4(bp); \
                        if (_i > (MAX)) \
                                goto trunc; \
@@ -778,28 +778,24 @@ rx_cache_find(netdissect_options *ndo, const struct rx_header *rxh,
                }
 
 #define INTOUT() { int32_t _i; \
-                       ND_TCHECK_4(bp); \
                        _i = GET_BE_S_4(bp); \
                        bp += sizeof(int32_t); \
                        ND_PRINT(" %d", _i); \
                }
 
 #define UINTOUT() { uint32_t _i; \
-                       ND_TCHECK_4(bp); \
                        _i = GET_BE_U_4(bp); \
                        bp += sizeof(uint32_t); \
                        ND_PRINT(" %u", _i); \
                }
 
 #define UINT64OUT() { uint64_t _i; \
-                       ND_TCHECK_LEN(bp, sizeof(uint64_t)); \
                        _i = GET_BE_U_8(bp); \
                        bp += sizeof(uint64_t); \
                        ND_PRINT(" %" PRIu64, _i); \
                }
 
 #define DATEOUT() { time_t _t; struct tm *tm; char str[256]; \
-                       ND_TCHECK_4(bp); \
                        _t = (time_t) GET_BE_S_4(bp); \
                        bp += sizeof(int32_t); \
                        tm = localtime(&_t); \
@@ -854,13 +850,12 @@ rx_cache_find(netdissect_options *ndo, const struct rx_header *rxh,
 
 /*
  * This is the sickest one of all
+ * MAX is expected to be a constant here
  */
 
 #define VECOUT(MAX) { u_char *sp; \
-                       u_char s[AFSNAMEMAX]; \
+                       u_char s[(MAX) + 1]; \
                        uint32_t k; \
-                       if ((MAX) + 1 > sizeof(s)) \
-                               goto trunc; \
                        ND_TCHECK_LEN(bp, (MAX) * sizeof(uint32_t)); \
                        sp = s; \
                        for (k = 0; k < (MAX); k++) { \
@@ -903,7 +898,6 @@ fs_print(netdissect_options *ndo,
         * gleaned from fsint/afsint.xg
         */
 
-       ND_TCHECK_4(bp + sizeof(struct rx_header));
        fs_op = GET_BE_U_4(bp + sizeof(struct rx_header));
 
        ND_PRINT(" fs call %s", tok2str(fs_req, "op#%u", fs_op));
@@ -955,14 +949,13 @@ fs_print(netdissect_options *ndo,
                {
                        char a[AFSOPAQUEMAX+1];
                        FIDOUT();
-                       ND_TCHECK_4(bp);
                        i = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        ND_TCHECK_LEN(bp, i);
-                       i = min(AFSOPAQUEMAX, i);
+                       i = ND_MIN(AFSOPAQUEMAX, i);
                        strncpy(a, (const char *) bp, i);
                        a[i] = '\0';
-                       acl_print(ndo, (u_char *) a, sizeof(a), (u_char *) a + i);
+                       acl_print(ndo, (u_char *) a, (u_char *) a + i);
                        break;
                }
                case 137:       /* Create file */
@@ -1012,7 +1005,6 @@ fs_print(netdissect_options *ndo,
                case 65536:     /* Inline bulk stat */
                {
                        uint32_t j;
-                       ND_TCHECK_4(bp);
                        j = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
 
@@ -1091,14 +1083,13 @@ fs_reply_print(netdissect_options *ndo,
                case 131:       /* Fetch ACL */
                {
                        char a[AFSOPAQUEMAX+1];
-                       ND_TCHECK_4(bp);
                        i = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        ND_TCHECK_LEN(bp, i);
-                       i = min(AFSOPAQUEMAX, i);
+                       i = ND_MIN(AFSOPAQUEMAX, i);
                        strncpy(a, (const char *) bp, i);
                        a[i] = '\0';
-                       acl_print(ndo, (u_char *) a, sizeof(a), (u_char *) a + i);
+                       acl_print(ndo, (u_char *) a, (u_char *) a + i);
                        break;
                }
                case 137:       /* Create file */
@@ -1122,7 +1113,6 @@ fs_reply_print(netdissect_options *ndo,
                 */
                int32_t errcode;
 
-               ND_TCHECK_4(bp);
                errcode = GET_BE_S_4(bp);
                bp += sizeof(int32_t);
 
@@ -1151,25 +1141,23 @@ trunc:
  * representing a logical OR of all the ACL permission bits
  */
 
+#define NUMSTRINGIFY(x)        XSTRINGIFY(x)
+
 static void
 acl_print(netdissect_options *ndo,
-          u_char *s, int maxsize, u_char *end)
+          u_char *s, u_char *end)
 {
        int pos, neg, acl;
        int n, i;
-       char *user;
-       char fmt[1024];
-
-       if ((user = (char *)malloc(maxsize)) == NULL)
-               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "acl_print: malloc");
+       char user[USERNAMEMAX+1];
 
        if (sscanf((char *) s, "%d %d\n%n", &pos, &neg, &n) != 2)
-               goto finish;
+               return;
 
        s += n;
 
        if (s > end)
-               goto finish;
+               return;
 
        /*
         * This wacky order preserves the order used by the "fs" command
@@ -1186,9 +1174,8 @@ acl_print(netdissect_options *ndo,
                  acl & PRSFS_ADMINISTER ? "a" : "");
 
        for (i = 0; i < pos; i++) {
-               nd_snprintf(fmt, sizeof(fmt), "%%%ds %%d\n%%n", maxsize - 1);
-               if (sscanf((char *) s, fmt, user, &acl, &n) != 2)
-                       goto finish;
+               if (sscanf((char *) s, "%" NUMSTRINGIFY(USERNAMEMAX) "s %d\n%n", user, &acl, &n) != 2)
+                       return;
                s += n;
                ND_PRINT(" +{");
                fn_print_str(ndo, (u_char *)user);
@@ -1196,13 +1183,12 @@ acl_print(netdissect_options *ndo,
                ACLOUT(acl);
                ND_PRINT("}");
                if (s > end)
-                       goto finish;
+                       return;
        }
 
        for (i = 0; i < neg; i++) {
-               nd_snprintf(fmt, sizeof(fmt), "%%%ds %%d\n%%n", maxsize - 1);
-               if (sscanf((char *) s, fmt, user, &acl, &n) != 2)
-                       goto finish;
+               if (sscanf((char *) s, "%" NUMSTRINGIFY(USERNAMEMAX) "s %d\n%n", user, &acl, &n) != 2)
+                       return;
                s += n;
                ND_PRINT(" -{");
                fn_print_str(ndo, (u_char *)user);
@@ -1210,12 +1196,8 @@ acl_print(netdissect_options *ndo,
                ACLOUT(acl);
                ND_PRINT("}");
                if (s > end)
-                       goto finish;
+                       return;
        }
-
-finish:
-       free(user);
-       return;
 }
 
 #undef ACLOUT
@@ -1239,7 +1221,6 @@ cb_print(netdissect_options *ndo,
         * gleaned from fsint/afscbint.xg
         */
 
-       ND_TCHECK_4(bp + sizeof(struct rx_header));
        cb_op = GET_BE_U_4(bp + sizeof(struct rx_header));
 
        ND_PRINT(" cb call %s", tok2str(cb_req, "op#%u", cb_op));
@@ -1255,7 +1236,6 @@ cb_print(netdissect_options *ndo,
                case 204:               /* Callback */
                {
                        uint32_t j, t;
-                       ND_TCHECK_4(bp);
                        j = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
 
@@ -1268,7 +1248,6 @@ cb_print(netdissect_options *ndo,
                        if (j == 0)
                                ND_PRINT(" <none!>");
 
-                       ND_TCHECK_4(bp);
                        j = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
 
@@ -1280,7 +1259,6 @@ cb_print(netdissect_options *ndo,
                                INTOUT();
                                ND_PRINT(" expires");
                                DATEOUT();
-                               ND_TCHECK_4(bp);
                                t = GET_BE_U_4(bp);
                                bp += sizeof(uint32_t);
                                tok2str(cb_types, "type %u", t);
@@ -1373,7 +1351,6 @@ prot_print(netdissect_options *ndo,
         * gleaned from ptserver/ptint.xg
         */
 
-       ND_TCHECK_4(bp + sizeof(struct rx_header));
        pt_op = GET_BE_U_4(bp + sizeof(struct rx_header));
 
        ND_PRINT(" pt");
@@ -1426,7 +1403,6 @@ prot_print(netdissect_options *ndo,
                case 504:       /* Name to ID */
                {
                        uint32_t j;
-                       ND_TCHECK_4(bp);
                        j = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
 
@@ -1448,7 +1424,6 @@ prot_print(netdissect_options *ndo,
                {
                        uint32_t j;
                        ND_PRINT(" ids:");
-                       ND_TCHECK_4(bp);
                        i = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        for (j = 0; j < i; j++)
@@ -1540,7 +1515,6 @@ prot_reply_print(netdissect_options *ndo,
                {
                        uint32_t j;
                        ND_PRINT(" ids:");
-                       ND_TCHECK_4(bp);
                        i = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        for (j = 0; j < i; j++)
@@ -1552,7 +1526,6 @@ prot_reply_print(netdissect_options *ndo,
                case 505:               /* ID to name */
                {
                        uint32_t j;
-                       ND_TCHECK_4(bp);
                        j = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
 
@@ -1577,7 +1550,6 @@ prot_reply_print(netdissect_options *ndo,
                case 519:               /* Get host CPS */
                {
                        uint32_t j;
-                       ND_TCHECK_4(bp);
                        j = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        for (i = 0; i < j; i++) {
@@ -1629,7 +1601,6 @@ vldb_print(netdissect_options *ndo,
         * gleaned from vlserver/vldbint.xg
         */
 
-       ND_TCHECK_4(bp + sizeof(struct rx_header));
        vldb_op = GET_BE_U_4(bp + sizeof(struct rx_header));
 
        ND_PRINT(" vldb");
@@ -1659,7 +1630,6 @@ vldb_print(netdissect_options *ndo,
                case 518:       /* Get entry by ID N */
                        ND_PRINT(" volid");
                        INTOUT();
-                       ND_TCHECK_4(bp);
                        i = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        if (i <= 2)
@@ -1679,7 +1649,6 @@ vldb_print(netdissect_options *ndo,
                case 520:       /* Replace entry N */
                        ND_PRINT(" volid");
                        INTOUT();
-                       ND_TCHECK_4(bp);
                        i = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        if (i <= 2)
@@ -1755,7 +1724,6 @@ vldb_reply_print(netdissect_options *ndo,
                        ND_TCHECK_4(bp);
                        bp += sizeof(uint32_t);
                        ND_PRINT(" numservers");
-                       ND_TCHECK_4(bp);
                        nservers = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        ND_PRINT(" %u", nservers);
@@ -1769,7 +1737,6 @@ vldb_reply_print(netdissect_options *ndo,
                        }
                        ND_PRINT(" partitions");
                        for (i = 0; i < 8; i++) {
-                               ND_TCHECK_4(bp);
                                j = GET_BE_U_4(bp);
                                if (i < nservers && j <= 26)
                                        ND_PRINT(" %c", 'a' + j);
@@ -1803,7 +1770,6 @@ vldb_reply_print(netdissect_options *ndo,
                {       uint32_t nservers, j;
                        VECOUT(VLNAMEMAX);
                        ND_PRINT(" numservers");
-                       ND_TCHECK_4(bp);
                        nservers = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        ND_PRINT(" %u", nservers);
@@ -1817,7 +1783,6 @@ vldb_reply_print(netdissect_options *ndo,
                        }
                        ND_PRINT(" partitions");
                        for (i = 0; i < 13; i++) {
-                               ND_TCHECK_4(bp);
                                j = GET_BE_U_4(bp);
                                if (i < nservers && j <= 26)
                                        ND_PRINT(" %c", 'a' + j);
@@ -1840,7 +1805,6 @@ vldb_reply_print(netdissect_options *ndo,
                {       uint32_t nservers, j;
                        VECOUT(VLNAMEMAX);
                        ND_PRINT(" numservers");
-                       ND_TCHECK_4(bp);
                        nservers = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        ND_PRINT(" %u", nservers);
@@ -1858,7 +1822,6 @@ vldb_reply_print(netdissect_options *ndo,
                        bp += 4 * 13;
                        ND_PRINT(" partitions");
                        for (i = 0; i < 13; i++) {
-                               ND_TCHECK_4(bp);
                                j = GET_BE_U_4(bp);
                                if (i < nservers && j <= 26)
                                        ND_PRINT(" %c", 'a' + j);
@@ -1911,7 +1874,6 @@ kauth_print(netdissect_options *ndo,
         * gleaned from kauth/kauth.rg
         */
 
-       ND_TCHECK_4(bp + sizeof(struct rx_header));
        kauth_op = GET_BE_U_4(bp + sizeof(struct rx_header));
 
        ND_PRINT(" kauth");
@@ -1953,7 +1915,6 @@ kauth_print(netdissect_options *ndo,
                        INTOUT();
                        ND_PRINT(" domain");
                        STROUT(KANAMEMAX);
-                       ND_TCHECK_4(bp);
                        i = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        ND_TCHECK_LEN(bp, i);
@@ -2031,11 +1992,6 @@ kauth_reply_print(netdissect_options *ndo,
                ND_PRINT(" errcode");
                INTOUT();
        }
-
-       return;
-
-trunc:
-       ND_PRINT(" [|kauth]");
 }
 
 /*
@@ -2056,7 +2012,6 @@ vol_print(netdissect_options *ndo,
         * gleaned from volser/volint.xg
         */
 
-       ND_TCHECK_4(bp + sizeof(struct rx_header));
        vol_op = GET_BE_U_4(bp + sizeof(struct rx_header));
 
        ND_PRINT(" vol call %s", tok2str(vol_req, "op#%u", vol_op));
@@ -2208,7 +2163,6 @@ vol_print(netdissect_options *ndo,
                        DATEOUT();
                        {
                                uint32_t i, j;
-                               ND_TCHECK_4(bp);
                                j = GET_BE_U_4(bp);
                                bp += sizeof(uint32_t);
                                for (i = 0; i < j; i++) {
@@ -2338,7 +2292,6 @@ vol_reply_print(netdissect_options *ndo,
                        case 121:       /* List one volume */
                                {
                                        uint32_t i, j;
-                                       ND_TCHECK_4(bp);
                                        j = GET_BE_U_4(bp);
                                        bp += sizeof(uint32_t);
                                        for (i = 0; i < j; i++) {
@@ -2392,7 +2345,6 @@ bos_print(netdissect_options *ndo,
         * gleaned from bozo/bosint.xg
         */
 
-       ND_TCHECK_4(bp + sizeof(struct rx_header));
        bos_op = GET_BE_U_4(bp + sizeof(struct rx_header));
 
        ND_PRINT(" bos call %s", tok2str(bos_req, "op#%u", bos_op));
@@ -2503,11 +2455,6 @@ bos_reply_print(netdissect_options *ndo,
                ND_PRINT(" errcode");
                INTOUT();
        }
-
-       return;
-
-trunc:
-       ND_PRINT(" [|bos]");
 }
 
 /*
@@ -2556,7 +2503,6 @@ ubik_print(netdissect_options *ndo,
 
        switch (ubik_op) {
                case 10000:             /* Beacon */
-                       ND_TCHECK_4(bp);
                        temp = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        ND_PRINT(" syncsite %s", temp ? "yes" : "no");
@@ -2588,7 +2534,6 @@ ubik_print(netdissect_options *ndo,
                        INTOUT();
                        ND_PRINT(" length");
                        INTOUT();
-                       ND_TCHECK_4(bp);
                        temp = GET_BE_U_4(bp);
                        bp += sizeof(uint32_t);
                        tok2str(ubik_lock_types, "type %u", temp);
@@ -2683,7 +2628,7 @@ ubik_reply_print(netdissect_options *ndo,
                }
 
        /*
-        * Otherwise, print out "yes" it it was a beacon packet (because
+        * Otherwise, print out "yes" if it was a beacon packet (because
         * that's how yes votes are returned, go figure), otherwise
         * just print out the error code.
         */