]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioNetDxe/VirtioNet.h
ShellPkg/for: Fix potential null pointer deference
[mirror_edk2.git] / OvmfPkg / VirtioNetDxe / VirtioNet.h
CommitLineData
201cac0d
LE
1/** @file\r
2\r
3 Internal definitions for the virtio-net driver, which produces Simple Network\r
4 Protocol instances for virtio-net devices.\r
5\r
6 Copyright (C) 2013, Red Hat, Inc.\r
46b11f00 7 Copyright (c) 2017, AMD Inc, All rights reserved.<BR>\r
201cac0d
LE
8\r
9 This program and the accompanying materials are licensed and made available\r
10 under the terms and conditions of the BSD License which accompanies this\r
11 distribution. The full text of the license may be found at\r
12 http://opensource.org/licenses/bsd-license.php\r
13\r
14 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
15 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
16**/\r
17\r
18#ifndef _VIRTIO_NET_DXE_H_\r
19#define _VIRTIO_NET_DXE_H_\r
20\r
21#include <IndustryStandard/VirtioNet.h>\r
22#include <Library/DebugLib.h>\r
23#include <Library/VirtioLib.h>\r
24#include <Protocol/ComponentName.h>\r
25#include <Protocol/ComponentName2.h>\r
26#include <Protocol/DevicePath.h>\r
27#include <Protocol/DriverBinding.h>\r
201cac0d 28#include <Protocol/SimpleNetwork.h>\r
bd114d9f 29#include <Library/OrderedCollectionLib.h>\r
201cac0d
LE
30\r
31#define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')\r
32\r
33//\r
34// maximum number of pending packets, separately for each direction\r
35//\r
36#define VNET_MAX_PENDING 64\r
37\r
38//\r
39// State diagram:\r
40//\r
41// | ^\r
42// | |\r
43// BindingStart BindingStop\r
44// +SnpPopulate |\r
45// ++GetFeatures |\r
46// | |\r
47// v |\r
48// +---------+ virtio-net device is reset, no resources are\r
49// | stopped | allocated for traffic, but MAC address has\r
50// +---------+ been retrieved\r
51// | ^\r
52// | |\r
53// SNP.Start SNP.Stop\r
54// | |\r
55// v |\r
56// +---------+\r
57// | started | functionally identical to stopped\r
58// +---------+\r
59// | ^\r
60// | |\r
61// SNP.Initialize SNP.Shutdown\r
62// | |\r
63// v |\r
64// +-------------+ Virtio-net setup complete, including DRIVER_OK\r
65// | initialized | bit. The receive queue is populated with\r
66// +-------------+ requests; McastIpToMac, GetStatus, Transmit,\r
67// Receive are callable.\r
68//\r
69\r
70typedef struct {\r
71 //\r
72 // Parts of this structure are initialized / torn down in various functions\r
73 // at various call depths. The table to the right should make it easier to\r
74 // track them.\r
75 //\r
76 // field init function\r
77 // ------------------ ------------------------------\r
78 UINT32 Signature; // VirtioNetDriverBindingStart\r
56f65ed8 79 VIRTIO_DEVICE_PROTOCOL *VirtIo; // VirtioNetDriverBindingStart\r
201cac0d
LE
80 EFI_SIMPLE_NETWORK_PROTOCOL Snp; // VirtioNetSnpPopulate\r
81 EFI_SIMPLE_NETWORK_MODE Snm; // VirtioNetSnpPopulate\r
82 EFI_EVENT ExitBoot; // VirtioNetSnpPopulate\r
83 EFI_DEVICE_PATH_PROTOCOL *MacDevicePath; // VirtioNetDriverBindingStart\r
84 EFI_HANDLE MacHandle; // VirtioNetDriverBindingStart\r
85\r
86 VRING RxRing; // VirtioNetInitRing\r
940baec0
BS
87 VOID *RxRingMap; // VirtioRingMap and\r
88 // VirtioNetInitRing\r
201cac0d
LE
89 UINT8 *RxBuf; // VirtioNetInitRx\r
90 UINT16 RxLastUsed; // VirtioNetInitRx\r
46b11f00
BS
91 UINTN RxBufNrPages; // VirtioNetInitRx\r
92 EFI_PHYSICAL_ADDRESS RxBufDeviceBase; // VirtioNetInitRx\r
93 VOID *RxBufMap; // VirtioNetInitRx\r
201cac0d
LE
94\r
95 VRING TxRing; // VirtioNetInitRing\r
940baec0
BS
96 VOID *TxRingMap; // VirtioRingMap and\r
97 // VirtioNetInitRing\r
201cac0d
LE
98 UINT16 TxMaxPending; // VirtioNetInitTx\r
99 UINT16 TxCurPending; // VirtioNetInitTx\r
100 UINT16 *TxFreeStack; // VirtioNetInitTx\r
891f016c
BS
101 VIRTIO_1_0_NET_REQ *TxSharedReq; // VirtioNetInitTx\r
102 VOID *TxSharedReqMap; // VirtioNetInitTx\r
201cac0d 103 UINT16 TxLastUsed; // VirtioNetInitTx\r
bd114d9f 104 ORDERED_COLLECTION *TxBufCollection; // VirtioNetInitTx\r
201cac0d
LE
105} VNET_DEV;\r
106\r
107\r
108//\r
109// In order to avoid duplication of interface documentation, please find all\r
110// leading comments near the respective function / variable definitions (not\r
111// the declarations here), which is where your code editor of choice takes you\r
112// anyway when jumping to a function.\r
113//\r
114\r
115//\r
116// utility macros\r
117//\r
118#define VIRTIO_NET_FROM_SNP(SnpPointer) \\r
119 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)\r
120\r
ece77e40
OM
121#define VIRTIO_CFG_WRITE(Dev, Field, Value) ((Dev)->VirtIo->WriteDevice ( \\r
122 (Dev)->VirtIo, \\r
123 OFFSET_OF_VNET (Field), \\r
124 SIZE_OF_VNET (Field), \\r
125 (Value) \\r
201cac0d
LE
126 ))\r
127\r
ece77e40
OM
128#define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \\r
129 (Dev)->VirtIo, \\r
130 OFFSET_OF_VNET (Field), \\r
131 SIZE_OF_VNET (Field), \\r
132 sizeof *(Pointer), \\r
133 (Pointer) \\r
201cac0d
LE
134 ))\r
135\r
136//\r
137// component naming\r
138//\r
139extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName;\r
140extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2;\r
141\r
142//\r
143// driver binding\r
144//\r
145extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding;\r
146\r
147//\r
148// member functions implementing the Simple Network Protocol\r
149//\r
150EFI_STATUS\r
151EFIAPI\r
152VirtioNetStart (\r
153 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
154 );\r
155\r
156EFI_STATUS\r
157EFIAPI\r
158VirtioNetStop (\r
159 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
160 );\r
161\r
162EFI_STATUS\r
163EFIAPI\r
164VirtioNetInitialize (\r
165 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
166 IN UINTN ExtraRxBufferSize OPTIONAL,\r
167 IN UINTN ExtraTxBufferSize OPTIONAL\r
168 );\r
169\r
170EFI_STATUS\r
171EFIAPI\r
172VirtioNetReset (\r
173 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
174 IN BOOLEAN ExtendedVerification\r
175 );\r
176\r
177EFI_STATUS\r
178EFIAPI\r
179VirtioNetShutdown (\r
180 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
181 );\r
182\r
183EFI_STATUS\r
184EFIAPI\r
185VirtioNetReceiveFilters (\r
186 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
187 IN UINT32 Enable,\r
188 IN UINT32 Disable,\r
189 IN BOOLEAN ResetMCastFilter,\r
190 IN UINTN MCastFilterCnt OPTIONAL,\r
191 IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL\r
192 );\r
193\r
194EFI_STATUS\r
195EFIAPI\r
196VirtioNetStationAddress (\r
197 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
198 IN BOOLEAN Reset,\r
199 IN EFI_MAC_ADDRESS *New OPTIONAL\r
200 );\r
201\r
202EFI_STATUS\r
203EFIAPI\r
204VirtioNetStatistics (\r
205 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
206 IN BOOLEAN Reset,\r
207 IN OUT UINTN *StatisticsSize OPTIONAL,\r
208 OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL\r
209 );\r
210\r
211EFI_STATUS\r
212EFIAPI\r
213VirtioNetMcastIpToMac (\r
214 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
215 IN BOOLEAN IPv6,\r
216 IN EFI_IP_ADDRESS *Ip,\r
217 OUT EFI_MAC_ADDRESS *Mac\r
218 );\r
219\r
220EFI_STATUS\r
221EFIAPI\r
222VirtioNetNvData (\r
223 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
224 IN BOOLEAN ReadWrite,\r
225 IN UINTN Offset,\r
226 IN UINTN BufferSize,\r
227 IN OUT VOID *Buffer\r
228 );\r
229\r
230EFI_STATUS\r
231EFIAPI\r
232VirtioNetGetStatus (\r
233 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
234 OUT UINT32 *InterruptStatus OPTIONAL,\r
235 OUT VOID **TxBuf OPTIONAL\r
236 );\r
237\r
238EFI_STATUS\r
239EFIAPI\r
240VirtioNetTransmit (\r
241 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
242 IN UINTN HeaderSize,\r
243 IN UINTN BufferSize,\r
244 IN /* +OUT! */ VOID *Buffer,\r
245 IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
246 IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
247 IN UINT16 *Protocol OPTIONAL\r
248 );\r
249\r
250EFI_STATUS\r
251EFIAPI\r
252VirtioNetReceive (\r
253 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
254 OUT UINTN *HeaderSize OPTIONAL,\r
255 IN OUT UINTN *BufferSize,\r
256 OUT VOID *Buffer,\r
257 OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
258 OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
259 OUT UINT16 *Protocol OPTIONAL\r
260 );\r
261\r
262//\r
263// utility functions shared by various SNP member functions\r
264//\r
265VOID\r
266EFIAPI\r
267VirtioNetShutdownRx (\r
268 IN OUT VNET_DEV *Dev\r
269 );\r
270\r
271VOID\r
272EFIAPI\r
273VirtioNetShutdownTx (\r
274 IN OUT VNET_DEV *Dev\r
275 );\r
276\r
55dd5a67
BS
277VOID\r
278EFIAPI\r
279VirtioNetUninitRing (\r
280 IN OUT VNET_DEV *Dev,\r
940baec0
BS
281 IN OUT VRING *Ring,\r
282 IN VOID *RingMap\r
55dd5a67
BS
283 );\r
284\r
bd114d9f
BS
285//\r
286// utility functions to map caller-supplied Tx buffer system physical address\r
287// to a device address and vice versa\r
288//\r
289EFI_STATUS\r
290EFIAPI\r
291VirtioNetMapTxBuf (\r
292 IN VNET_DEV *Dev,\r
293 IN VOID *Buffer,\r
294 IN UINTN NumberOfBytes,\r
295 OUT EFI_PHYSICAL_ADDRESS *DeviceAddress\r
296 );\r
297\r
298EFI_STATUS\r
299EFIAPI\r
300VirtioNetUnmapTxBuf (\r
301 IN VNET_DEV *Dev,\r
302 OUT VOID **Buffer,\r
303 IN EFI_PHYSICAL_ADDRESS DeviceAddress\r
304 );\r
305\r
306INTN\r
307EFIAPI\r
308VirtioNetTxBufMapInfoCompare (\r
309 IN CONST VOID *UserStruct1,\r
310 IN CONST VOID *UserStruct2\r
311 );\r
312\r
313INTN\r
314EFIAPI\r
315VirtioNetTxBufDeviceAddressCompare (\r
316 IN CONST VOID *StandaloneKey,\r
317 IN CONST VOID *UserStruct\r
318 );\r
319\r
320\r
201cac0d
LE
321//\r
322// event callbacks\r
323//\r
324VOID\r
325EFIAPI\r
326VirtioNetIsPacketAvailable (\r
327 IN EFI_EVENT Event,\r
328 IN VOID *Context\r
329 );\r
330\r
331VOID\r
332EFIAPI\r
333VirtioNetExitBoot (\r
334 IN EFI_EVENT Event,\r
335 IN VOID *Context\r
336 );\r
337\r
338#endif // _VIRTIO_NET_DXE_H_\r