/********************************************************************/ /** Microsoft LAN Manager **/ /** Copyright(c) Microsoft Corp., 1990-1992 **/ /********************************************************************/ /* :ts=4 */ //** IP.H - IP public definitions. // // This file contains all of the definitions that are exported // out of the IP module to other VxDs. Some other information (such // as error codes and the IPOptInfo structure) is define in ipexport.h #ifndef IP_H_INCLUDED #define IP_H_INCLUDED 1 #ifndef IP_EXPORT_INCLUDED #include "ipexport.h" #endif #ifdef NT #ifdef _PNP_POWER #define TCP_NAME L"TCPIP" #else #define TCP_NAME L"MSTCP" #endif #else // NT #define TCP_NAME "MSTCP" #endif // NT #define IP_NET_STATUS 0 #define IP_HW_STATUS 1 #define MASK_NET 0 #define MASK_SUBNET 1 #define IP_DRIVER_VERSION 1 #define PROTOCOL_ANY 0 //* IP Header format. struct IPHeader { uchar iph_verlen; // Version and length. uchar iph_tos; // Type of service. ushort iph_length; // Total length of datagram. ushort iph_id; // Identification. ushort iph_offset; // Flags and fragment offset. uchar iph_ttl; // Time to live. uchar iph_protocol; // Protocol. ushort iph_xsum; // Header checksum. IPAddr iph_src; // Source address. IPAddr iph_dest; // Destination address. }; /* IPHeader */ typedef struct IPHeader IPHeader; /*NOINC*/ #define NULL_IP_ADDR 0 #define IP_ADDR_EQUAL(x,y) ((x) == (y)) #define IP_LOOPBACK_ADDR(x) (((x) & 0xff) == 0x7f) #define CLASSD_ADDR(a) (( (*((uchar *)&(a))) & 0xf0) == 0xe0) typedef void *IPContext; // An IP context value. //* Structure of a route cache entry. A route cache entry functions as a pointer // to some routing info. There is one per remote destination, and the memory // is owned by the IP layer. // #define RCE_CONTEXT_SIZE (sizeof(void *)*2) // Right now we use two contexts. struct RouteCacheEntry { struct RouteCacheEntry *rce_next; // Next RCE in list. struct RouteTableEntry *rce_rte; // Back pointer to owning RTE. IPAddr rce_dest; // Destination address being cached. IPAddr rce_src; // Source address for this RCE. uchar rce_flags; // Valid flags. uchar rce_dtype; // Type of destination address. ushort rce_cnt; // Ref count for this RCE. uint rce_usecnt; // Count of people using it. DEFINE_LOCK_STRUCTURE(rce_lock) // Lock for this RCE uchar rce_context[RCE_CONTEXT_SIZE]; // Space for lower layer context }; /* RouteCacheEntry */ typedef struct RouteCacheEntry RouteCacheEntry; #define RCE_VALID 0x1 #define RCE_CONNECTED 0x2 #define RCE_REFERENCED 0x4 #ifdef _PNP_POWER #define RCE_ALL_VALID (RCE_VALID | RCE_CONNECTED | RCE_REFERENCED) #else // _PNP_POWER #define RCE_ALL_VALID (RCE_VALID | RCE_CONNECTED) #endif // _PNP_POWER /*INC*/ //* Structure of option info. struct IPOptInfo { uchar *ioi_options; // Pointer to options (NULL if none). IPAddr ioi_addr; // First hop address, if this is source routed. uchar ioi_optlength; // Length (in bytes) of options. uchar ioi_ttl; // Time to live of this packet. uchar ioi_tos; // Type of service for packet. uchar ioi_flags; // Flags for this packet. }; /* IPOptInfo */ typedef struct IPOptInfo IPOptInfo; #define IP_FLAG_SSRR 0x80 // There options have a SSRR in them. /*NOINC*/ //* Structure of a packet context. struct PacketContext { struct PCCommon { PNDIS_PACKET pc_link; // Link on chain of packets. uchar pc_owner; // Owner of packet. uchar pc_flags; // Flags concerning this packet. ushort pc_pad; // Pad to 32 bit boundary. } pc_common; struct BufferReference *pc_br; // Pointer to buffer reference structure. struct ProtInfo *pc_pi; // Protocol info structure for this packet. void *pc_context; // Protocol context to be passed back on send cmplt. #ifdef _PNP_POWER struct Interface *pc_if; // Interface this packet was sent on. #endif }; /* PacketContext */ typedef struct PacketContext PacketContext; //* The structure of configuration information passed to an upper layer. // struct IPInfo { uint ipi_version; // Version of the IP driver. uint ipi_hsize; // Size of the header. IP_STATUS (*ipi_xmit)(void *, void *, PNDIS_BUFFER, uint, IPAddr, IPAddr, IPOptInfo *, RouteCacheEntry *, uchar); void *(*ipi_protreg)(uchar, void *, void *, void *, void *); IPAddr (*ipi_openrce)(IPAddr, IPAddr, RouteCacheEntry **, uchar *, ushort *, IPOptInfo *); void (*ipi_closerce)(RouteCacheEntry *); uchar (*ipi_getaddrtype)(IPAddr); uchar (*ipi_getlocalmtu)(IPAddr, ushort *); IP_STATUS (*ipi_getpinfo)(IPAddr, IPAddr, uint *, uint *); void (*ipi_checkroute)(IPAddr, IPAddr); void (*ipi_initopts)(struct IPOptInfo *); IP_STATUS (*ipi_updateopts)(struct IPOptInfo *, struct IPOptInfo *, IPAddr, IPAddr); IP_STATUS (*ipi_copyopts)(uchar *, uint, struct IPOptInfo *); IP_STATUS (*ipi_freeopts)(struct IPOptInfo *); long (*ipi_qinfo)(struct TDIObjectID *ID, PNDIS_BUFFER Buffer, uint *Size, void *Context); long (*ipi_setinfo)(struct TDIObjectID *ID, void *Buffer, uint Size); long (*ipi_getelist)(void *, uint *); IP_STATUS (*ipi_setmcastaddr)(IPAddr, IPAddr, uint); uint (*ipi_invalidsrc)(IPAddr); uint (*ipi_isdhcpinterface)(void *IPContext); }; /* IPInfo */ typedef struct IPInfo IPInfo; /*INC*/ #define PACKET_OWNER_LINK 0 #define PACKET_OWNER_IP 1 // Definiton of destination types. We use the low bit to indicate that a type is a broadcast // type. All local types must be less than DEST_REMOTE. #define DEST_LOCAL 0 // Destination is local. #define DEST_BCAST 1 // Destination is net or local bcast. #define DEST_SN_BCAST 3 // A subnet bcast. #define DEST_MCAST 5 // A local mcast. #define DEST_REMOTE 6 // Destination is remote. #define DEST_REM_BCAST 7 // Destination is a remote broadcast #define DEST_REM_MCAST 9 // Destination is a remote mcast. #define DEST_INVALID 0xff // Invalid destination #define DEST_BCAST_BIT 1 #define DEST_OFFNET_BIT 0x10 // Destination is offnet - // used only by upper layer // callers. /*NOINC*/ #define IS_BCAST_DEST(D) ((D) & DEST_BCAST_BIT) // The following macro is to be used ONLY on the destination returned from // OpenRCE, and only by upper layer callers. #define IS_OFFNET_DEST(D) ((D) & DEST_OFFNET_BIT) /*INC*/ // Definition of an IP receive buffer chain. struct IPRcvBuf { struct IPRcvBuf *ipr_next; // Next buffer descriptor in chain. uint ipr_owner; // Owner of buffer. uchar *ipr_buffer; // Pointer to buffer. uint ipr_size; // Buffer size. }; /* IPRcvBuf */ typedef struct IPRcvBuf IPRcvBuf; #define IPR_OWNER_IP 0 #define IPR_OWNER_ICMP 1 #define IPR_OWNER_UDP 2 #define IPR_OWNER_TCP 3 #define MIN_FIRST_SIZE 200 // Minimum size of first buffer. //* Structure of context info. passed down for query entity list. struct QEContext { uint qec_count; // Number of IDs currently in // buffer. struct TDIEntityID *qec_buffer; // Pointer to buffer. }; /* QEContext */ typedef struct QEContext QEContext; #ifdef NT // // Functions exported in NT by the IP driver for use by transport // layer drivers. // IP_STATUS IPGetInfo( IPInfo *Buffer, int Size ); void * IPRegisterProtocol( uchar Protocol, void *RcvHandler, void *XmitHandler, void *StatusHandler, void *RcvCmpltHandler ); #endif // NT #endif // IP_H_INCLUDED