mirror of https://github.com/lianthony/NT4.0
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.
371 lines
13 KiB
371 lines
13 KiB
/********************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1990-1992 **/
|
|
/********************************************************************/
|
|
/* :ts=4 */
|
|
#include "ipfilter.h"
|
|
|
|
//** IPDEF.H - IP private definitions.
|
|
//
|
|
// This file contains all of the definitions for IP that
|
|
// are private to IP, i.e. not visible to outside layers.
|
|
|
|
// Internal error codes, not seen by IP uses.
|
|
#define IP_OPTION_STRICT (MAX_IP_STATUS+1)
|
|
|
|
#define CLASSA_ADDR(a) (( (*((uchar *)&(a))) & 0x80) == 0)
|
|
#define CLASSB_ADDR(a) (( (*((uchar *)&(a))) & 0xc0) == 0x80)
|
|
#define CLASSC_ADDR(a) (( (*((uchar *)&(a))) & 0xe0) == 0xc0)
|
|
#define CLASSE_ADDR(a) ((( (*((uchar *)&(a))) & 0xf0) == 0xf0) && \
|
|
((a) != 0xffffffff))
|
|
|
|
#define CLASSA_MASK 0x000000ff
|
|
#define CLASSB_MASK 0x0000ffff
|
|
#define CLASSC_MASK 0x00ffffff
|
|
#define CLASSD_MASK 0x000000e0
|
|
#define CLASSE_MASK 0xffffffff
|
|
|
|
#define IP_OPT_COPIED 0x80 // Bit indicating options is to be copied.
|
|
#define IP_OPT_TYPE 0
|
|
#define IP_OPT_LENGTH 1
|
|
#define IP_OPT_DATA 2
|
|
#define IP_OPT_PTR 2 // Pointer offset, for those options that have it.
|
|
#define IP_TS_OVFLAGS 3 // Offset for overflow and flags.
|
|
#define IP_TS_FLMASK 0xf // Mask for flags
|
|
#define IP_TS_OVMASK 0xf0 // Mask for overflow field.
|
|
#define IP_TS_MAXOV 0xf0 // Maximum value for the overflow field.
|
|
#define IP_TS_INC 0x10 // Increment used on overflow field.
|
|
|
|
#define MIN_RT_PTR 4
|
|
#define MIN_TS_PTR 5
|
|
|
|
#define TS_REC_TS 0 // Record TS option.
|
|
#define TS_REC_ADDR 1 // Record TS and address.
|
|
#define TS_REC_SPEC 3 // Only specified addresses record.
|
|
|
|
#define OPT_SSRR 1 // We've seen a SSRR in this option buffer
|
|
#define OPT_LSRR 2 // We've seen a LSRR in this option buffer
|
|
#define OPT_RR 4 // We've seen a RR
|
|
#define OPT_TS 8 // We've seen a TS.
|
|
|
|
#define MAX_OPT_SIZE 40
|
|
|
|
#define ALL_ROUTER_MCAST 0x020000E0
|
|
|
|
// Received option index structure.
|
|
struct OptIndex {
|
|
uchar oi_srindex;
|
|
uchar oi_rrindex;
|
|
uchar oi_tsindex;
|
|
uchar oi_srtype;
|
|
}; /* OptIndex */
|
|
|
|
typedef struct OptIndex OptIndex;
|
|
|
|
#define MAX_HDR_SIZE (sizeof(IPHeader) + MAX_OPT_SIZE)
|
|
|
|
#define DEFAULT_VERLEN 0x45 // Default version and length.
|
|
|
|
#define IP_VERSION 0x40
|
|
#define IP_VER_FLAG 0xF0
|
|
|
|
#define IP_RSVD_FLAG 0x0080 // Reserved.
|
|
#define IP_DF_FLAG 0x0040 // 'Don't fragment' flag
|
|
#define IP_MF_FLAG 0x0020 // 'More fragments flag'
|
|
|
|
|
|
#define IP_OFFSET_MASK ~0x00E0 // Mask for extracting offset field.
|
|
|
|
typedef IP_STATUS (*ULRcvProc)(void *, IPAddr, IPAddr, IPAddr, IPAddr,
|
|
IPHeader UNALIGNED *, uint, IPRcvBuf *, uint,
|
|
uchar, uchar, IPOptInfo *);
|
|
|
|
typedef uint (*ULStatusProc)(uchar, IP_STATUS, IPAddr, IPAddr, IPAddr, ulong, void *);
|
|
|
|
//* Protocol information structure. These is one of there for each protocol bound
|
|
// to an NTE.
|
|
struct ProtInfo {
|
|
void (*pi_xmitdone)(void *, PNDIS_BUFFER); // Pointer to xmit done routine.
|
|
ULRcvProc pi_rcv; // Pointer to receive routine.
|
|
ULStatusProc pi_status; // Pointer to status handler.
|
|
void (*pi_rcvcmplt)(void); // Pointer to recv. cmplt handler.
|
|
uchar pi_protocol; // Protocol type.
|
|
uchar pi_pad[3]; // Pad to dword
|
|
}; /* ProtInfo */
|
|
|
|
typedef struct ProtInfo ProtInfo;
|
|
|
|
//* Per-net information. We keep a variety of information for
|
|
// each net, including the IP address, subnet mask, and reassembly
|
|
// information.
|
|
|
|
#define MAX_IP_PROT 5 // ICMP, IGMP, TCP, UDP, & Raw
|
|
|
|
struct IPRtrEntry {
|
|
struct IPRtrEntry *ire_next;
|
|
IPAddr ire_addr;
|
|
long ire_preference;
|
|
ushort ire_lifetime;
|
|
ushort ire_pad;
|
|
}; /* IPRtrEntry */
|
|
|
|
typedef struct IPRtrEntry IPRtrEntry;
|
|
|
|
struct NetTableEntry {
|
|
struct NetTableEntry *nte_next; // Next NTE of I/F.
|
|
IPAddr nte_addr; // IP address for this net.
|
|
IPMask nte_mask; // Subnet mask for this net.
|
|
struct Interface *nte_if; // Pointer to interface for this net.
|
|
struct NetTableEntry *nte_ifnext; // Linkage on if chain.
|
|
ushort nte_flags; // Flags for NTE.
|
|
ushort nte_context; // Context passed to upper layers.
|
|
ulong nte_instance; // Unique instance ID for this net
|
|
void *nte_pnpcontext; // PNP context.
|
|
DEFINE_LOCK_STRUCTURE(nte_lock)
|
|
struct ReassemblyHeader *nte_ralist; // Reassembly list.
|
|
struct EchoControl *nte_echolist; // List of pending echo control blocks
|
|
CTETimer nte_timer; // Timer for this net.
|
|
ushort nte_mss;
|
|
ushort nte_icmpseq; // ICMP seq. #
|
|
struct IGMPAddr *nte_igmplist; // List of mcast addresses.
|
|
#ifdef _PNP_POWER
|
|
void *nte_addrhandle; // Handle for address registration.
|
|
#endif
|
|
IPAddr nte_rtrdiscaddr; // Address used for Router Discovery
|
|
uchar nte_rtrdiscstate; // state of router solicitations
|
|
uchar nte_rtrdisccount; // router solicitation count
|
|
uchar nte_rtrdiscovery;
|
|
IPRtrEntry *nte_rtrlist;
|
|
|
|
}; /* NetTableEntry */
|
|
|
|
typedef struct NetTableEntry NetTableEntry;
|
|
|
|
#define NTE_VALID 0x0001 // NTE is valid.
|
|
#define NTE_COPY 0x0002 // For NDIS copy lookahead stuff.
|
|
#define NTE_PRIMARY 0x0004 // This is the 'primary' NTE on the I/F.
|
|
#define NTE_ACTIVE 0x0008 // NTE is active, i.e. interface is valid.
|
|
#define NTE_DYNAMIC 0x0010 // NTE is was created dynamically
|
|
|
|
#define IP_TIMEOUT 500
|
|
|
|
#define NTE_RTRDISC_UNINIT 0
|
|
#define NTE_RTRDISC_DELAYING 1
|
|
#define NTE_RTRDISC_SOLICITING 2
|
|
|
|
#define MAX_SOLICITATION_DELAY 2 // ticks to delay
|
|
#define SOLICITATION_INTERVAL 6 // ticks between solicitations
|
|
#define MAX_SOLICITATIONS 3 // number of solicitations
|
|
|
|
struct AddrTypeCache {
|
|
IPAddr atc_addr; // IP Addr of cache entry
|
|
uchar atc_flags; // Valid flag
|
|
uchar atc_type; // Addr Type
|
|
};
|
|
|
|
typedef struct AddrTypeCache AddrTypeCache;
|
|
|
|
#define ATC_SIZE 8
|
|
#define ATC_MASK 7 // mask used to make sure indexes are less than ATC_SIZE
|
|
|
|
//* Buffer reference structure. Used by broadcast and fragmentation code to
|
|
// track multiple references to a single user buffer.
|
|
struct BufferReference {
|
|
PNDIS_BUFFER br_buffer; // Pointer to uses buffer.
|
|
DEFINE_LOCK_STRUCTURE(br_lock)
|
|
int br_refcount; // Count of references to user's buffer.
|
|
}; /* BufferReference */
|
|
|
|
typedef struct BufferReference BufferReference;
|
|
|
|
// Definitions of flags in pc_flags field
|
|
#define PACKET_FLAG_OPTIONS 1 // Set if packet has an options buffer.
|
|
#define PACKET_FLAG_IPBUF 2 // Set if packet is composed of IP buffers.
|
|
#define PACKET_FLAG_RA 4 // Set if packet is being used for reassembly.
|
|
#define PACKET_FLAG_FW 8 // Set if packet is a forwarding packet.
|
|
#define PACKET_FLAG_IPHDR 0x10 // Packet uses an IP hdr buffer.
|
|
|
|
//* Transfer data packet context. Used when TD'ing a packet - we store information for the
|
|
// callback here.
|
|
struct TDContext {
|
|
struct PCCommon tdc_common;
|
|
void *tdc_buffer; // Pointer to buffer containing data.
|
|
NetTableEntry *tdc_nte; // NTE to receive this on.
|
|
struct RABufDesc *tdc_rbd; // Pointer to RBD, if any.
|
|
uchar tdc_dtype; // Destination type of original address.
|
|
uchar tdc_hlength; // Length in bytes of header.
|
|
uchar tdc_pad[2];
|
|
uchar tdc_header[MAX_HDR_SIZE + 8];
|
|
}; /* TDContext */
|
|
|
|
typedef struct TDContext TDContext;
|
|
|
|
//* Information about net interfaces. There can be multiple nets for each interface,
|
|
// but there is exactly one interface per net.
|
|
|
|
struct Interface {
|
|
struct Interface *if_next; // Next interface in chain.
|
|
void *if_lcontext; // Link layer context.
|
|
NDIS_STATUS (*if_xmit)(void *, PNDIS_PACKET, IPAddr, RouteCacheEntry *);
|
|
NDIS_STATUS (*if_transfer)(void *, NDIS_HANDLE, uint, uint, uint, PNDIS_PACKET,
|
|
uint *);
|
|
void (*if_close)(void *);
|
|
void (*if_invalidate)(void *, RouteCacheEntry *);
|
|
uint (*if_addaddr)(void *, uint, IPAddr, IPMask, void *);
|
|
void (*if_deladdr)(void *, uint, IPAddr, IPMask);
|
|
int (*if_qinfo)(void *, struct TDIObjectID *,
|
|
PNDIS_BUFFER, uint *, void *);
|
|
int (*if_setinfo)(void *, struct TDIObjectID *, void *,
|
|
uint);
|
|
int (*if_getelist)(void *, void *, uint *);
|
|
PNDIS_PACKET if_tdpacket; // Packet used for transferring data.
|
|
uint if_index; // Index of this interface.
|
|
uint if_ntecount; // Valid NTEs on this interface.
|
|
NetTableEntry *if_nte; // Pointer to list of NTE on interface.
|
|
IPAddr if_bcast; // Broadcast address for this interface.
|
|
uint if_mtu; // True maximum MTU for the interface.
|
|
uint if_speed; // Speed in bits/sec of this interface.
|
|
uint if_flags; // Flags for this interface.
|
|
INTERFACE_CONTEXT if_filtercontext; // Filter context for this i/f.
|
|
uint if_addrlen; // Length of i/f addr.
|
|
uchar *if_addr; // Pointer to addr.
|
|
|
|
uint IgmpVersion; //igmp version active on this interface
|
|
uint IgmpVer1Timeout; //Version 1 router present timeout
|
|
#ifdef _PNP_POWER
|
|
uint if_refcount; // Reference count for this i/f.
|
|
CTEBlockStruc *if_block; // Block structure for PnP.
|
|
void *if_pnpcontext; // Context to pass to upper layers.
|
|
#endif // _PNP_POWER
|
|
|
|
uint if_llipflags; // Lower layer flags
|
|
#ifdef SECFLTR
|
|
NDIS_STRING if_configname; // Name of the i/f config section
|
|
#endif //SECFLTR
|
|
DEFINE_LOCK_STRUCTURE(if_lock)
|
|
}; /* Interface */
|
|
|
|
typedef struct Interface Interface;
|
|
|
|
/*NOINC*/
|
|
extern void DerefIF(Interface *IF);
|
|
/*INC*/
|
|
|
|
#define IF_FLAGS_P2P 1 // Point to point interface
|
|
#define IF_FLAGS_DELETING 2 // Interface is in the process of going
|
|
// away.
|
|
|
|
// Structure of a reassembly buffer descriptor. Each RBD describes a fragment of the total
|
|
// datagram
|
|
struct RABufDesc {
|
|
IPRcvBuf rbd_buf; // IP receive buffer for this fragment.
|
|
ushort rbd_start; // Offset of first byte of this fragment.
|
|
ushort rbd_end; // Offset of last byte of this fragment.
|
|
}; /* RABufDesc */
|
|
|
|
typedef struct RABufDesc RABufDesc;
|
|
|
|
// Reassembly header. The includes the information needed for the lookup, as well as space
|
|
// for the received header and a chain of reassembly buffer descriptors.
|
|
struct ReassemblyHeader {
|
|
struct ReassemblyHeader *rh_next; // Next header in chain.
|
|
IPAddr rh_dest; // Destination address of fragment.
|
|
IPAddr rh_src; // Source address of fragment.
|
|
ushort rh_id; // ID of datagram.
|
|
uchar rh_protocol; // Protocol of datagram.
|
|
uchar rh_ttl; // Remaining time of datagram.
|
|
RABufDesc *rh_rbd; // Chain of RBDs for this datagram.
|
|
ushort rh_datasize; // Total size of data.
|
|
ushort rh_datarcvd; // Amount of data received so far.
|
|
uint rh_headersize; // Size in bytes of header.
|
|
uchar rh_header[MAX_HDR_SIZE+8]; // Saved IP header of first fragment.
|
|
}; /* ReassemblyHeader */
|
|
|
|
typedef struct ReassemblyHeader ReassemblyHeader;
|
|
|
|
// ICMP type and code definitions
|
|
#define IP_DEST_UNREACH_BASE IP_DEST_NET_UNREACHABLE
|
|
|
|
#define ICMP_REDIRECT 5 // Redirect
|
|
#define ADDR_MASK_REQUEST 17 // Address mask request
|
|
#define ADDR_MASK_REPLY 18
|
|
#define ICMP_DEST_UNREACH 3 // Destination unreachable
|
|
#define ICMP_TIME_EXCEED 11 // Time exceeded during reassembly
|
|
#define ICMP_PARAM_PROBLEM 12 // Parameter problem
|
|
#define ICMP_SOURCE_QUENCH 4 // Source quench
|
|
#define ICMP_ROUTER_ADVERTISEMENT 9 // Router Advertisement
|
|
#define ICMP_ROUTER_SOLICITATION 10 // Router Solicitation
|
|
|
|
#define NET_UNREACH 0
|
|
#define HOST_UNREACH 1
|
|
#define PROT_UNREACH 2
|
|
#define PORT_UNREACH 3
|
|
#define FRAG_NEEDED 4
|
|
#define SR_FAILED 5
|
|
#define DEST_NET_UNKNOWN 6
|
|
#define DEST_HOST_UNKNOWN 7
|
|
#define SRC_ISOLATED 8
|
|
#define DEST_NET_ADMIN 9
|
|
#define DEST_HOST_ADMIN 10
|
|
#define NET_UNREACH_TOS 11
|
|
#define HOST_UNREACH_TOS 12
|
|
|
|
#define TTL_IN_TRANSIT 0 // TTL expired in transit
|
|
#define TTL_IN_REASSEM 1 // Time exceeded in reassembly
|
|
|
|
|
|
#define PTR_VALID 0
|
|
#define REQ_OPTION_MISSING 1
|
|
|
|
#define REDIRECT_NET 0
|
|
#define REDIRECT_HOST 1
|
|
#define REDIRECT_NET_TOS 2
|
|
#define REDIRECT_HOST_TOS 3
|
|
|
|
extern uint DHCPActivityCount;
|
|
|
|
extern IP_STATUS SetIFContext(uint Index, INTERFACE_CONTEXT *Context);
|
|
|
|
extern IP_STATUS SetFilterPtr(IPPacketFilterPtr FilterPtr);
|
|
|
|
extern IP_STATUS SetMapRoutePtr(IPMapRouteToInterfacePtr MapRoutePtr);
|
|
|
|
#ifdef NT
|
|
|
|
#ifdef POOL_TAGGING
|
|
|
|
#ifdef ExAllocatePool
|
|
#undef ExAllocatePool
|
|
#endif
|
|
|
|
#define ExAllocatePool(type, size) ExAllocatePoolWithTag(type, size, 'iPCT')
|
|
|
|
#ifndef CTEAllocMem
|
|
#error "CTEAllocMem is not already defined - will override tagging"
|
|
#else
|
|
#undef CTEAllocMem
|
|
#endif
|
|
|
|
#define CTEAllocMem(size) ExAllocatePoolWithTag(NonPagedPool, size, 'iPCT')
|
|
|
|
#endif // POOL_TAGGING
|
|
|
|
//
|
|
// Use the TCP core checksum routine.
|
|
//
|
|
|
|
ULONG
|
|
tcpxsum (
|
|
IN ULONG Checksum,
|
|
IN PUCHAR Source,
|
|
IN ULONG Length
|
|
);
|
|
|
|
#define xsum(Buffer, Length) ((ushort) tcpxsum(0, (PUCHAR) (Buffer), (Length)))
|
|
|
|
#else // NT
|
|
|
|
extern ushort xsum(void *, int);
|
|
|
|
#endif // NT
|
|
|