home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / tcpdumpb.zip / print-ipx.c < prev    next >
C/C++ Source or Header  |  1997-02-14  |  6KB  |  221 lines

  1. /*
  2.  * Copyright (c) 1994, 1995, 1996
  3.  *      The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  */
  21.  
  22. /*
  23.  * Format and print Novell IPX packets.
  24.  * Contributed by Brad Parker (brad@fcr.com).
  25.  */
  26. #ifndef lint
  27. static  char rcsid[] =
  28.     "@(#)$Header: print-ipx.c,v 1.16 96/07/23 14:17:24 leres Exp $";
  29. #endif
  30.  
  31. #include <sys/param.h>
  32. #include <sys/time.h>
  33. #include <sys/socket.h>
  34.  
  35. #include <netinet/in.h>
  36. #include <netinet/in_systm.h>
  37. #include <netinet/ip.h>
  38. #ifndef __EMX__
  39. #include <netinet/ip_var.h>
  40. #endif
  41. #include <netinet/udp.h>
  42. #include <netinet/udp_var.h>
  43. #include <netinet/tcp.h>
  44. #ifndef __EMX__
  45. #include <netinet/tcpip.h>
  46. #endif
  47.  
  48. #ifdef __STDC__
  49. #include <stdlib.h>
  50. #endif
  51. #include <stdio.h>
  52. #include <string.h>
  53.  
  54. #include "interface.h"
  55. #include "addrtoname.h"
  56. #include "ipx.h"
  57. #include "extract.h"
  58.  
  59.  
  60. static const char *ipxaddr_string(u_int32_t, const u_char *);
  61. void ipx_decode(const struct ipxHdr *, const u_char *, u_int);
  62. void ipx_sap_print(const u_short *, u_int);
  63. void ipx_rip_print(const u_short *, u_int);
  64.  
  65. /*
  66.  * Print IPX datagram packets.
  67.  */
  68. void
  69. ipx_print(const u_char *p, u_int length)
  70. {
  71.         const struct ipxHdr *ipx = (const struct ipxHdr *)p;
  72.  
  73.         TCHECK(ipx->srcSkt);
  74.         (void)printf("%s.%x > ",
  75.                      ipxaddr_string(EXTRACT_32BITS(ipx->srcNet), ipx->srcNode),
  76.                      EXTRACT_16BITS(&ipx->srcSkt));
  77.  
  78.         (void)printf("%s.%x:",
  79.                      ipxaddr_string(EXTRACT_32BITS(ipx->dstNet), ipx->dstNode),
  80.                      EXTRACT_16BITS(&ipx->dstSkt));
  81.  
  82.         /* take length from ipx header */
  83.         TCHECK(ipx->length);
  84.         length = EXTRACT_16BITS(&ipx->length);
  85.  
  86.         ipx_decode(ipx, (u_char *)ipx + ipxSize, length - ipxSize);
  87.         return;
  88. trunc:
  89.         printf("[|ipx %d]", length);
  90. }
  91.  
  92. static const char *
  93. ipxaddr_string(u_int32_t net, const u_char *node)
  94. {
  95.     static char line[256];
  96.  
  97.     sprintf(line, "%x.%02x:%02x:%02x:%02x:%02x:%02x",
  98.             net, node[0], node[1], node[2], node[3], node[4], node[5]);
  99.  
  100.     return line;
  101. }
  102.  
  103. void
  104. ipx_decode(const struct ipxHdr *ipx, const u_char *datap, u_int length)
  105. {
  106.     register u_short dstSkt;
  107.  
  108.     dstSkt = EXTRACT_16BITS(&ipx->dstSkt);
  109.     switch (dstSkt) {
  110.       case IPX_SKT_NCP:
  111.         (void)printf(" ipx-ncp %d", length);
  112.         break;
  113.       case IPX_SKT_SAP:
  114.         ipx_sap_print((u_short *)datap, length);
  115.         break;
  116.       case IPX_SKT_RIP:
  117.         ipx_rip_print((u_short *)datap, length);
  118.         break;
  119.       case IPX_SKT_NETBIOS:
  120.         (void)printf(" ipx-netbios %d", length);
  121.         break;
  122.       case IPX_SKT_DIAGNOSTICS:
  123.         (void)printf(" ipx-diags %d", length);
  124.         break;
  125.       default:
  126.         (void)printf(" ipx-#%x %d", dstSkt, length);
  127.         break;
  128.     }
  129. }
  130.  
  131. void
  132. ipx_sap_print(const u_short *ipx, u_int length)
  133. {
  134.     int command, i;
  135.  
  136.     TCHECK(ipx[0]);
  137.     command = EXTRACT_16BITS(ipx);
  138.     ipx++;
  139.     length -= 2;
  140.  
  141.     switch (command) {
  142.       case 1:
  143.       case 3:
  144.         if (command == 1)
  145.             (void)printf("ipx-sap-req");
  146.         else
  147.             (void)printf("ipx-sap-nearest-req");
  148.  
  149.         if (length > 0) {
  150.             TCHECK(ipx[1]);
  151.             (void)printf(" %x '", EXTRACT_16BITS(&ipx[0]));
  152.             fn_print((char *)&ipx[1], (char *)&ipx[1] + 48);
  153.             putchar('\'');
  154.         }
  155.         break;
  156.  
  157.       case 2:
  158.       case 4:
  159.         if (command == 2)
  160.             (void)printf("ipx-sap-resp");
  161.         else
  162.             (void)printf("ipx-sap-nearest-resp");
  163.  
  164.         for (i = 0; i < 8 && length > 0; i++) {
  165.             TCHECK2(ipx[27], 1);
  166.             (void)printf(" %x '", EXTRACT_16BITS(&ipx[0]));
  167.             fn_print((char *)&ipx[1], (char *)&ipx[1] + 48);
  168.             printf("' addr %s",
  169.                 ipxaddr_string(EXTRACT_32BITS(&ipx[25]), (u_char *)&ipx[27]));
  170.             ipx += 32;
  171.             length -= 64;
  172.         }
  173.         break;
  174.       default:
  175.             (void)printf("ipx-sap-?%x", command);
  176.         break;
  177.     }
  178.         return;
  179. trunc:
  180.         printf("[|ipx %d]", length);
  181. }
  182.  
  183. void
  184. ipx_rip_print(const u_short *ipx, u_int length)
  185. {
  186.     int command, i;
  187.  
  188.     TCHECK(ipx[0]);
  189.     command = EXTRACT_16BITS(ipx);
  190.     ipx++;
  191.     length -= 2;
  192.  
  193.     switch (command) {
  194.       case 1:
  195.         (void)printf("ipx-rip-req");
  196.         if (length > 0) {
  197.             TCHECK(ipx[3]);
  198.             (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
  199.                          EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
  200.         }
  201.         break;
  202.       case 2:
  203.         (void)printf("ipx-rip-resp");
  204.         for (i = 0; i < 50 && length > 0; i++) {
  205.             TCHECK(ipx[3]);
  206.             (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
  207.                          EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
  208.  
  209.             ipx += 4;
  210.             length -= 8;
  211.         }
  212.         break;
  213.       default:
  214.             (void)printf("ipx-rip-?%x", command);
  215.     }
  216.         return;
  217. trunc:
  218.         printf("[|ipx %d]", length);
  219. }
  220.  
  221.