• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2 
3 Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 Module Name:
13 
14   SnpNt32.h
15 
16 Abstract:
17 
18 -**/
19 
20 #ifndef _SNP_NT32_H_
21 #define _SNP_NT32_H_
22 
23 #include <Uefi.h>
24 
25 #include <Protocol/SimpleNetwork.h>
26 #include <Protocol/DevicePath.h>
27 #include <Protocol/WinNtThunk.h>
28 
29 #include <Library/BaseLib.h>
30 #include <Library/DebugLib.h>
31 #include <Library/BaseMemoryLib.h>
32 #include <Library/UefiBootServicesTableLib.h>
33 #include <Library/UefiLib.h>
34 #include <Library/DevicePathLib.h>
35 #include <Library/NetLib.h>
36 #include <Library/MemoryAllocationLib.h>
37 
38 typedef struct _SNPNT32_GLOBAL_DATA  SNPNT32_GLOBAL_DATA;
39 typedef struct _SNPNT32_INSTANCE_DATA SNPNT32_INSTANCE_DATA;
40 
41 #define NETWORK_LIBRARY_NAME_U          L"SnpNt32Io.dll"
42 
43 #define NETWORK_LIBRARY_INITIALIZE      "SnpInitialize"
44 #define NETWORK_LIBRARY_FINALIZE        "SnpFinalize"
45 #define NETWORK_LIBRARY_SET_RCV_FILTER  "SnpSetReceiveFilter"
46 #define NETWORK_LIBRARY_RECEIVE         "SnpReceive"
47 #define NETWORK_LIBRARY_TRANSMIT        "SnpTransmit"
48 
49 #pragma pack(1)
50 typedef struct _NT_NET_INTERFACE_INFO {
51   UINT32          InterfaceIndex;
52   EFI_MAC_ADDRESS MacAddr;
53 } NT_NET_INTERFACE_INFO;
54 #pragma pack()
55 
56 #define NET_ETHER_HEADER_SIZE     14
57 
58 #define MAX_INTERFACE_INFO_NUMBER 16
59 #define MAX_FILE_NAME_LENGTH      280
60 
61 //
62 //  Functions in Net Library
63 //
64 typedef
65 INT32
66 (*NT_NET_INITIALIZE) (
67   IN OUT  UINT32                *InterfaceCount,
68   IN OUT  NT_NET_INTERFACE_INFO * InterfaceInfoBuffer
69   );
70 
71 typedef
72 INT32
73 (*NT_NET_FINALIZE) (
74   VOID
75   );
76 
77 typedef
78 INT32
79 (*NT_NET_SET_RECEIVE_FILTER) (
80   IN  UINT32                        Index,
81   IN  UINT32                        EnableFilter,
82   IN  UINT32                        MCastFilterCnt,
83   IN  EFI_MAC_ADDRESS               * MCastFilter
84   );
85 
86 typedef
87 INT32
88 (*NT_NET_RECEIVE) (
89   IN      UINT32                        Index,
90   IN OUT  UINT32                        *BufferSize,
91   OUT     VOID                          *Buffer
92   );
93 
94 typedef
95 INT32
96 (*NT_NET_TRANSMIT) (
97   IN  UINT32                        Index,
98   IN  UINT32                        HeaderSize,
99   IN  UINT32                        BufferSize,
100   IN  VOID                          *Buffer,
101   IN  EFI_MAC_ADDRESS               * SrcAddr,
102   IN  EFI_MAC_ADDRESS               * DestAddr,
103   IN  UINT16                        *Protocol
104   );
105 
106 typedef struct _NT_NET_UTILITY_TABLE {
107   NT_NET_INITIALIZE         Initialize;
108   NT_NET_FINALIZE           Finalize;
109   NT_NET_SET_RECEIVE_FILTER SetReceiveFilter;
110   NT_NET_RECEIVE            Receive;
111   NT_NET_TRANSMIT           Transmit;
112 } NT_NET_UTILITY_TABLE;
113 
114 //
115 //  Private functions
116 //
117 typedef
118 EFI_STATUS
119 (*SNPNT32_INITIALIZE_GLOBAL_DATA) (
120   IN SNPNT32_GLOBAL_DATA * This
121   );
122 
123 typedef
124 EFI_STATUS
125 (*SNPNT32_INITIALIZE_INSTANCE_DATA) (
126   IN SNPNT32_GLOBAL_DATA    * This,
127   IN SNPNT32_INSTANCE_DATA  * Instance
128   );
129 
130 typedef
131 EFI_STATUS
132 (*SNPNT32_CLOSE_INSTANCE) (
133   IN SNPNT32_GLOBAL_DATA    * This,
134   IN SNPNT32_INSTANCE_DATA  * Instance
135   );
136 
137 //
138 //  Global data for this driver
139 //
140 #define SNP_NT32_DRIVER_SIGNATURE SIGNATURE_32 ('W', 'S', 'N', 'P')
141 
142 struct _SNPNT32_GLOBAL_DATA {
143   UINT32                            Signature;
144 
145   //
146   //  List for all the fake SNP instance
147   //
148   LIST_ENTRY                        InstanceList;
149 
150   EFI_WIN_NT_THUNK_PROTOCOL         *WinNtThunk;
151   HMODULE                           NetworkLibraryHandle;
152 
153   NT_NET_UTILITY_TABLE              NtNetUtilityTable;
154 
155   EFI_LOCK                          Lock;
156 
157   //
158   //  Private functions
159   //
160   SNPNT32_INITIALIZE_GLOBAL_DATA    InitializeGlobalData;
161   SNPNT32_INITIALIZE_INSTANCE_DATA  InitializeInstanceData;
162   SNPNT32_CLOSE_INSTANCE            CloseInstance;
163 };
164 
165 //
166 //  Instance data for each fake SNP instance
167 //
168 #define SNP_NT32_INSTANCE_SIGNATURE SIGNATURE_32 ('w', 'S', 'N', 'P')
169 
170 struct _SNPNT32_INSTANCE_DATA {
171   UINT32                      Signature;
172 
173   //
174   //  List entry use for linking with other instance
175   //
176   LIST_ENTRY                  Entry;
177 
178   SNPNT32_GLOBAL_DATA         *GlobalData;
179 
180   EFI_HANDLE                  DeviceHandle;
181   EFI_DEVICE_PATH_PROTOCOL    *DevicePath;
182 
183   EFI_SIMPLE_NETWORK_PROTOCOL Snp;
184   EFI_SIMPLE_NETWORK_MODE     Mode;
185 
186   NT_NET_INTERFACE_INFO       InterfaceInfo;
187 
188   //
189   //  Private functions
190   //
191 };
192 
193 #define SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS(a) \
194   CR ( \
195   a, \
196   SNPNT32_INSTANCE_DATA, \
197   Snp, \
198   SNP_NT32_INSTANCE_SIGNATURE \
199   )
200 
201 extern EFI_DRIVER_BINDING_PROTOCOL    gSnpNt32DriverBinding;
202 extern EFI_COMPONENT_NAME_PROTOCOL    gSnpNt32DriverComponentName;
203 extern EFI_COMPONENT_NAME2_PROTOCOL   gSnpNt32DriverComponentName2;
204 
205 /**
206   Test to see if this driver supports ControllerHandle. This service
207   is called by the EFI boot service ConnectController(). In
208   order to make drivers as small as possible, there are a few calling
209   restrictions for this service. ConnectController() must
210   follow these calling restrictions. If any other agent wishes to call
211   Supported() it must also follow these calling restrictions.
212 
213   @param  This                Protocol instance pointer.
214   @param  ControllerHandle    Handle of device to test
215   @param  RemainingDevicePath Optional parameter use to pick a specific child
216                               device to start.
217 
218   @retval EFI_SUCCESS         This driver supports this device
219   @retval EFI_UNSUPPORTED     This driver does not support this device
220 
221 **/
222 EFI_STATUS
223 EFIAPI
224 SnpNt32DriverBindingSupported (
225   IN EFI_DRIVER_BINDING_PROTOCOL  * This,
226   IN EFI_HANDLE                   ControllerHandle,
227   IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL
228   );
229 
230 /**
231   Start this driver on ControllerHandle. This service is called by the
232   EFI boot service ConnectController(). In order to make
233   drivers as small as possible, there are a few calling restrictions for
234   this service. ConnectController() must follow these
235   calling restrictions. If any other agent wishes to call Start() it
236   must also follow these calling restrictions.
237 
238   @param  This                 Protocol instance pointer.
239   @param  ControllerHandle     Handle of device to bind driver to
240   @param  RemainingDevicePath  Optional parameter use to pick a specific child
241                                device to start.
242 
243   @retval EFI_SUCCESS          Always succeeds.
244 
245 **/
246 EFI_STATUS
247 EFIAPI
248 SnpNt32DriverBindingStart (
249   IN EFI_DRIVER_BINDING_PROTOCOL  * This,
250   IN EFI_HANDLE                   ControllerHandle,
251   IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL
252   );
253 
254 /**
255   Stop this driver on ControllerHandle. This service is called by the
256   EFI boot service DisconnectController(). In order to
257   make drivers as small as possible, there are a few calling
258   restrictions for this service. DisconnectController()
259   must follow these calling restrictions. If any other agent wishes
260   to call Stop() it must also follow these calling restrictions.
261 
262   @param  This              Protocol instance pointer.
263   @param  ControllerHandle  Handle of device to stop driver on
264   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
265                             children is zero stop the entire bus driver.
266   @param  ChildHandleBuffer List of Child Handles to Stop.
267 
268   @retval EFI_SUCCESS       Always succeeds.
269 
270 **/
271 EFI_STATUS
272 EFIAPI
273 SnpNt32DriverBindingStop (
274   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
275   IN  EFI_HANDLE                   ControllerHandle,
276   IN  UINTN                        NumberOfChildren,
277   IN  EFI_HANDLE                   *ChildHandleBuffer
278   );
279 
280 /**
281   Initialize the driver's global data.
282 
283   @param  This                  Pointer to the global context data.
284 
285   @retval EFI_SUCCESS           The global data is initialized.
286   @retval EFI_NOT_FOUND         The required DLL is not found.
287   @retval EFI_DEVICE_ERROR      Error initialize network utility library.
288   @retval EFI_OUT_OF_RESOURCES  Out of resource.
289   @retval other                 Other errors.
290 
291 **/
292 EFI_STATUS
293 SnpNt32InitializeGlobalData (
294   IN OUT SNPNT32_GLOBAL_DATA *This
295   );
296 
297 /**
298   Initialize the snpnt32 driver instance.
299 
300   @param  This                  Pointer to the SnpNt32 global data.
301   @param  Instance              Pointer to the instance context data.
302 
303   @retval EFI_SUCCESS           The driver instance is initialized.
304   @retval other                 Initialization errors.
305 
306 **/
307 EFI_STATUS
308 SnpNt32InitializeInstanceData (
309   IN SNPNT32_GLOBAL_DATA        *This,
310   IN OUT SNPNT32_INSTANCE_DATA  *Instance
311   );
312 
313 /**
314   Close the SnpNt32 driver instance.
315 
316   @param  This                  Pointer to the SnpNt32 global data.
317   @param  Instance              Pointer to the instance context data.
318 
319   @retval EFI_SUCCESS           The instance is closed.
320 
321 **/
322 EFI_STATUS
323 SnpNt32CloseInstance (
324   IN SNPNT32_GLOBAL_DATA        *This,
325   IN OUT SNPNT32_INSTANCE_DATA  *Instance
326   );
327 
328 #endif
329