windows-nt/Source/XPSP1/NT/net/tcpip/driver/ipv4/arpdef.h
2020-09-26 16:20:57 +08:00

359 lines
14 KiB
C

/********************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1990-2000 **/
/********************************************************************/
/* :ts=4 */
//*** arpdef.h - ARP definitions
//
// This file containes all of the private ARP related definitions.
#define MEDIA_DIX 0
#define MEDIA_TR 1
#define MEDIA_FDDI 2
#define MEDIA_ARCNET 3
#define MAX_MEDIA 4
#define INTERFACE_UP 0 // Interface is up.
#define INTERFACE_INIT 1 // Interface is initializing.
#define INTERFACE_DOWN 2 // Interface is down.
#define LOOKAHEAD_SIZE 128 // A reasonable lookahead size
// Definitions for state of an ATE. The 'RESOLVING' indicators must occur first.
#define ARP_RESOLVING_LOCAL 0 // Address is being resolved (on local ring, if TR)
#define ARP_RESOLVING_GLOBAL 1 // Address is being resolved globally.
#define ARP_RESOLVING ARP_RESOLVING_GLOBAL
#define ARP_GOOD 2 // ATE is good.
#define ARP_BAD 3 // ATE is bad.
#define ARP_FLOOD_RATE 1000L // No more than once a second.
#define ARP_802_ADDR_LENGTH 6 // Length of an 802 address.
#define MIN_ETYPE 0x600 // Minimum valid Ethertype
#define SNAP_SAP 170
#define SNAP_UI 3
//* Structure of an Ethernet header.
typedef struct ENetHeader {
uchar eh_daddr[ARP_802_ADDR_LENGTH];
uchar eh_saddr[ARP_802_ADDR_LENGTH];
ushort eh_type;
} ENetHeader;
//* Structure of a token ring header.
typedef struct TRHeader {
uchar tr_ac;
uchar tr_fc;
uchar tr_daddr[ARP_802_ADDR_LENGTH];
uchar tr_saddr[ARP_802_ADDR_LENGTH];
} TRHeader;
#define ARP_AC 0x10
#define ARP_FC 0x40
#define TR_RII 0x80
typedef struct RC {
uchar rc_blen; // Broadcast indicator and length.
uchar rc_dlf; // Direction and largest frame.
} RC;
#define RC_DIR 0x80
#define RC_LENMASK 0x1f
#define RC_SRBCST 0xc2 // Single route broadcast RC.
#define RC_ARBCST 0x82 // All route broadcast RC.
#define RC_LMASK 0x1F // Mask for length field for route
// information
#define RC_LEN 0x2 // Length to put in the length bits
// when sending source routed
// frames
#define RC_BCST_LEN 0x70 // Length for a broadcast.
#define RC_LF_MASK 0x70 // Mask for length bits.
//* Structure of source routing information.
typedef struct SRInfo {
RC sri_rc; // Routing control info.
ushort sri_rd[1]; // Routing designators.
} SRInfo;
#define ARP_MAX_RD 8
//* Structure of an FDDI header.
typedef struct FDDIHeader {
uchar fh_pri;
uchar fh_daddr[ARP_802_ADDR_LENGTH];
uchar fh_saddr[ARP_802_ADDR_LENGTH];
} FDDIHeader;
#define ARP_FDDI_PRI 0x57
#define ARP_FDDI_MSS 4352
//* Structure of an ARCNET header.
typedef struct ARCNetHeader {
uchar ah_saddr;
uchar ah_daddr;
uchar ah_prot;
} ARCNetHeader;
//* Structure of a SNAP header.
typedef struct SNAPHeader {
uchar sh_dsap;
uchar sh_ssap;
uchar sh_ctl;
uchar sh_protid[3];
ushort sh_etype;
} SNAPHeader;
#define ARP_MAX_MEDIA_ENET sizeof(ENetHeader)
#define ARP_MAX_MEDIA_TR (sizeof(TRHeader)+sizeof(RC)+(ARP_MAX_RD*sizeof(ushort))+sizeof(SNAPHeader))
#define ARP_MAX_MEDIA_FDDI (sizeof(FDDIHeader)+sizeof(SNAPHeader))
#define ARP_MAX_MEDIA_ARC sizeof(ARCNetHeader)
#define ENET_BCAST_MASK 0x01
#define TR_BCAST_MASK 0x80
#define FDDI_BCAST_MASK 0x01
#define ARC_BCAST_MASK 0xff
#define ENET_BCAST_VAL 0x01
#define TR_BCAST_VAL 0x80
#define FDDI_BCAST_VAL 0x01
#define ARC_BCAST_VAL 0x00
#define ENET_BCAST_OFF 0x00
#define TR_BCAST_OFF offsetof(struct TRHeader, tr_daddr)
#define FDDI_BCAST_OFF offsetof(struct FDDIHeader, fh_daddr)
#define ARC_BCAST_OFF offsetof(struct ARCNetHeader, ah_daddr)
typedef void (*ArpRtn)(void *, IP_STATUS Status);
typedef struct ARPControlBlock {
struct ARPControlBlock *next;
ArpRtn CompletionRtn;
ulong status;
ulong PhyAddrLen;
ulong *PhyAddr;
} ARPControlBlock;
//* Structure of an ARP table entry.
typedef struct ARPTableEntry {
struct ARPTableEntry *ate_next; // Next ATE in hash chain
ulong ate_valid; // Last time ATE was known to be valid.
IPAddr ate_dest; // IP address represented.
PNDIS_PACKET ate_packet; // Packet (if any) queued for resolution
RouteCacheEntry *ate_rce; // List of RCEs that reference this ATE.
DEFINE_LOCK_STRUCTURE(ate_lock) // Lock for this ATE.
uint ate_useticks; // Number of ticks left until this
// goes away.
uchar ate_addrlength; // Length of the address.
uchar ate_state; // State of this entry
ulong ate_userarp; // added to facilitate user api ARP reauests
ARPControlBlock *ate_resolveonly;// This field points ARP control block(s)
uint ate_refresh; //refresh arp entries before timeingout
uchar ate_addr[1]; // Address that maps to dest
} ARPTableEntry;
#define ALWAYS_VALID 0xffffffff
//* Structure of the ARP table.
#define ARP_TABLE_SIZE 64
#define ARP_HASH(x) ((((uchar *)&(x))[3] + ((uchar *)&(x))[2] + ((uchar *)&(x))[1] + ((uchar *)&(x))[0]) % ARP_TABLE_SIZE)
typedef ARPTableEntry *ARPTable[];
//* List structure for local representation of an IPAddress.
typedef struct ARPIPAddr {
struct ARPIPAddr *aia_next; // Next in list.
uint aia_age;
IPAddr aia_addr; // The address.
IPMask aia_mask;
void *aia_context;
} ARPIPAddr;
#define ARPADDR_NOT_LOCAL 4
#define ARPADDR_NEW_LOCAL 3
#define ARPADDR_OLD_LOCAL 0
//* List structure for Proxy-ARP addresses.
typedef struct ARPPArpAddr {
struct ARPPArpAddr *apa_next; // Next in list.
IPAddr apa_addr; // The address.
IPMask apa_mask; // And the mask.
} ARPPArpAddr;
//* List structure for a multicast IP address.
typedef struct ARPMCastAddr {
struct ARPMCastAddr *ama_next; // Next in list.
IPAddr ama_addr; // The (masked) address.
uint ama_refcnt; // Reference count for this address.
} ARPMCastAddr;
#define ARP_MCAST_MASK 0xffff7f00
#define ARP_TIMER_TIME 1000L
#define ARP_RESOLVE_TIMEOUT 1000L
#define ARP_MIN_VALID_TIMEOUT 600000L
#define ARP_REFRESH_TIME 2000L
#if FFP_SUPPORT
#define FFP_ARP_FLUSH_INTERVAL 300 // Time (in s) after which ARP forces an FFP
// flush (inorder to keep the ARP cache and
// FFP's MAC Addr mapping in limited sync)
#endif
typedef struct ARPNotifyStruct {
CTEEvent ans_event;
uint ans_shutoff;
IPAddr ans_addr;
uint ans_hwaddrlen;
uchar ans_hwaddr[1];
} ARPNotifyStruct;
//* Structure of information we keep on a per-interface basis.
typedef struct ARPInterface {
LIST_ENTRY ai_linkage; // to link into ARP interface list
void *ai_context; // Upper layer context info.
#if FFP_SUPPORT
NDIS_HANDLE ai_driver; // NDIS Miniport/MAC driver handle
#endif
NDIS_HANDLE ai_handle; // NDIS bind handle.
NDIS_MEDIUM ai_media; // Media type.
NDIS_HANDLE ai_ppool; // Handle for packet pool.
DEFINE_LOCK_STRUCTURE(ai_lock) // Lock for this structure.
DEFINE_LOCK_STRUCTURE(ai_ARPTblLock) // ARP Table lock for this structure.
ARPTable *ai_ARPTbl; // Pointer to the ARP table for this interface
ARPIPAddr ai_ipaddr; // Local IP address list.
ARPPArpAddr *ai_parpaddr; // Proxy ARP address list.
IPAddr ai_bcast; // Broadcast mask for this interface.
// SNMP required counters
uint ai_inoctets; // Input octets.
uint ai_inpcount[3]; // Count of nonunicast, unicast & promiscuous
// packets received.
uint ai_outoctets; // Output octets
uint ai_outpcount[2];// Count of nonunicast and unicast
// packets sent.
uint ai_qlen; // Output q length.
uchar ai_addr[ARP_802_ADDR_LENGTH]; // Local HW address.
uchar ai_state; // State of the interface. Union of
// admin and operational states.
uchar ai_addrlen; // Length of ai_addr.
uchar ai_bcastmask; // Mask for checking unicast.
uchar ai_bcastval; // Value to check against.
uchar ai_bcastoff; // Offset in frame to check against.
uchar ai_hdrsize; // Size of 'typical' header.
uchar ai_snapsize; // Size of snap header, if any.
uchar ai_pad[2]; // PAD PAD
uint ai_pfilter; // Packet filter for this i/f.
uint ai_count; // Number of entries in the ARPTable.
uint ai_parpcount; // Number of proxy ARP entries.
CTETimer ai_timer; // ARP timer for this interface.
BOOLEAN ai_timerstarted;// ARP timer started for this interface?
BOOLEAN ai_stoptimer; // ARP timer started for this interface?
CTEBlockStruc ai_timerblock; // used to sync stopping the interface timer
CTEBlockStruc ai_block; // Structure for blocking on.
ushort ai_mtu; // MTU for this interface.
uchar ai_adminstate; // Admin state.
uchar ai_operstate; // Operational state;
uint ai_speed; // Speed.
uint ai_lastchange; // Last change time.
uint ai_indiscards; // In discards.
uint ai_inerrors; // Input errors.
uint ai_uknprotos; // Unknown protocols received.
uint ai_outdiscards; // Output packets discarded.
uint ai_outerrors; // Output errors.
uint ai_desclen; // Length of desc. string.
uint ai_index; // Global I/F index ID.
uint ai_atinst; // AT instance number.
uint ai_ifinst; // IF instance number.
char *ai_desc; // Descriptor string.
ARPMCastAddr *ai_mcast; // Multicast list.
uint ai_mcastcnt; // Count of elements on mcast list.
uint ai_ipaddrcnt; // number of local address on this
uint ai_telladdrchng;// tell link layer about addr change? (for psched)
ULONG ai_mediatype;
uint ai_promiscuous; // promiscuous mode or not.
#if FFP_SUPPORT
ulong ai_ffpversion; // The version of FFP in use (0 implies no support)
uint ai_ffplastflush;// Number of timer ticks since arp's last FFP flush
#endif
ARPNotifyStruct *ai_conflict;
uint ai_delay;
uint ai_OffloadFlags;// H/W checksum capability flag
NDIS_TASK_TCP_LARGE_SEND ai_TcpLargeSend;
NDIS_PNP_CAPABILITIES ai_wakeupcap; // wakeup capabilities.
NDIS_STRING ai_devicename; // Name of the device.
} ARPInterface;
//* NOTE: These two values MUST stay at 0 and 1.
#define AI_UCAST_INDEX 0
#define AI_NONUCAST_INDEX 1
#define AI_PROMIS_INDEX 2
#define ARP_DEFAULT_PACKETS 10
//* Structure of information passed as context in RCE.
typedef struct ARPContext {
RouteCacheEntry *ac_next; // Next RCE in ARP table chain.
ARPTableEntry *ac_ate; // Back pointer to ARP table entry.
} ARPContext;
typedef struct IPNMEContext {
uint inc_index;
ARPTableEntry *inc_entry;
} IPNMEContext;
#include <packon.h>
// Structure of an ARP header.
typedef struct ARPHeader {
ushort ah_hw; // Hardware address space.
ushort ah_pro; // Protocol address space.
uchar ah_hlen; // Hardware address length.
uchar ah_plen; // Protocol address length.
ushort ah_opcode; // Opcode.
uchar ah_shaddr[ARP_802_ADDR_LENGTH]; // Source HW address.
IPAddr ah_spaddr; // Source protocol address.
uchar ah_dhaddr[ARP_802_ADDR_LENGTH]; // Destination HW address.
IPAddr ah_dpaddr; // Destination protocol address.
} ARPHeader;
#include <packoff.h>
#define ARP_ETYPE_IP 0x800
#define ARP_ETYPE_ARP 0x806
#define ARP_REQUEST 1
#define ARP_RESPONSE 2
#define ARP_HW_ENET 1
#define ARP_HW_802 6
#define ARP_HW_ARCNET 7
#define ARP_ARCPROT_ARP 0xd5
#define ARP_ARCPROT_IP 0xd4
// The size we need to back off the buffer length because ARCNet address
// are one bytes instead of six.
#define ARCNET_ARPHEADER_ADJUSTMENT 10
typedef struct _AddAddrNotifyEvent {
CTEEvent Event;
SetAddrControl *SAC;
IPAddr Address;
IP_STATUS Status;
} AddAddrNotifyEvent;
// Compute the length of the wakeup pattern mask based on the length
// of the pattern. See NET_PM_WAKEUP_PATTERN_DESC.
//
__inline
UINT
GetWakeupPatternMaskLength(
IN UINT Ptrnlen)
{
return (Ptrnlen - 1)/8 + 1;
}