Reactos
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: include/lan.h
5 * PURPOSE: LAN adapter definitions
6 */
7
8#pragma once
9
10/* NDIS version this driver supports */
11#define NDIS_VERSION_MAJOR 4
12#define NDIS_VERSION_MINOR 0
13
14/* Macros */
15
16#define MIN(value1, value2) \
17 ((value1 < value2)? value1 : value2)
18
19#define MAX(value1, value2) \
20 ((value1 > value2)? value1 : value2)
21
22#define NDIS_BUFFER_TAG FOURCC('n','b','u','f')
23#define NDIS_PACKET_TAG FOURCC('n','p','k','t')
24
25/* Media we support */
26#define MEDIA_ETH 0
27
28#define MAX_MEDIA 1
29
30#define IEEE_802_ADDR_LENGTH 6
31
32/* Ethernet header layout */
33typedef struct ETH_HEADER {
34 UCHAR DstAddr[IEEE_802_ADDR_LENGTH]; /* Destination MAC address */
35 UCHAR SrcAddr[IEEE_802_ADDR_LENGTH]; /* Source MAC address */
36 USHORT EType; /* Ethernet protocol type */
37} ETH_HEADER, *PETH_HEADER;
38
39#define MAX_MEDIA_ETH sizeof(ETH_HEADER)
40
41/* Broadcast masks */
42#define BCAST_ETH_MASK 0x01
43
44/* Broadcast values to check against */
45#define BCAST_ETH_CHECK 0x01
46
47/* Offset of broadcast address */
48#define BCAST_ETH_OFFSET 0x00
49
50typedef struct _LAN_ADDRESS_C {
51 LIST_ENTRY ListEntry;
52 LAN_ADDRESS ClientPart;
53} LAN_ADDRESS_C, *PLAN_ADDRESS_C;
54
55/* Per adapter information */
56typedef struct LAN_ADAPTER {
57 LIST_ENTRY ListEntry; /* Entry on list */
58 LIST_ENTRY AddressList; /* Addresses associated */
59 LIST_ENTRY ForeignList; /* List of known addresses */
60 KSPIN_LOCK Lock; /* Lock for this structure */
61 UINT Index; /* Adapter Index */
62 UCHAR State; /* State of the adapter */
63 KEVENT Event; /* Opening event */
64 PVOID Context; /* Upper layer context information */
65 NDIS_HANDLE NdisHandle; /* NDIS binding handle */
66 NDIS_STATUS NdisStatus; /* NDIS status of last request */
67 NDIS_MEDIUM Media; /* Media type */
68 UCHAR HWAddress[IEEE_802_ADDR_LENGTH]; /* Local HW address */
69 UINT HWAddressLength; /* Length of HW address */
70 UCHAR BCastMask; /* Mask for checking broadcast */
71 UCHAR BCastCheck; /* Value to check against */
72 UCHAR BCastOffset; /* Offset in frame to check against */
73 UCHAR HeaderSize; /* Size of link-level header */
74 USHORT MTU; /* Maximum Transfer Unit */
75 UINT MinFrameSize; /* Minimum frame size in bytes */
76 UINT MaxPacketSize; /* Maximum packet size when sending */
77 UINT MaxSendPackets; /* Maximum number of packets per send */
78 UINT MacOptions; /* MAC options for NIC driver/adapter */
79 UINT Speed; /* Link speed */
80 UINT PacketFilter; /* Packet filter for this adapter */
81 UINT Lookahead; /* Lookahead for adapter */
82 UNICODE_STRING RegistryPath; /* Registry path for later query */
83} LAN_ADAPTER, *PLAN_ADAPTER;
84
85typedef struct _LAN_PACKET {
86 PNDIS_PACKET NdisPacket;
87 PETH_HEADER EthHeader;
88 UINT TotalSize;
89} LAN_PACKET, *PLAN_PACKET;
90
91typedef struct _LAN_PROTOCOL {
92 LIST_ENTRY ListEntry;
93 LIST_ENTRY ReadIrpListHead;
94 UINT Id;
95 UINT LastServicePass;
96 UINT Buffered;
97 UINT NumEtherTypes;
98 USHORT EtherType[1];
99} LAN_PROTOCOL, *PLAN_PROTOCOL;
100
101typedef struct _LAN_DEVICE_EXT {
102 NDIS_HANDLE NdisProtocolHandle;
103 KSPIN_LOCK Lock;
104 LIST_ENTRY AdapterListHead;
105 LIST_ENTRY ProtocolListHead;
106 UINT AdapterId;
107 UINT ProtoId;
108} LAN_DEVICE_EXT, *PLAN_DEVICE_EXT;
109
110/* LAN adapter state constants */
111#define LAN_STATE_OPENING 0
112#define LAN_STATE_RESETTING 1
113#define LAN_STATE_STARTED 2
114#define LAN_STATE_STOPPED 3
115
116/* Size of out lookahead buffer */
117#define LOOKAHEAD_SIZE 128
118
119/* Ethernet types. We swap constants so we can compare values at runtime
120 without swapping them there */
121#define ETYPE_IPv4 WH2N(0x0800)
122#define ETYPE_IPv6 WH2N(0x86DD)
123#define ETYPE_ARP WH2N(0x0806)
124
125/* Protocols */
126#define LAN_PROTO_IPv4 0x0000 /* Internet Protocol version 4 */
127#define LAN_PROTO_IPv6 0x0001 /* Internet Protocol version 6 */
128#define LAN_PROTO_ARP 0x0002 /* Address Resolution Protocol */
129
130
131NDIS_STATUS LANRegisterAdapter(
132 PNDIS_STRING AdapterName,
133 PNDIS_STRING RegistryPath);
134
135NDIS_STATUS LANUnregisterAdapter(PLAN_ADAPTER Adapter);
136
137NTSTATUS LANRegisterProtocol(PNDIS_STRING Name);
138
139VOID LANUnregisterProtocol(VOID);
140
141NDIS_STATUS NDISCall(
142 PLAN_ADAPTER Adapter,
143 NDIS_REQUEST_TYPE Type,
144 NDIS_OID OID,
145 PVOID Buffer,
146 UINT Length);
147
148void GetDataPtr( PNDIS_PACKET Packet,
149 UINT Offset,
150 PCHAR *DataOut,
151 PUINT Size );
152
153NDIS_STATUS AllocatePacketWithBufferX( PNDIS_PACKET *NdisPacket,
154 PCHAR Data, UINT Len,
155 PCHAR File, UINT Line );
156
157VOID FreeNdisPacketX( PNDIS_PACKET Packet, PCHAR File, UINT Line );
158
159NDIS_STATUS InitNdisPools(VOID);
160VOID CloseNdisPools(VOID);
161
162PLAN_ADAPTER FindAdapterByIndex( PLAN_DEVICE_EXT DeviceExt, UINT Index );
163
164/* EOF */