]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ipx.c
More UNALIGNED_MEM{CPY,CMP} on IP addresses.
[tcpdump] / print-ipx.c
index b5f6de6d2b574892fb2f10b571f283d88eb41312..e7102a5e5a7c5657c21310362a943db014c6a2ae 100644 (file)
  * Contributed by Brad Parker ([email protected]).
  */
 
-#ifndef lint
-static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-ipx.c,v 1.40 2004-05-26 19:57:57 guy Exp $";
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -39,9 +34,32 @@ static const char rcsid[] _U_ =
 
 #include "interface.h"
 #include "addrtoname.h"
-#include "ipx.h"
 #include "extract.h"
 
+/* well-known sockets */
+#define        IPX_SKT_NCP             0x0451
+#define        IPX_SKT_SAP             0x0452
+#define        IPX_SKT_RIP             0x0453
+#define        IPX_SKT_NETBIOS         0x0455
+#define        IPX_SKT_DIAGNOSTICS     0x0456
+#define        IPX_SKT_NWLINK_DGM      0x0553  /* NWLink datagram, may contain SMB */
+#define        IPX_SKT_EIGRP           0x85be  /* Cisco EIGRP over IPX */
+
+/* IPX transport header */
+struct ipxHdr {
+    u_int16_t  cksum;          /* Checksum */
+    u_int16_t  length;         /* Length, in bytes, including header */
+    u_int8_t   tCtl;           /* Transport Control (i.e. hop count) */
+    u_int8_t   pType;          /* Packet Type (i.e. level 2 protocol) */
+    u_int16_t  dstNet[2];      /* destination net */
+    u_int8_t   dstNode[6];     /* destination node */
+    u_int16_t  dstSkt;         /* destination socket */
+    u_int16_t  srcNet[2];      /* source net */
+    u_int8_t   srcNode[6];     /* source node */
+    u_int16_t  srcSkt;         /* source socket */
+};
+
+#define ipxSize        30
 
 static const char *ipxaddr_string(u_int32_t, const u_char *);
 void ipx_decode(const struct ipxHdr *, const u_char *, u_int);
@@ -159,9 +177,13 @@ ipx_sap_print(const u_short *ipx, u_int length)
            (void)printf("ipx-sap-nearest-resp");
 
        for (i = 0; i < 8 && length > 0; i++) {
-           TCHECK2(ipx[25], 10);
+           TCHECK(ipx[0]);
            (void)printf(" %s '", ipxsap_string(htons(EXTRACT_16BITS(&ipx[0]))));
-           fn_print((u_char *)&ipx[1], (u_char *)&ipx[1] + 48);
+           if (fn_printzp((u_char *)&ipx[1], 48, snapend)) {
+               printf("'");
+               goto trunc;
+           }
+           TCHECK2(ipx[25], 10);
            printf("' addr %s",
                ipxaddr_string(EXTRACT_32BITS(&ipx[25]), (u_char *)&ipx[27]));
            ipx += 32;
@@ -192,7 +214,7 @@ ipx_rip_print(const u_short *ipx, u_int length)
        (void)printf("ipx-rip-req");
        if (length > 0) {
            TCHECK(ipx[3]);
-           (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
+           (void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
                         EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
        }
        break;
@@ -200,7 +222,7 @@ ipx_rip_print(const u_short *ipx, u_int length)
        (void)printf("ipx-rip-resp");
        for (i = 0; i < 50 && length > 0; i++) {
            TCHECK(ipx[3]);
-           (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
+           (void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
                         EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
 
            ipx += 4;