home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / nwnet / root / usr / include / sys / ipx_app.h / ipx_app
Text File  |  1998-08-19  |  13KB  |  350 lines

  1. /*
  2.  * Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  3.  *                                                                         
  4.  *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  5.  *                   SANTA CRUZ OPERATION INC.                             
  6.  *                                                                         
  7.  *   The copyright notice above does not evidence any actual or intended   
  8.  *   publication of such source code.                                      
  9.  */
  10.  
  11. /* $Novell-NWU: $Header: /proj6/ncps/nwu_top/nwnet/include/sys/ipx_app.h,v 1.3 1996/04/05 21:56:10 vtag Exp $ */
  12. /*    Copyright (c) 1990, 1991, 1992, 1993 Novell, Inc. All Rights Reserved.    */
  13. /*    Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989, 1990 Novell, Inc. All Rights Reserved.    */
  14. /*      All Rights Reserved      */
  15.  
  16. /*    THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF Novell Inc.    */
  17. /*    The copyright notice above does not evidence any       */
  18. /*    actual or intended publication of such source code.    */
  19.  
  20. #ifndef _NET_NW_IPX_APP_H  /* wrapper symbol for kernel use */
  21. #define _NET_NW_IPX_APP_H  /* subject to change without notice */
  22.  
  23. #ident "@(#)ipx_app.h    1.2"
  24.  
  25.  
  26. /*
  27.  * Copyright 1991, 1992 Novell, Inc. 
  28.  * All Rights Reserved.
  29.  *
  30.  * This work is subject to U.S. and International copyright laws and
  31.  * treaties.  No part of this work may be used, practiced, performed,
  32.  * copied, distributed, revised, modified, translated, abridged,
  33.  * condensed, expanded, collected, compiled, linked, recast,
  34.  * transformed or adapted without the prior written consent
  35.  * of Novell.  Any use or exploitation of this work without
  36.  * authorization could subject the perpetrator to criminal and
  37.  * civil liability.
  38.  *
  39.  */
  40.  
  41. #ifdef _KERNEL_HEADERS
  42. #include <util/types.h>
  43. #include <nwu/nwnet/include/nwtdr.h>
  44. #else 
  45. #include <sys/types.h>
  46. #include <sys/nwtdr.h>
  47. #endif /* _KERNEL_HEADERS */
  48.  
  49. #define IPX_DIAGNOSTIC_SOCKET    0x0456
  50.  
  51. /*
  52. **    The following ioctls apply to the Ipx Socket Multiplexor.  If
  53. **    a version of IPX is running that has no socket Multiplexor, these
  54. **    ioctls will fail.
  55. */
  56.  
  57. #define IPX_SET_SOCKET             ( ( 'i' << 8 ) | 2 )
  58. #define IPX_BIND_SOCKET            ( ( 'i' << 8 ) | 20 )
  59. #define IPX_UNBIND_SOCKET        ( ( 'i' << 8 ) | 21 )
  60. #define IPX_INITIALIZE             ( ( 'i' << 8 ) | 22 )
  61. #define IPX_SET_WATER            ( ( 'i' << 8 ) | 23 )
  62.  
  63. /*
  64. **    IPX_SET_SOCKET - Bind an open file handle to an IPX Socket
  65. **
  66. **        request_socket        0             machine_order
  67. **        return_socket      net_order        machine_order
  68. **
  69. **    This function allows exactly one socket to be bound for the process.
  70. **    To bind another socket, you must first release the socket by using
  71. **    the IPX_UNBIND_SOCKET function.
  72. **
  73. **    When you use this function, ipx fills in the socket number
  74. **    on all packets you send.
  75. */
  76.  
  77. /*
  78. **    IPX_BIND_SOCKET - Bind an open file handle to an IPX Socket
  79. **    IPX_UNBIND_SOCKET - Release a bound socket from an open file handle.
  80. **        Can be used multiple times to bind/release different sockets
  81. **        to the same stream.
  82. **    Uses IpxSetSocket_t structure
  83. **
  84. **        request_socket     machine_order   (BIND/UNBIND)
  85. **        return_socket      machine_order   (BIND)
  86. **
  87. **    This function allows multiple sockets to be bound for a process.
  88. **    Use this function once for each socket to be bound.
  89. **    When you use this function, you must fill in the socket number
  90. **    on all packets you send.  If the non-zero socket number you fill in is
  91. **    invalid, the packet is discarded.  If you send zero as a socket number,
  92. **    an M_ERROR is sent to the stream head with a status of EINVAL.
  93. */
  94.  
  95. typedef struct {
  96.     uint16 socketNum;        /* Socket number */
  97. } IpxSetSocket_t;
  98.  
  99. /*
  100. **    IPX_SET_WATER - Set stream head read High and Low Water mark.
  101. **        Values of 0xFFFFFFFF (UINT_MAX) will set the water mark
  102. **        to the computed maximum set during IPX_INITIALIZE.
  103. **    IPX_INITIALIZE - Indicate to IPX that initialization is complete
  104. **        and set max allowable hi/lo water values for non root users.
  105. **        Uses IpxSetWater_t ioctl structure for IPX_INITIALIZE ioctl.
  106. */
  107. typedef struct {
  108.     uint32 hiWater;
  109.     uint32 loWater;
  110. } IpxSetWater_t;
  111.  
  112. /*
  113. **    IPX_SET_SPX - Following link of IPX under SPX, this ioctl is
  114. **        sent to identify stream as SPX stream.  Requires no data.
  115. */
  116.  
  117. /*
  118. **    IPX_STATS - Get IPX statistics
  119. **        This structure follows the IpxLanStats_t structure.
  120. **        The buffer must be big enough to hold both.  If The IPX
  121. **        Socket Multiplexor is not present, all values will be zero.
  122. */
  123. typedef struct {
  124.     uint8    IpxMajorVersion;        /* Major Version */ 
  125.     uint8    IpxMinorVersion;        /* Minor Version */ 
  126.     char    IpxRevision[2];            /* Revision */ 
  127.     uint32    IpxOutData;                /* Number of non TLI output data packets */
  128.     uint32    IpxOutBadSize;            /* Non TLI data pkts w/size < IPX hdr len */
  129.     uint32    IpxOutToSwitch;            /* Number packet sent to LAN router */
  130.     uint32    IpxBoundSockets;        /* Number sockets currently bound */
  131.     uint32    IpxBind;                /* Number of Non TLI bind requests */
  132.     uint32    IpxTLIOutData;            /* TLI Total number of output data pkts */
  133.     uint32    IpxTLIOutBadState;        /* TLI data, socket not bound, drop */
  134.     uint32    IpxTLIOutBadSize;        /* TLI Data Request is wrong size, drop */
  135.     uint32    IpxTLIOutBadAddr;        /* TLI Req'st IPX addr is bad size, drop */
  136.     uint32    IpxTLIOutBadOpt;        /* TLI Request has bad TLI opt size, drop */
  137.     uint32    IpxTLIOutHdrAlloc;        /* TLI Req'st IPX hdr alloc failure, drop */
  138.     uint32    IpxTLIOutToSwitch;        /* TLI Packets sent to the LAN router */
  139.     uint32    IpxTLIBind;                /* TLI Bind Requests */
  140.     uint32    IpxTLIOptMgt;            /* TLI Number of opt_mgmt requests */
  141.     uint32    IpxTLIUnknown;            /* TLI Number of unknown requests, drop'd */
  142.     uint32    IpxInSwitch;            /* Total Packets Propagated */
  143.     uint32    IpxSwitchInvalSocket;    /* BIND_SOCK usr, invalid src sock, drop */
  144.     uint32    IpxSwitchSumFail;        /* number of pkts, can't gen cksum, drop */
  145.     uint32    IpxSwitchSum;            /* number of packets checksum generated */
  146.     uint32    IpxSwitchAllocFail;        /* num pkts, can't get space to pad, drop */
  147.     uint32    IpxSwitchEven;            /* number of packets padded to even bytes */
  148.     uint32    IpxSwitchEvenAlloc;        /* number of pkts new buffer req'd to pad */
  149.     uint32    IpxSwitchToLan;            /* Switch lan - sent to lan driver */
  150.     uint32    IpxInData;                /* Total data received by socket mux */
  151.     uint32    IpxInBadSize;            /* Not Used */
  152.     uint32    IpxDataToSocket;        /* Packets routed to a socket */
  153.     uint32    IpxTrimPacket;            /* Not USED, moved to lipmx_app.h stats */
  154.     uint32    IpxSumFail;                /* Packet checksum invalid, dropped */
  155.     uint32    IpxRouted;                /* Packet routed to a non TLI socket */
  156.     uint32    IpxRoutedTLI;            /* Packet routed to TLI socket */
  157.     uint32    IpxRoutedTLIAlloc;        /* Packet, alloc of TLI hdr fail, drop */
  158.     uint32    IpxBusySocket;            /* Destination socket stream full, drop */
  159.     uint32    IpxSocketNotBound;        /* Destination socket not bound, drop */
  160.     uint32    IpxIoctlBindSocket;        /* Ioctl SET/BIND_SOCKET */
  161.     uint32    IpxIoctlUnbindSocket;    /* Ioctl UNBIND_SOCKET */
  162.     uint32    IpxIoctlStats;            /* Ioctl STATS */
  163.     uint32    IpxIoctlUnknown;        /* Ioctl Sent to LAN router */
  164.     uint32    IpxIoctlSetWater;        /* Ioctl SET_WATER */
  165. } IpxSocketStats_t;
  166.  
  167. #define IPX_MAX_PACKET_DATA 546
  168.  
  169. #define IPX_HDR_SIZE        30
  170. #define IPX_ADDR_SIZE        12
  171. #define IPX_CHKSUM            0xFFFF
  172. #define IPX_CHKSUM_TRIGGER    GETINT16(0xFEEB)
  173. #define IPX_NET_SIZE        4
  174. #define IPX_NODE_SIZE        6
  175. #define IPX_SOCK_SIZE        2
  176.  
  177. /*
  178.  * Structure defining an ipx address
  179.  */
  180. typedef struct ipxAddress {
  181.     uint8      net[IPX_NET_SIZE];        /* ipx network address */
  182.     uint8     node[IPX_NODE_SIZE];    /* ipx node address */
  183.     uint8     sock[IPX_SOCK_SIZE];    /* ipx socket */
  184. } ipxAddr_t, tranAddr_t;
  185.  
  186. typedef struct ipxNet {
  187.     uint8 net[IPX_NET_SIZE];    /* ipx network address */
  188. } ipxNet_t;
  189.  
  190. typedef struct ipxNode {
  191.     uint8 node[IPX_NODE_SIZE];    /* ipx node address */
  192. } ipxNode_t;
  193.  
  194. typedef struct ipxSock {
  195.     uint8 sock[IPX_SOCK_SIZE];    /* ipx socket */
  196. } ipxSock_t;
  197.  
  198. typedef struct ipxCAddr {
  199.     uint8 addr[IPX_ADDR_SIZE];    /* ipx address */
  200. } ipxCAddr_t;
  201.  
  202. typedef struct ipxCHdr {
  203.     uint8 hdr[IPX_HDR_SIZE];    /* ipx header */
  204. } ipxCHdr_t;
  205.  
  206. #define IPX_TRANSPORT_CONTROL      0x00
  207.  
  208. #define IPX_NULL_PACKET_TYPE    0x00
  209. #define IPX_RIP_PACKET_TYPE        0x01
  210. #define IPX_ECHO_PACKET_TYPE    0x02
  211. #define IPX_PEP_PACKET_TYPE        0x04
  212. #define IPX_SPX_PACKET_TYPE        0x05
  213. #define IPX_NOVELL_PACKET_TYPE    0x11
  214. #define IPX_NCP_PACKET_TYPE        0x11    /* another name for 
  215.                                            IPX_NOVELL_PACKET_TYPE (for X/Open */ 
  216.  
  217. #define IPX_PROPAGATION_TYPE    0x14    /* Broadcast propogation (NetBIOS) */
  218. #define IPX_PROPAGATION_MAX_NETS 8
  219. #define IPX_PROPAGATION_LENGTH    (IPX_NET_SIZE * IPX_PROPAGATION_MAX_NETS)
  220.  
  221. /*
  222.  * Structure defining ipx option structure
  223.  *
  224.  *  ipx_addr is read only and valid on the t_optmgmt call.
  225.  *  ipx_checksum and ipx_packet_type are read/write and are valid on 
  226.  *  the t_rcvudata/t_sndudata calls.
  227.  */
  228. typedef struct ipxOptions{
  229.     ipxAddr_t    ipx_addr;                /* (r) ipx address  of this endpoint */
  230.     uint16        ipx_checksum;            /* (r/w)checksum value */
  231.     uint8        ipx_packet_type;        /* (r/w)ipx packet type */
  232.     uint8        reserved;                /* reserved */
  233.     uint8         res[16];                /* reserved */
  234. } ipxOpts_t;
  235.  
  236. /*
  237.  * Structure defining an ipx header
  238.  */
  239. typedef struct ipxHeader{
  240.     uint16        chksum;        /* checksum FFFF if not done */
  241.     uint16        len;        /* length of data and ipx header */
  242.     uint8        tc;            /* transport control */
  243.     uint8        pt;            /* packet type */
  244.     ipxAddr_t    dest;        /* destination address */
  245.     ipxAddr_t    src;        /* source address */
  246. } ipxHdr_t;
  247.  
  248. /*
  249. ** Faster address comparison than a bcmp/memcmp or equiv.
  250. **
  251. **    Compare in order most likely to find differences
  252. */
  253.  
  254. #define IPXCMPNET(a,b) ( \
  255.     ((char *)(a))[3] == ((char *)(b))[3] &&\
  256.     ((char *)(a))[2] == ((char *)(b))[2] &&\
  257.     ((char *)(a))[1] == ((char *)(b))[1] &&\
  258.     ((char *)(a))[0] == ((char *)(b))[0] \
  259. )
  260.  
  261. #define IPXCMPNODE(a,b) ( \
  262.     ((char *)(a))[5] == ((char *)(b))[5] &&\
  263.     ((char *)(a))[4] == ((char *)(b))[4] &&\
  264.     ((char *)(a))[3] == ((char *)(b))[3] &&\
  265.     ((char *)(a))[2] == ((char *)(b))[2] &&\
  266.     ((char *)(a))[1] == ((char *)(b))[1] &&\
  267.     ((char *)(a))[0] == ((char *)(b))[0] \
  268. )
  269.  
  270. #define IPXCMPSOCK(a,b) ( \
  271.     ((char *)(a))[1] == ((char *)(b))[1] &&\
  272.     ((char *)(a))[0] == ((char *)(b))[0] \
  273. )
  274.  
  275. /*
  276. **    Comparing server addresses: net addresses are unique
  277. **                                node addresses are the same (000001)
  278. **                                socket addresses likely are 04xx
  279. **    Comparing client addresses: net addresses are the same on a net
  280. **                                node addresses are unique (NIC address)
  281. **                                socket addresses are similar (but not the same)
  282. **    Compare in an order to determine uniqueness quickly for either case.
  283. **    We favor comparing server addresses in the test, but are fair for client
  284. **    addresses as well
  285. */
  286. #define IPXCMPADDR(a,b) ( \
  287.     ((char *)(a))[3]  == ((char *)(b))[3]  &&    /* net[3] */    \
  288.     ((char *)(a))[11] == ((char *)(b))[11] &&    /* socket[1] */    \
  289.     ((char *)(a))[9]  == ((char *)(b))[9]  &&    /* node[5] */    \
  290.     ((char *)(a))[8]  == ((char *)(b))[8]  &&    /* node[4] */    \
  291.     ((char *)(a))[2]  == ((char *)(b))[2]  &&    /* net[2] */    \
  292.     ((char *)(a))[10] == ((char *)(b))[10] &&    /* socket[0] */    \
  293.     ((char *)(a))[1]  == ((char *)(b))[1]  &&    /* net[1] */    \
  294.     ((char *)(a))[7]  == ((char *)(b))[7]  &&    /* node[3] */    \
  295.     ((char *)(a))[6]  == ((char *)(b))[6]  &&    /* node[2] */    \
  296.     ((char *)(a))[0]  == ((char *)(b))[0]  &&    /* net[0] */    \
  297.     ((char *)(a))[5]  == ((char *)(b))[5]  &&    /* node[1] */    \
  298.     ((char *)(a))[4]  == ((char *)(b))[4]         /* node[0] */    \
  299. )
  300. /* 
  301. ** Compare using the technique for IPXCMPADDR just the net and node part
  302. ** of the address (used for comparing client's address where the socket
  303. ** is different for regular NCPs than for Packet Burst NCPs)
  304. */
  305.  
  306. #define IPXCMPNETNODE(a,b) ( \
  307.     ((char *)(a))[3]  == ((char *)(b))[3]  &&    /* net[3] */    \
  308.     ((char *)(a))[9]  == ((char *)(b))[9]  &&    /* node[5] */    \
  309.     ((char *)(a))[8]  == ((char *)(b))[8]  &&    /* node[4] */    \
  310.     ((char *)(a))[2]  == ((char *)(b))[2]  &&    /* net[2] */    \
  311.     ((char *)(a))[1]  == ((char *)(b))[1]  &&    /* net[1] */    \
  312.     ((char *)(a))[7]  == ((char *)(b))[7]  &&    /* node[3] */    \
  313.     ((char *)(a))[6]  == ((char *)(b))[6]  &&    /* node[2] */    \
  314.     ((char *)(a))[0]  == ((char *)(b))[0]  &&    /* net[0] */    \
  315.     ((char *)(a))[5]  == ((char *)(b))[5]  &&    /* node[1] */    \
  316.     ((char *)(a))[4]  == ((char *)(b))[4]         /* node[0] */    \
  317. )
  318.  
  319. /*
  320.  * Faster address copy than a bcopy/memcpy or equiv.
  321.  */
  322.  
  323. #define IPXCOPYNET(a,b) ( \
  324.     (*((ipxNet_t *)(b))) = (*((ipxNet_t *)(a))) \
  325. )
  326.  
  327. #define IPXCOPYNODE(a,b) ( \
  328.     (*((ipxNode_t *)(b))) = (*((ipxNode_t *)(a))) \
  329. )
  330.  
  331. #define IPXCOPYSOCK(a,b) ( \
  332.     (*((ipxSock_t *)(b))) = (*((ipxSock_t *)(a))) \
  333. )
  334.  
  335. #define IPXCOPYADDR(a,b) ( \
  336.     (*((ipxCAddr_t *)(b))) = (*((ipxCAddr_t *)(a))) \
  337. )
  338.  
  339. #define IPXCOPYHDR(a,b) ( \
  340.     (*((ipxCHdr_t *)(b))) = (*((ipxCHdr_t *)(a))) \
  341. )
  342.  
  343. #ifdef _KERNEL_HEADERS
  344. #include <nwu/nwnet/include/lipmx_app.h>
  345. #else 
  346. #include <sys/lipmx_app.h>
  347. #endif /* _KERNEL_HEADERS */
  348.  
  349. #endif /* _NET_NW_IPX_APP_H */
  350.