Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

327 lines
9.4 KiB

/*******************************************************************/
/* Copyright(c) 1993 Microsoft Corporation */
/*******************************************************************/
//***
//
// Filename: rtdefs.h
//
// Description: Defines private structures and types for the ipx router
//
// Author: Stefan Solomon (stefans) October 4, 1993.
//
// Revision History:
//
//***
#define ISN_NT 1
//
// These are needed for CTE
//
#if DBG
#define DEBUG 1
#endif
#define NT 1
#include <ntos.h>
#include <tdikrnl.h>
#include <ndis.h>
#include <cxport.h>
#include <bind.h>
#include "debug.h"
#include "packet.h"
#include "utils.h"
#ifndef _RTDEFS_
#define _RTDEFS_
//
//*** NIC Control Block ***
//
typedef enum _NIC_STATE {
NIC_CLOSED, // line disconnected for this Nic and clean up done
NIC_CLOSING, // line down received and in the process of cleaning up
NIC_ACTIVE, // Nic active
NIC_PENDING_OPEN
} NIC_STATE;
typedef enum _NIC_CLOSE_STATUS { // returned by NicClose
NIC_CLOSE_SUCCESS,
NIC_CLOSE_FAILURE,
NIC_CLOSE_PENDING
} NIC_CLOSE_STATUS;
typedef enum _NIC_RESOURCES_STATUS { // returned by NicFreeResources
NIC_RESOURCES_FREED,
NIC_RESOURCES_PENDING
} NIC_RESOURCES_STATUS;
typedef enum _NIC_OPEN_STATUS { // returned by NicOpen
NIC_OPEN_SUCCESS,
NIC_OPEN_FAILURE,
} NIC_OPEN_STATUS;
struct _RIP_SNDREQ;
// close completion options
#define SIGNAL_CLOSE_COMPLETION_EVENT 0x00001
#define CALL_CLOSE_COMPLETION_ROUTINE 0x00002
typedef struct _NICCB {
LIST_ENTRY SendQueue; // queue of packets being sent
LIST_ENTRY ReceiveQueue; // queue of packets being received
LIST_ENTRY RipSendQueue; // RIP responses to send on this nic
struct _RIP_SNDREQ *RipSndReqp; // RIP request presently being sent
LIST_ENTRY RipSndPktsList;
NDIS_SPIN_LOCK NicLock;
NIC_STATE NicState; // NIC_ACTIVE, NIC_CLOSING, NIC_CLOSED
USHORT NicId;
USHORT CloseCompletionOptions;
UCHAR Network[4];
UCHAR Node[6]; // local node address
UCHAR RemoteNode[6]; // address of remote node, for WAN links
BOOLEAN WanRoutingDisabled;
BOOLEAN WanConnectionClient;
USHORT TickCount; // this is derived from link speed
UINT LinkSpeed;
UINT MaximumPacketSize;
UINT MacOptions;
NDIS_MEDIUM DeviceType;
WORK_QUEUE_ITEM RipSndReqWorkItem;
KTIMER InterPktGapTimer;
KDPC InterPktGapDpc;
KTIMER NicCloseTimer;
KDPC NicCloseDpc;
KEVENT NicClosedEvent;
KTIMER WanGenRequestTimer;
KDPC WanGenRequestDpc;
UINT WanGenRequestCount;
LIST_ENTRY WanHtLinkage; // linkage in the WAN nodes hash table
//*** count of send packets queued for send on this nic ***
ULONG SendPktsQueuedCount;
//*** statistics kept here ***
ULONG StatBadReceived;
ULONG StatRipReceived;
ULONG StatRipSent;
ULONG StatRoutedReceived;
ULONG StatRoutedSent;
ULONG StatType20Received;
ULONG StatType20Sent;
} NICCB, *PNICCB;
//
//*** Rcv Packet Pool Segment Entry ***
//
typedef struct _RCVPKT_SEGMENT {
LIST_ENTRY SegmentLinkage; // linkage in the segment list
LIST_ENTRY PacketList; // list of packets
UINT MaxPktCount; // total nr of pkts in this segment
UINT AvailablePktCount; // available pkts in this segment
UINT AgingTimer; // incremented by the scavenger
// segment removed when 3 ticks
NDIS_HANDLE RcvPktDescrPoolHandle; // Rcv packets descr pool
ULONG RcvPktDescrPoolSize;
NDIS_HANDLE RcvPktBuffDescrPoolHandle;// Rcv buffer descriptors pool
ULONG RcvPktBuffDescrPoolSize;
ULONG DataBuffer[1];
} RCVPKT_SEGMENT, *PRCVPKT_SEGMENT;
//
//*** Packet Tag Structure ***
//
typedef enum _PACKET_TYPE {
RCV_PACKET, // Used for RIP requests/ specific replies and routing.
// These packets are allocated from the rcv pools and
// charged to the Nic which received them
RIP_SEND_PACKET, // packets used for the send rip response/request
PROPAGATED_BCAST_PACKET // used for Netbios bcasts. These packets are taken
// from the rcv pkt pool
} PACKET_TYPE;
typedef struct _PACKET_TAG {
UCHAR Identifier; // this should be IDENTIFIER_RIP
UCHAR ReservedUchar[3]; // ensure alignment of ReservedPvoid
PVOID ReservedPvoid[2]; // needed by ipx for padding on ethernet
LIST_ENTRY PacketLinkage; // links this packet in send/receive queues
// and the rcv pkt pool queue
PACKET_TYPE PacketType; // see above
PRCVPKT_SEGMENT RcvPktSegmentp; // for RCV_PACKET types, the rcv pkt
// pool segment where it belongs
PUCHAR DataBufferp; // data buffer
UINT DataBufferLength; // original length of the data buffer
PNICCB QueueOwnerNicCbp; // points to the NicCb where it is queued
PNICCB PacketOwnerNicCbp; // ptr to NicCb charged for this packet
IPX_LOCAL_TARGET RemoteAddress; // remote address to send this packet
// on (used by send routines)
PNDIS_BUFFER HeaderBuffDescrp; // ptr to buff descr for the MAC header
// NULL if the buff descr is chained in
// the pkt descr (after send completes)
UCHAR MacHeader[40]; // 40 bytes of Mac Header for sends
} PACKET_TAG, *PPACKET_TAG;
//
//*** RIP Send Requests ***
//
// for each rip send packet, there is a structure used to keep the pkt descr
// pool, buff descr pool and data buffer.
typedef struct _RIP_SNDPKT_BUFF {
NDIS_HANDLE PktDescrPoolHandle; // Rcv packets descr pool
ULONG PktDescrPoolSize;
NDIS_HANDLE BuffDescrPoolHandle;// Rcv buffer descriptors pool
ULONG BuffDescrPoolSize;
ULONG IpxPacket[8]; // 32 -> ipx rip header
} RIP_SNDPKT_BUFF, *PRIP_SNDPKT_BUFF;
#define RIP_SNDPKT_MAXLEN 400 // max length to be added to ipx rip header
#define RIP_SNDPKT_MINLEN 8 // one network entry size
// each rip send request is made of a control block set up by the module
// requesting the send (rip response, timer, etc.)
typedef enum _RIP_SNDREQ_ID {
RIP_GEN_RESPONSE, // Send the whole routing table as viewed from this nic
RIP_UPDATE, // Bcast the associated list of changes
RIP_GEN_REQUEST // bcast this request on all LANs. This is sent when the
// router starts and requests info about all the other
// routers.
} RIP_SNDREQ_ID;
typedef struct _RIP_SNDREQ {
LIST_ENTRY GlobalLinkage; // linkage in the Rip global dispatch queue.
// the request stays in this queue until sent on
// all nics
LIST_ENTRY NicLinkage; // linkage in the Rip send request queue at
// the Nic Cb
RIP_SNDREQ_ID SndReqId; // rip send request type
BOOLEAN SendOnAllNics; // how to dispatch this request:
// TRUE - send on all nics, FALSE - send only
// on the sender nic cb
UCHAR DestNode[6]; // destination node:
// if different of bcast address represents
// the address to send this request to
USHORT DestSock; // destination socket to receive the resp
PNICCB DoNotSendNicCbp; // do not send on this nic
PNICCB SenderNicCbp; // ptr to the nic on which this is sent
PKEVENT SndCompleteEventp; // ptr to send complete event
} RIP_SNDREQ, *PRIP_SNDREQ;
typedef struct _RIP_UPDATE_SNDREQ {
RIP_SNDREQ RipSndReq;
RIP_SNDPKT_BUFF RipSndPktBuff;
} RIP_UPDATE_SNDREQ, *PRIP_UPDATE_SNDREQ;
//
//*** Miscellaneous Global Defs & Constants ***
//
#include "globals.h"
// default configuration values
// default maximum frame size
#define DEF_MAX_FRAME_SIZE 1518
// default RIP bcast frame size (IPX header + 50 network entries)
#define DEF_BCAST_FRAME_SIZE 432
// define rcv pkt pool sizes
// small pool -> 100 pkts / per nic
#define RCVPKT_SMALL_POOL_SIZE 1
// medium pool -> 250 pkts per nic
#define RCVPKT_MEDIUM_POOL_SIZE 2
// large pool -> unlimited nr of pkts per nic
#define RCVPKT_LARGE_POOL_SIZE 3
// the number of rcv packets per segment (config parameter)
#define MIN_RCV_PKTS_PER_SEGMENT 2
#define DEF_RCV_PKTS_PER_SEGMENT 16
#define MAX_RCV_PKTS_PER_SEGMENT 32
// the default timeout interval for rip bcasts and aging
#define RIP_TIMEOUT 60
// the default limit on the number of send pkts queued on one nic
#define MAX_SEND_PKTS_QUEUED 100
//
//*** Definitions for the WAN nodes hash table used in routing packets LAN -> WAN for the
//*** case when the router is configured with a unique WAN network number
//
#define NODE_HTSIZE 37
//*** tick count associated with the wan global net. Because that's a global value,
//*** it was picked to reflect an average on an async net
#define DEFAULT_WAN_GLOBAL_NET_TICKCOUNT 20
//*** invalid device type -> to distinguish between LAN, WAN and non configured devices
#define IPX_ROUTER_INVALID_DEVICE_TYPE 0xFFFF
//
//*** Definitions for the netbios routing flags in the NetbiosRouting parameter ***
//
#define NETBIOS_ROUTING_LAN_TO_LAN 0x00000001
#define NETBIOS_ROUTING_WAN_TO_LAN 0x00000002
#define NETBIOS_ROUTING_LAN_TO_WAN 0x00000004
//
// Allocate Pool With Tag
//
#define ExAllocatePool(type, size) ExAllocatePoolWithTag((type), (size), 'XPIR')
#endif // _RTDEFS_