1 | /** @file
|
---|
2 | This library is only intended to be used by UEFI network stack modules.
|
---|
3 | It provides basic functions for the UEFI network stack.
|
---|
4 |
|
---|
5 | Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>
|
---|
6 | This program and the accompanying materials
|
---|
7 | are licensed and made available under the terms and conditions of the BSD License
|
---|
8 | which accompanies this distribution. The full text of the license may be found at<BR>
|
---|
9 | http://opensource.org/licenses/bsd-license.php
|
---|
10 |
|
---|
11 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
---|
12 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
---|
13 |
|
---|
14 | **/
|
---|
15 |
|
---|
16 | #ifndef _NET_LIB_H_
|
---|
17 | #define _NET_LIB_H_
|
---|
18 |
|
---|
19 | #include <Protocol/Ip6.h>
|
---|
20 |
|
---|
21 | #include <Library/BaseLib.h>
|
---|
22 | #include <Library/BaseMemoryLib.h>
|
---|
23 |
|
---|
24 | typedef UINT32 IP4_ADDR;
|
---|
25 | typedef UINT32 TCP_SEQNO;
|
---|
26 | typedef UINT16 TCP_PORTNO;
|
---|
27 |
|
---|
28 |
|
---|
29 | #define NET_ETHER_ADDR_LEN 6
|
---|
30 | #define NET_IFTYPE_ETHERNET 0x01
|
---|
31 |
|
---|
32 | #define NET_VLAN_TAG_LEN 4
|
---|
33 | #define ETHER_TYPE_VLAN 0x8100
|
---|
34 |
|
---|
35 | #define EFI_IP_PROTO_UDP 0x11
|
---|
36 | #define EFI_IP_PROTO_TCP 0x06
|
---|
37 | #define EFI_IP_PROTO_ICMP 0x01
|
---|
38 | #define IP4_PROTO_IGMP 0x02
|
---|
39 | #define IP6_ICMP 58
|
---|
40 |
|
---|
41 | //
|
---|
42 | // The address classification
|
---|
43 | //
|
---|
44 | #define IP4_ADDR_CLASSA 1
|
---|
45 | #define IP4_ADDR_CLASSB 2
|
---|
46 | #define IP4_ADDR_CLASSC 3
|
---|
47 | #define IP4_ADDR_CLASSD 4
|
---|
48 | #define IP4_ADDR_CLASSE 5
|
---|
49 |
|
---|
50 | #define IP4_MASK_NUM 33
|
---|
51 | #define IP6_PREFIX_NUM 129
|
---|
52 |
|
---|
53 | #define IP6_HOP_BY_HOP 0
|
---|
54 | #define IP6_DESTINATION 60
|
---|
55 | #define IP6_ROUTING 43
|
---|
56 | #define IP6_FRAGMENT 44
|
---|
57 | #define IP6_AH 51
|
---|
58 | #define IP6_ESP 50
|
---|
59 | #define IP6_NO_NEXT_HEADER 59
|
---|
60 |
|
---|
61 | #define IP_VERSION_4 4
|
---|
62 | #define IP_VERSION_6 6
|
---|
63 |
|
---|
64 | #define IP6_PREFIX_LENGTH 64
|
---|
65 |
|
---|
66 | #pragma pack(1)
|
---|
67 |
|
---|
68 | //
|
---|
69 | // Ethernet head definition
|
---|
70 | //
|
---|
71 | typedef struct {
|
---|
72 | UINT8 DstMac [NET_ETHER_ADDR_LEN];
|
---|
73 | UINT8 SrcMac [NET_ETHER_ADDR_LEN];
|
---|
74 | UINT16 EtherType;
|
---|
75 | } ETHER_HEAD;
|
---|
76 |
|
---|
77 | //
|
---|
78 | // 802.1Q VLAN Tag Control Information
|
---|
79 | //
|
---|
80 | typedef union {
|
---|
81 | struct {
|
---|
82 | UINT16 Vid : 12; // Unique VLAN identifier (0 to 4094)
|
---|
83 | UINT16 Cfi : 1; // Canonical Format Indicator
|
---|
84 | UINT16 Priority : 3; // 802.1Q priority level (0 to 7)
|
---|
85 | } Bits;
|
---|
86 | UINT16 Uint16;
|
---|
87 | } VLAN_TCI;
|
---|
88 |
|
---|
89 | #define VLAN_TCI_CFI_CANONICAL_MAC 0
|
---|
90 | #define VLAN_TCI_CFI_NON_CANONICAL_MAC 1
|
---|
91 |
|
---|
92 | //
|
---|
93 | // The EFI_IP4_HEADER is hard to use because the source and
|
---|
94 | // destination address are defined as EFI_IPv4_ADDRESS, which
|
---|
95 | // is a structure. Two structures can't be compared or masked
|
---|
96 | // directly. This is why there is an internal representation.
|
---|
97 | //
|
---|
98 | typedef struct {
|
---|
99 | UINT8 HeadLen : 4;
|
---|
100 | UINT8 Ver : 4;
|
---|
101 | UINT8 Tos;
|
---|
102 | UINT16 TotalLen;
|
---|
103 | UINT16 Id;
|
---|
104 | UINT16 Fragment;
|
---|
105 | UINT8 Ttl;
|
---|
106 | UINT8 Protocol;
|
---|
107 | UINT16 Checksum;
|
---|
108 | IP4_ADDR Src;
|
---|
109 | IP4_ADDR Dst;
|
---|
110 | } IP4_HEAD;
|
---|
111 |
|
---|
112 |
|
---|
113 | //
|
---|
114 | // ICMP head definition. Each ICMP message is categorized as either an error
|
---|
115 | // message or query message. Two message types have their own head format.
|
---|
116 | //
|
---|
117 | typedef struct {
|
---|
118 | UINT8 Type;
|
---|
119 | UINT8 Code;
|
---|
120 | UINT16 Checksum;
|
---|
121 | } IP4_ICMP_HEAD;
|
---|
122 |
|
---|
123 | typedef struct {
|
---|
124 | IP4_ICMP_HEAD Head;
|
---|
125 | UINT32 Fourth; // 4th filed of the head, it depends on Type.
|
---|
126 | IP4_HEAD IpHead;
|
---|
127 | } IP4_ICMP_ERROR_HEAD;
|
---|
128 |
|
---|
129 | typedef struct {
|
---|
130 | IP4_ICMP_HEAD Head;
|
---|
131 | UINT16 Id;
|
---|
132 | UINT16 Seq;
|
---|
133 | } IP4_ICMP_QUERY_HEAD;
|
---|
134 |
|
---|
135 | typedef struct {
|
---|
136 | UINT8 Type;
|
---|
137 | UINT8 Code;
|
---|
138 | UINT16 Checksum;
|
---|
139 | } IP6_ICMP_HEAD;
|
---|
140 |
|
---|
141 | typedef struct {
|
---|
142 | IP6_ICMP_HEAD Head;
|
---|
143 | UINT32 Fourth;
|
---|
144 | EFI_IP6_HEADER IpHead;
|
---|
145 | } IP6_ICMP_ERROR_HEAD;
|
---|
146 |
|
---|
147 | typedef struct {
|
---|
148 | IP6_ICMP_HEAD Head;
|
---|
149 | UINT32 Fourth;
|
---|
150 | } IP6_ICMP_INFORMATION_HEAD;
|
---|
151 |
|
---|
152 | //
|
---|
153 | // UDP header definition
|
---|
154 | //
|
---|
155 | typedef struct {
|
---|
156 | UINT16 SrcPort;
|
---|
157 | UINT16 DstPort;
|
---|
158 | UINT16 Length;
|
---|
159 | UINT16 Checksum;
|
---|
160 | } EFI_UDP_HEADER;
|
---|
161 |
|
---|
162 | //
|
---|
163 | // TCP header definition
|
---|
164 | //
|
---|
165 | typedef struct {
|
---|
166 | TCP_PORTNO SrcPort;
|
---|
167 | TCP_PORTNO DstPort;
|
---|
168 | TCP_SEQNO Seq;
|
---|
169 | TCP_SEQNO Ack;
|
---|
170 | UINT8 Res : 4;
|
---|
171 | UINT8 HeadLen : 4;
|
---|
172 | UINT8 Flag;
|
---|
173 | UINT16 Wnd;
|
---|
174 | UINT16 Checksum;
|
---|
175 | UINT16 Urg;
|
---|
176 | } TCP_HEAD;
|
---|
177 |
|
---|
178 | #pragma pack()
|
---|
179 |
|
---|
180 | #define NET_MAC_EQUAL(pMac1, pMac2, Len) \
|
---|
181 | (CompareMem ((pMac1), (pMac2), Len) == 0)
|
---|
182 |
|
---|
183 | #define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \
|
---|
184 | (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))
|
---|
185 |
|
---|
186 | #define NTOHL(x) SwapBytes32 (x)
|
---|
187 |
|
---|
188 | #define HTONL(x) NTOHL(x)
|
---|
189 |
|
---|
190 | #define NTOHS(x) SwapBytes16 (x)
|
---|
191 |
|
---|
192 | #define HTONS(x) NTOHS(x)
|
---|
193 | #define NTOHLL(x) SwapBytes64 (x)
|
---|
194 | #define HTONLL(x) NTOHLL(x)
|
---|
195 | #define NTOHLLL(x) Ip6Swap128 (x)
|
---|
196 | #define HTONLLL(x) NTOHLLL(x)
|
---|
197 |
|
---|
198 | //
|
---|
199 | // Test the IP's attribute, All the IPs are in host byte order.
|
---|
200 | //
|
---|
201 | #define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)
|
---|
202 | #define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)
|
---|
203 | #define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))
|
---|
204 | #define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != IP4_MASK_NUM)
|
---|
205 |
|
---|
206 | #define IP6_IS_MULTICAST(Ip6) (((Ip6)->Addr[0]) == 0xFF)
|
---|
207 |
|
---|
208 | //
|
---|
209 | // Convert the EFI_IP4_ADDRESS to plain UINT32 IP4 address.
|
---|
210 | //
|
---|
211 | #define EFI_IP4(EfiIpAddr) (*(IP4_ADDR *) ((EfiIpAddr).Addr))
|
---|
212 | #define EFI_NTOHL(EfiIp) (NTOHL (EFI_IP4 ((EfiIp))))
|
---|
213 | #define EFI_IP4_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)
|
---|
214 |
|
---|
215 | #define EFI_IP6_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv6_ADDRESS)) == 0)
|
---|
216 |
|
---|
217 | #define IP4_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv4_ADDRESS)))
|
---|
218 | #define IP6_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv6_ADDRESS)))
|
---|
219 | #define IP6_COPY_LINK_ADDRESS(Mac1, Mac2) (CopyMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS)))
|
---|
220 |
|
---|
221 | //
|
---|
222 | // The debug level definition. This value is also used as the
|
---|
223 | // syslog's servity level. Don't change it.
|
---|
224 | //
|
---|
225 | #define NETDEBUG_LEVEL_TRACE 5
|
---|
226 | #define NETDEBUG_LEVEL_WARNING 4
|
---|
227 | #define NETDEBUG_LEVEL_ERROR 3
|
---|
228 |
|
---|
229 | //
|
---|
230 | // Network debug message is sent out as syslog packet.
|
---|
231 | //
|
---|
232 | #define NET_SYSLOG_FACILITY 16 // Syslog local facility local use
|
---|
233 | #define NET_SYSLOG_PACKET_LEN 512
|
---|
234 | #define NET_SYSLOG_TX_TIMEOUT (500 * 1000 * 10) // 500ms
|
---|
235 | #define NET_DEBUG_MSG_LEN 470 // 512 - (ether+ip4+udp4 head length)
|
---|
236 |
|
---|
237 | //
|
---|
238 | // The debug output expects the ASCII format string, Use %a to print ASCII
|
---|
239 | // string, and %s to print UNICODE string. PrintArg must be enclosed in ().
|
---|
240 | // For example: NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name));
|
---|
241 | //
|
---|
242 | #define NET_DEBUG_TRACE(Module, PrintArg) \
|
---|
243 | NetDebugOutput ( \
|
---|
244 | NETDEBUG_LEVEL_TRACE, \
|
---|
245 | Module, \
|
---|
246 | __FILE__, \
|
---|
247 | __LINE__, \
|
---|
248 | NetDebugASPrint PrintArg \
|
---|
249 | )
|
---|
250 |
|
---|
251 | #define NET_DEBUG_WARNING(Module, PrintArg) \
|
---|
252 | NetDebugOutput ( \
|
---|
253 | NETDEBUG_LEVEL_WARNING, \
|
---|
254 | Module, \
|
---|
255 | __FILE__, \
|
---|
256 | __LINE__, \
|
---|
257 | NetDebugASPrint PrintArg \
|
---|
258 | )
|
---|
259 |
|
---|
260 | #define NET_DEBUG_ERROR(Module, PrintArg) \
|
---|
261 | NetDebugOutput ( \
|
---|
262 | NETDEBUG_LEVEL_ERROR, \
|
---|
263 | Module, \
|
---|
264 | __FILE__, \
|
---|
265 | __LINE__, \
|
---|
266 | NetDebugASPrint PrintArg \
|
---|
267 | )
|
---|
268 |
|
---|
269 | /**
|
---|
270 | Allocate a buffer, then format the message to it. This is a
|
---|
271 | help function for the NET_DEBUG_XXX macros. The PrintArg of
|
---|
272 | these macros treats the variable length print parameters as a
|
---|
273 | single parameter, and pass it to the NetDebugASPrint. For
|
---|
274 | example, NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name))
|
---|
275 | if extracted to:
|
---|
276 |
|
---|
277 | NetDebugOutput (
|
---|
278 | NETDEBUG_LEVEL_TRACE,
|
---|
279 | "Tcp",
|
---|
280 | __FILE__,
|
---|
281 | __LINE__,
|
---|
282 | NetDebugASPrint ("State transit to %a\n", Name)
|
---|
283 | )
|
---|
284 |
|
---|
285 | @param Format The ASCII format string.
|
---|
286 | @param ... The variable length parameter whose format is determined
|
---|
287 | by the Format string.
|
---|
288 |
|
---|
289 | @return The buffer containing the formatted message,
|
---|
290 | or NULL if memory allocation failed.
|
---|
291 |
|
---|
292 | **/
|
---|
293 | CHAR8 *
|
---|
294 | EFIAPI
|
---|
295 | NetDebugASPrint (
|
---|
296 | IN CHAR8 *Format,
|
---|
297 | ...
|
---|
298 | );
|
---|
299 |
|
---|
300 | /**
|
---|
301 | Builds an UDP4 syslog packet and send it using SNP.
|
---|
302 |
|
---|
303 | This function will locate a instance of SNP then send the message through it.
|
---|
304 | Because it isn't open the SNP BY_DRIVER, apply caution when using it.
|
---|
305 |
|
---|
306 | @param Level The servity level of the message.
|
---|
307 | @param Module The Moudle that generates the log.
|
---|
308 | @param File The file that contains the log.
|
---|
309 | @param Line The exact line that contains the log.
|
---|
310 | @param Message The user message to log.
|
---|
311 |
|
---|
312 | @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
|
---|
313 | @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the packet
|
---|
314 | @retval EFI_SUCCESS The log is discard because that it is more verbose
|
---|
315 | than the mNetDebugLevelMax. Or, it has been sent out.
|
---|
316 | **/
|
---|
317 | EFI_STATUS
|
---|
318 | EFIAPI
|
---|
319 | NetDebugOutput (
|
---|
320 | IN UINT32 Level,
|
---|
321 | IN UINT8 *Module,
|
---|
322 | IN UINT8 *File,
|
---|
323 | IN UINT32 Line,
|
---|
324 | IN UINT8 *Message
|
---|
325 | );
|
---|
326 |
|
---|
327 |
|
---|
328 | /**
|
---|
329 | Return the length of the mask.
|
---|
330 |
|
---|
331 | Return the length of the mask. Valid values are 0 to 32.
|
---|
332 | If the mask is invalid, return the invalid length 33, which is IP4_MASK_NUM.
|
---|
333 | NetMask is in the host byte order.
|
---|
334 |
|
---|
335 | @param[in] NetMask The netmask to get the length from.
|
---|
336 |
|
---|
337 | @return The length of the netmask, or IP4_MASK_NUM (33) if the mask is invalid.
|
---|
338 |
|
---|
339 | **/
|
---|
340 | INTN
|
---|
341 | EFIAPI
|
---|
342 | NetGetMaskLength (
|
---|
343 | IN IP4_ADDR NetMask
|
---|
344 | );
|
---|
345 |
|
---|
346 | /**
|
---|
347 | Return the class of the IP address, such as class A, B, C.
|
---|
348 | Addr is in host byte order.
|
---|
349 |
|
---|
350 | The address of class A starts with 0.
|
---|
351 | If the address belong to class A, return IP4_ADDR_CLASSA.
|
---|
352 | The address of class B starts with 10.
|
---|
353 | If the address belong to class B, return IP4_ADDR_CLASSB.
|
---|
354 | The address of class C starts with 110.
|
---|
355 | If the address belong to class C, return IP4_ADDR_CLASSC.
|
---|
356 | The address of class D starts with 1110.
|
---|
357 | If the address belong to class D, return IP4_ADDR_CLASSD.
|
---|
358 | The address of class E starts with 1111.
|
---|
359 | If the address belong to class E, return IP4_ADDR_CLASSE.
|
---|
360 |
|
---|
361 |
|
---|
362 | @param[in] Addr The address to get the class from.
|
---|
363 |
|
---|
364 | @return IP address class, such as IP4_ADDR_CLASSA.
|
---|
365 |
|
---|
366 | **/
|
---|
367 | INTN
|
---|
368 | EFIAPI
|
---|
369 | NetGetIpClass (
|
---|
370 | IN IP4_ADDR Addr
|
---|
371 | );
|
---|
372 |
|
---|
373 | /**
|
---|
374 | Check whether the IP is a valid unicast address according to
|
---|
375 | the netmask. If NetMask is zero, use the IP address's class to get the default mask.
|
---|
376 |
|
---|
377 | If Ip is 0, IP is not a valid unicast address.
|
---|
378 | Class D address is used for multicasting and class E address is reserved for future. If Ip
|
---|
379 | belongs to class D or class E, Ip is not a valid unicast address.
|
---|
380 | If all bits of the host address of Ip are 0 or 1, Ip is not a valid unicast address.
|
---|
381 |
|
---|
382 | @param[in] Ip The IP to check against.
|
---|
383 | @param[in] NetMask The mask of the IP.
|
---|
384 |
|
---|
385 | @return TRUE if Ip is a valid unicast address on the network, otherwise FALSE.
|
---|
386 |
|
---|
387 | **/
|
---|
388 | BOOLEAN
|
---|
389 | EFIAPI
|
---|
390 | NetIp4IsUnicast (
|
---|
391 | IN IP4_ADDR Ip,
|
---|
392 | IN IP4_ADDR NetMask
|
---|
393 | );
|
---|
394 |
|
---|
395 | /**
|
---|
396 | Check whether the incoming IPv6 address is a valid unicast address.
|
---|
397 |
|
---|
398 | If the address is a multicast address has binary 0xFF at the start, it is not
|
---|
399 | a valid unicast address. If the address is unspecified ::, it is not a valid
|
---|
400 | unicast address to be assigned to any node. If the address is loopback address
|
---|
401 | ::1, it is also not a valid unicast address to be assigned to any physical
|
---|
402 | interface.
|
---|
403 |
|
---|
404 | @param[in] Ip6 The IPv6 address to check against.
|
---|
405 |
|
---|
406 | @return TRUE if Ip6 is a valid unicast address on the network, otherwise FALSE.
|
---|
407 |
|
---|
408 | **/
|
---|
409 | BOOLEAN
|
---|
410 | EFIAPI
|
---|
411 | NetIp6IsValidUnicast (
|
---|
412 | IN EFI_IPv6_ADDRESS *Ip6
|
---|
413 | );
|
---|
414 |
|
---|
415 |
|
---|
416 | /**
|
---|
417 | Check whether the incoming Ipv6 address is the unspecified address or not.
|
---|
418 |
|
---|
419 | @param[in] Ip6 - Ip6 address, in network order.
|
---|
420 |
|
---|
421 | @retval TRUE - Yes, incoming Ipv6 address is the unspecified address.
|
---|
422 | @retval FALSE - The incoming Ipv6 address is not the unspecified address
|
---|
423 |
|
---|
424 | **/
|
---|
425 | BOOLEAN
|
---|
426 | EFIAPI
|
---|
427 | NetIp6IsUnspecifiedAddr (
|
---|
428 | IN EFI_IPv6_ADDRESS *Ip6
|
---|
429 | );
|
---|
430 |
|
---|
431 | /**
|
---|
432 | Check whether the incoming Ipv6 address is a link-local address.
|
---|
433 |
|
---|
434 | @param[in] Ip6 - Ip6 address, in network order.
|
---|
435 |
|
---|
436 | @retval TRUE - The incoming Ipv6 address is a link-local address.
|
---|
437 | @retval FALSE - The incoming Ipv6 address is not a link-local address.
|
---|
438 |
|
---|
439 | **/
|
---|
440 | BOOLEAN
|
---|
441 | EFIAPI
|
---|
442 | NetIp6IsLinkLocalAddr (
|
---|
443 | IN EFI_IPv6_ADDRESS *Ip6
|
---|
444 | );
|
---|
445 |
|
---|
446 | /**
|
---|
447 | Check whether the Ipv6 address1 and address2 are on the connected network.
|
---|
448 |
|
---|
449 | @param[in] Ip1 - Ip6 address1, in network order.
|
---|
450 | @param[in] Ip2 - Ip6 address2, in network order.
|
---|
451 | @param[in] PrefixLength - The prefix length of the checking net.
|
---|
452 |
|
---|
453 | @retval TRUE - Yes, the Ipv6 address1 and address2 are connected.
|
---|
454 | @retval FALSE - No the Ipv6 address1 and address2 are not connected.
|
---|
455 |
|
---|
456 | **/
|
---|
457 | BOOLEAN
|
---|
458 | EFIAPI
|
---|
459 | NetIp6IsNetEqual (
|
---|
460 | EFI_IPv6_ADDRESS *Ip1,
|
---|
461 | EFI_IPv6_ADDRESS *Ip2,
|
---|
462 | UINT8 PrefixLength
|
---|
463 | );
|
---|
464 |
|
---|
465 | /**
|
---|
466 | Switches the endianess of an IPv6 address.
|
---|
467 |
|
---|
468 | This function swaps the bytes in a 128-bit IPv6 address to switch the value
|
---|
469 | from little endian to big endian or vice versa. The byte swapped value is
|
---|
470 | returned.
|
---|
471 |
|
---|
472 | @param Ip6 Points to an IPv6 address.
|
---|
473 |
|
---|
474 | @return The byte swapped IPv6 address.
|
---|
475 |
|
---|
476 | **/
|
---|
477 | EFI_IPv6_ADDRESS *
|
---|
478 | EFIAPI
|
---|
479 | Ip6Swap128 (
|
---|
480 | EFI_IPv6_ADDRESS *Ip6
|
---|
481 | );
|
---|
482 |
|
---|
483 | extern IP4_ADDR gIp4AllMasks[IP4_MASK_NUM];
|
---|
484 |
|
---|
485 |
|
---|
486 | extern EFI_IPv4_ADDRESS mZeroIp4Addr;
|
---|
487 |
|
---|
488 | #define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9'))
|
---|
489 | #define NET_ROUNDUP(size, unit) (((size) + (unit) - 1) & (~((unit) - 1)))
|
---|
490 | #define NET_IS_LOWER_CASE_CHAR(Ch) (('a' <= (Ch)) && ((Ch) <= 'z'))
|
---|
491 | #define NET_IS_UPPER_CASE_CHAR(Ch) (('A' <= (Ch)) && ((Ch) <= 'Z'))
|
---|
492 |
|
---|
493 | #define TICKS_PER_MS 10000U
|
---|
494 | #define TICKS_PER_SECOND 10000000U
|
---|
495 |
|
---|
496 | #define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
|
---|
497 |
|
---|
498 | /**
|
---|
499 | Extract a UINT32 from a byte stream.
|
---|
500 |
|
---|
501 | This function copies a UINT32 from a byte stream, and then converts it from Network
|
---|
502 | byte order to host byte order. Use this function to avoid alignment error.
|
---|
503 |
|
---|
504 | @param[in] Buf The buffer to extract the UINT32.
|
---|
505 |
|
---|
506 | @return The UINT32 extracted.
|
---|
507 |
|
---|
508 | **/
|
---|
509 | UINT32
|
---|
510 | EFIAPI
|
---|
511 | NetGetUint32 (
|
---|
512 | IN UINT8 *Buf
|
---|
513 | );
|
---|
514 |
|
---|
515 | /**
|
---|
516 | Puts a UINT32 into the byte stream in network byte order.
|
---|
517 |
|
---|
518 | Converts a UINT32 from host byte order to network byte order, then copies it to the
|
---|
519 | byte stream.
|
---|
520 |
|
---|
521 | @param[in, out] Buf The buffer in which to put the UINT32.
|
---|
522 | @param[in] Data The data to be converted and put into the byte stream.
|
---|
523 |
|
---|
524 | **/
|
---|
525 | VOID
|
---|
526 | EFIAPI
|
---|
527 | NetPutUint32 (
|
---|
528 | IN OUT UINT8 *Buf,
|
---|
529 | IN UINT32 Data
|
---|
530 | );
|
---|
531 |
|
---|
532 | /**
|
---|
533 | Initialize a random seed using current time.
|
---|
534 |
|
---|
535 | Get current time first. Then initialize a random seed based on some basic
|
---|
536 | mathematical operations on the hour, day, minute, second, nanosecond and year
|
---|
537 | of the current time.
|
---|
538 |
|
---|
539 | @return The random seed, initialized with current time.
|
---|
540 |
|
---|
541 | **/
|
---|
542 | UINT32
|
---|
543 | EFIAPI
|
---|
544 | NetRandomInitSeed (
|
---|
545 | VOID
|
---|
546 | );
|
---|
547 |
|
---|
548 |
|
---|
549 | #define NET_LIST_USER_STRUCT(Entry, Type, Field) \
|
---|
550 | BASE_CR(Entry, Type, Field)
|
---|
551 |
|
---|
552 | #define NET_LIST_USER_STRUCT_S(Entry, Type, Field, Sig) \
|
---|
553 | CR(Entry, Type, Field, Sig)
|
---|
554 |
|
---|
555 | //
|
---|
556 | // Iterate through the double linked list. It is NOT delete safe
|
---|
557 | //
|
---|
558 | #define NET_LIST_FOR_EACH(Entry, ListHead) \
|
---|
559 | for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
|
---|
560 |
|
---|
561 | //
|
---|
562 | // Iterate through the double linked list. This is delete-safe.
|
---|
563 | // Don't touch NextEntry. Also, don't use this macro if list
|
---|
564 | // entries other than the Entry may be deleted when processing
|
---|
565 | // the current Entry.
|
---|
566 | //
|
---|
567 | #define NET_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
|
---|
568 | for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink; \
|
---|
569 | Entry != (ListHead); \
|
---|
570 | Entry = NextEntry, NextEntry = Entry->ForwardLink \
|
---|
571 | )
|
---|
572 |
|
---|
573 | //
|
---|
574 | // Make sure the list isn't empty before getting the first/last record.
|
---|
575 | //
|
---|
576 | #define NET_LIST_HEAD(ListHead, Type, Field) \
|
---|
577 | NET_LIST_USER_STRUCT((ListHead)->ForwardLink, Type, Field)
|
---|
578 |
|
---|
579 | #define NET_LIST_TAIL(ListHead, Type, Field) \
|
---|
580 | NET_LIST_USER_STRUCT((ListHead)->BackLink, Type, Field)
|
---|
581 |
|
---|
582 |
|
---|
583 | /**
|
---|
584 | Remove the first node entry on the list, and return the removed node entry.
|
---|
585 |
|
---|
586 | Removes the first node entry from a doubly linked list. It is up to the caller of
|
---|
587 | this function to release the memory used by the first node, if that is required. On
|
---|
588 | exit, the removed node is returned.
|
---|
589 |
|
---|
590 | If Head is NULL, then ASSERT().
|
---|
591 | If Head was not initialized, then ASSERT().
|
---|
592 | If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
|
---|
593 | linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,
|
---|
594 | then ASSERT().
|
---|
595 |
|
---|
596 | @param[in, out] Head The list header.
|
---|
597 |
|
---|
598 | @return The first node entry that is removed from the list, NULL if the list is empty.
|
---|
599 |
|
---|
600 | **/
|
---|
601 | LIST_ENTRY *
|
---|
602 | EFIAPI
|
---|
603 | NetListRemoveHead (
|
---|
604 | IN OUT LIST_ENTRY *Head
|
---|
605 | );
|
---|
606 |
|
---|
607 | /**
|
---|
608 | Remove the last node entry on the list and return the removed node entry.
|
---|
609 |
|
---|
610 | Removes the last node entry from a doubly linked list. It is up to the caller of
|
---|
611 | this function to release the memory used by the first node, if that is required. On
|
---|
612 | exit, the removed node is returned.
|
---|
613 |
|
---|
614 | If Head is NULL, then ASSERT().
|
---|
615 | If Head was not initialized, then ASSERT().
|
---|
616 | If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
|
---|
617 | linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,
|
---|
618 | then ASSERT().
|
---|
619 |
|
---|
620 | @param[in, out] Head The list head.
|
---|
621 |
|
---|
622 | @return The last node entry that is removed from the list, NULL if the list is empty.
|
---|
623 |
|
---|
624 | **/
|
---|
625 | LIST_ENTRY *
|
---|
626 | EFIAPI
|
---|
627 | NetListRemoveTail (
|
---|
628 | IN OUT LIST_ENTRY *Head
|
---|
629 | );
|
---|
630 |
|
---|
631 | /**
|
---|
632 | Insert a new node entry after a designated node entry of a doubly linked list.
|
---|
633 |
|
---|
634 | Inserts a new node entry designated by NewEntry after the node entry designated by PrevEntry
|
---|
635 | of the doubly linked list.
|
---|
636 |
|
---|
637 | @param[in, out] PrevEntry The entry after which to insert.
|
---|
638 | @param[in, out] NewEntry The new entry to insert.
|
---|
639 |
|
---|
640 | **/
|
---|
641 | VOID
|
---|
642 | EFIAPI
|
---|
643 | NetListInsertAfter (
|
---|
644 | IN OUT LIST_ENTRY *PrevEntry,
|
---|
645 | IN OUT LIST_ENTRY *NewEntry
|
---|
646 | );
|
---|
647 |
|
---|
648 | /**
|
---|
649 | Insert a new node entry before a designated node entry of a doubly linked list.
|
---|
650 |
|
---|
651 | Inserts a new node entry designated by NewEntry before the node entry designated by PostEntry
|
---|
652 | of the doubly linked list.
|
---|
653 |
|
---|
654 | @param[in, out] PostEntry The entry to insert before.
|
---|
655 | @param[in, out] NewEntry The new entry to insert.
|
---|
656 |
|
---|
657 | **/
|
---|
658 | VOID
|
---|
659 | EFIAPI
|
---|
660 | NetListInsertBefore (
|
---|
661 | IN OUT LIST_ENTRY *PostEntry,
|
---|
662 | IN OUT LIST_ENTRY *NewEntry
|
---|
663 | );
|
---|
664 |
|
---|
665 | /**
|
---|
666 | Callback function which provided by user to remove one node in NetDestroyLinkList process.
|
---|
667 |
|
---|
668 | @param[in] Entry The entry to be removed.
|
---|
669 | @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList.
|
---|
670 |
|
---|
671 | @retval EFI_SUCCESS The entry has been removed successfully.
|
---|
672 | @retval Others Fail to remove the entry.
|
---|
673 |
|
---|
674 | **/
|
---|
675 | typedef
|
---|
676 | EFI_STATUS
|
---|
677 | (EFIAPI *NET_DESTROY_LINK_LIST_CALLBACK) (
|
---|
678 | IN LIST_ENTRY *Entry,
|
---|
679 | IN VOID *Context OPTIONAL
|
---|
680 | );
|
---|
681 |
|
---|
682 | /**
|
---|
683 | Safe destroy nodes in a linked list, and return the length of the list after all possible operations finished.
|
---|
684 |
|
---|
685 | Destroy network children list by list traversals is not safe due to graph dependencies between nodes.
|
---|
686 | This function performs a safe traversal to destroy these nodes by checking to see if the node being destroyed
|
---|
687 | has been removed from the list or not.
|
---|
688 | If it has been removed, then restart the traversal from the head.
|
---|
689 | If it hasn't been removed, then continue with the next node directly.
|
---|
690 | This function will end the iterate and return the CallBack's last return value if error happens,
|
---|
691 | or retrun EFI_SUCCESS if 2 complete passes are made with no changes in the number of children in the list.
|
---|
692 |
|
---|
693 | @param[in] List The head of the list.
|
---|
694 | @param[in] CallBack Pointer to the callback function to destroy one node in the list.
|
---|
695 | @param[in] Context Pointer to the callback function's context: corresponds to the
|
---|
696 | parameter Context in NET_DESTROY_LINK_LIST_CALLBACK.
|
---|
697 | @param[out] ListLength The length of the link list if the function returns successfully.
|
---|
698 |
|
---|
699 | @retval EFI_SUCCESS Two complete passes are made with no changes in the number of children.
|
---|
700 | @retval EFI_INVALID_PARAMETER The input parameter is invalid.
|
---|
701 | @retval Others Return the CallBack's last return value.
|
---|
702 |
|
---|
703 | **/
|
---|
704 | EFI_STATUS
|
---|
705 | EFIAPI
|
---|
706 | NetDestroyLinkList (
|
---|
707 | IN LIST_ENTRY *List,
|
---|
708 | IN NET_DESTROY_LINK_LIST_CALLBACK CallBack,
|
---|
709 | IN VOID *Context, OPTIONAL
|
---|
710 | OUT UINTN *ListLength OPTIONAL
|
---|
711 | );
|
---|
712 |
|
---|
713 | /**
|
---|
714 | This function checks the input Handle to see if it's one of these handles in ChildHandleBuffer.
|
---|
715 |
|
---|
716 | @param[in] Handle Handle to be checked.
|
---|
717 | @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer.
|
---|
718 | @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
|
---|
719 | if NumberOfChildren is 0.
|
---|
720 |
|
---|
721 | @retval TURE Found the input Handle in ChildHandleBuffer.
|
---|
722 | @retval FALSE Can't find the input Handle in ChildHandleBuffer.
|
---|
723 |
|
---|
724 | **/
|
---|
725 | BOOLEAN
|
---|
726 | EFIAPI
|
---|
727 | NetIsInHandleBuffer (
|
---|
728 | IN EFI_HANDLE Handle,
|
---|
729 | IN UINTN NumberOfChildren,
|
---|
730 | IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
---|
731 | );
|
---|
732 |
|
---|
733 | //
|
---|
734 | // Object container: EFI network stack spec defines various kinds of
|
---|
735 | // tokens. The drivers can share code to manage those objects.
|
---|
736 | //
|
---|
737 | typedef struct {
|
---|
738 | LIST_ENTRY Link;
|
---|
739 | VOID *Key;
|
---|
740 | VOID *Value;
|
---|
741 | } NET_MAP_ITEM;
|
---|
742 |
|
---|
743 | typedef struct {
|
---|
744 | LIST_ENTRY Used;
|
---|
745 | LIST_ENTRY Recycled;
|
---|
746 | UINTN Count;
|
---|
747 | } NET_MAP;
|
---|
748 |
|
---|
749 | #define NET_MAP_INCREAMENT 64
|
---|
750 |
|
---|
751 | /**
|
---|
752 | Initialize the netmap. Netmap is a reposity to keep the <Key, Value> pairs.
|
---|
753 |
|
---|
754 | Initialize the forward and backward links of two head nodes donated by Map->Used
|
---|
755 | and Map->Recycled of two doubly linked lists.
|
---|
756 | Initializes the count of the <Key, Value> pairs in the netmap to zero.
|
---|
757 |
|
---|
758 | If Map is NULL, then ASSERT().
|
---|
759 | If the address of Map->Used is NULL, then ASSERT().
|
---|
760 | If the address of Map->Recycled is NULl, then ASSERT().
|
---|
761 |
|
---|
762 | @param[in, out] Map The netmap to initialize.
|
---|
763 |
|
---|
764 | **/
|
---|
765 | VOID
|
---|
766 | EFIAPI
|
---|
767 | NetMapInit (
|
---|
768 | IN OUT NET_MAP *Map
|
---|
769 | );
|
---|
770 |
|
---|
771 | /**
|
---|
772 | To clean up the netmap, that is, release allocated memories.
|
---|
773 |
|
---|
774 | Removes all nodes of the Used doubly linked list and frees memory of all related netmap items.
|
---|
775 | Removes all nodes of the Recycled doubly linked list and free memory of all related netmap items.
|
---|
776 | The number of the <Key, Value> pairs in the netmap is set to zero.
|
---|
777 |
|
---|
778 | If Map is NULL, then ASSERT().
|
---|
779 |
|
---|
780 | @param[in, out] Map The netmap to clean up.
|
---|
781 |
|
---|
782 | **/
|
---|
783 | VOID
|
---|
784 | EFIAPI
|
---|
785 | NetMapClean (
|
---|
786 | IN OUT NET_MAP *Map
|
---|
787 | );
|
---|
788 |
|
---|
789 | /**
|
---|
790 | Test whether the netmap is empty and return true if it is.
|
---|
791 |
|
---|
792 | If the number of the <Key, Value> pairs in the netmap is zero, return TRUE.
|
---|
793 |
|
---|
794 | If Map is NULL, then ASSERT().
|
---|
795 |
|
---|
796 |
|
---|
797 | @param[in] Map The net map to test.
|
---|
798 |
|
---|
799 | @return TRUE if the netmap is empty, otherwise FALSE.
|
---|
800 |
|
---|
801 | **/
|
---|
802 | BOOLEAN
|
---|
803 | EFIAPI
|
---|
804 | NetMapIsEmpty (
|
---|
805 | IN NET_MAP *Map
|
---|
806 | );
|
---|
807 |
|
---|
808 | /**
|
---|
809 | Return the number of the <Key, Value> pairs in the netmap.
|
---|
810 |
|
---|
811 | @param[in] Map The netmap to get the entry number.
|
---|
812 |
|
---|
813 | @return The entry number in the netmap.
|
---|
814 |
|
---|
815 | **/
|
---|
816 | UINTN
|
---|
817 | EFIAPI
|
---|
818 | NetMapGetCount (
|
---|
819 | IN NET_MAP *Map
|
---|
820 | );
|
---|
821 |
|
---|
822 | /**
|
---|
823 | Allocate an item to save the <Key, Value> pair to the head of the netmap.
|
---|
824 |
|
---|
825 | Allocate an item to save the <Key, Value> pair and add corresponding node entry
|
---|
826 | to the beginning of the Used doubly linked list. The number of the <Key, Value>
|
---|
827 | pairs in the netmap increase by 1.
|
---|
828 |
|
---|
829 | If Map is NULL, then ASSERT().
|
---|
830 |
|
---|
831 | @param[in, out] Map The netmap to insert into.
|
---|
832 | @param[in] Key The user's key.
|
---|
833 | @param[in] Value The user's value for the key.
|
---|
834 |
|
---|
835 | @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.
|
---|
836 | @retval EFI_SUCCESS The item is inserted to the head.
|
---|
837 |
|
---|
838 | **/
|
---|
839 | EFI_STATUS
|
---|
840 | EFIAPI
|
---|
841 | NetMapInsertHead (
|
---|
842 | IN OUT NET_MAP *Map,
|
---|
843 | IN VOID *Key,
|
---|
844 | IN VOID *Value OPTIONAL
|
---|
845 | );
|
---|
846 |
|
---|
847 | /**
|
---|
848 | Allocate an item to save the <Key, Value> pair to the tail of the netmap.
|
---|
849 |
|
---|
850 | Allocate an item to save the <Key, Value> pair and add corresponding node entry
|
---|
851 | to the tail of the Used doubly linked list. The number of the <Key, Value>
|
---|
852 | pairs in the netmap increase by 1.
|
---|
853 |
|
---|
854 | If Map is NULL, then ASSERT().
|
---|
855 |
|
---|
856 | @param[in, out] Map The netmap to insert into.
|
---|
857 | @param[in] Key The user's key.
|
---|
858 | @param[in] Value The user's value for the key.
|
---|
859 |
|
---|
860 | @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.
|
---|
861 | @retval EFI_SUCCESS The item is inserted to the tail.
|
---|
862 |
|
---|
863 | **/
|
---|
864 | EFI_STATUS
|
---|
865 | EFIAPI
|
---|
866 | NetMapInsertTail (
|
---|
867 | IN OUT NET_MAP *Map,
|
---|
868 | IN VOID *Key,
|
---|
869 | IN VOID *Value OPTIONAL
|
---|
870 | );
|
---|
871 |
|
---|
872 | /**
|
---|
873 | Finds the key in the netmap and returns the point to the item containing the Key.
|
---|
874 |
|
---|
875 | Iterate the Used doubly linked list of the netmap to get every item. Compare the key of every
|
---|
876 | item with the key to search. It returns the point to the item contains the Key if found.
|
---|
877 |
|
---|
878 | If Map is NULL, then ASSERT().
|
---|
879 |
|
---|
880 | @param[in] Map The netmap to search within.
|
---|
881 | @param[in] Key The key to search.
|
---|
882 |
|
---|
883 | @return The point to the item contains the Key, or NULL if Key isn't in the map.
|
---|
884 |
|
---|
885 | **/
|
---|
886 | NET_MAP_ITEM *
|
---|
887 | EFIAPI
|
---|
888 | NetMapFindKey (
|
---|
889 | IN NET_MAP *Map,
|
---|
890 | IN VOID *Key
|
---|
891 | );
|
---|
892 |
|
---|
893 | /**
|
---|
894 | Remove the node entry of the item from the netmap and return the key of the removed item.
|
---|
895 |
|
---|
896 | Remove the node entry of the item from the Used doubly linked list of the netmap.
|
---|
897 | The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
|
---|
898 | entry of the item to the Recycled doubly linked list of the netmap. If Value is not NULL,
|
---|
899 | Value will point to the value of the item. It returns the key of the removed item.
|
---|
900 |
|
---|
901 | If Map is NULL, then ASSERT().
|
---|
902 | If Item is NULL, then ASSERT().
|
---|
903 | if item in not in the netmap, then ASSERT().
|
---|
904 |
|
---|
905 | @param[in, out] Map The netmap to remove the item from.
|
---|
906 | @param[in, out] Item The item to remove.
|
---|
907 | @param[out] Value The variable to receive the value if not NULL.
|
---|
908 |
|
---|
909 | @return The key of the removed item.
|
---|
910 |
|
---|
911 | **/
|
---|
912 | VOID *
|
---|
913 | EFIAPI
|
---|
914 | NetMapRemoveItem (
|
---|
915 | IN OUT NET_MAP *Map,
|
---|
916 | IN OUT NET_MAP_ITEM *Item,
|
---|
917 | OUT VOID **Value OPTIONAL
|
---|
918 | );
|
---|
919 |
|
---|
920 | /**
|
---|
921 | Remove the first node entry on the netmap and return the key of the removed item.
|
---|
922 |
|
---|
923 | Remove the first node entry from the Used doubly linked list of the netmap.
|
---|
924 | The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
|
---|
925 | entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,
|
---|
926 | parameter Value will point to the value of the item. It returns the key of the removed item.
|
---|
927 |
|
---|
928 | If Map is NULL, then ASSERT().
|
---|
929 | If the Used doubly linked list is empty, then ASSERT().
|
---|
930 |
|
---|
931 | @param[in, out] Map The netmap to remove the head from.
|
---|
932 | @param[out] Value The variable to receive the value if not NULL.
|
---|
933 |
|
---|
934 | @return The key of the item removed.
|
---|
935 |
|
---|
936 | **/
|
---|
937 | VOID *
|
---|
938 | EFIAPI
|
---|
939 | NetMapRemoveHead (
|
---|
940 | IN OUT NET_MAP *Map,
|
---|
941 | OUT VOID **Value OPTIONAL
|
---|
942 | );
|
---|
943 |
|
---|
944 | /**
|
---|
945 | Remove the last node entry on the netmap and return the key of the removed item.
|
---|
946 |
|
---|
947 | Remove the last node entry from the Used doubly linked list of the netmap.
|
---|
948 | The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
|
---|
949 | entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,
|
---|
950 | parameter Value will point to the value of the item. It returns the key of the removed item.
|
---|
951 |
|
---|
952 | If Map is NULL, then ASSERT().
|
---|
953 | If the Used doubly linked list is empty, then ASSERT().
|
---|
954 |
|
---|
955 | @param[in, out] Map The netmap to remove the tail from.
|
---|
956 | @param[out] Value The variable to receive the value if not NULL.
|
---|
957 |
|
---|
958 | @return The key of the item removed.
|
---|
959 |
|
---|
960 | **/
|
---|
961 | VOID *
|
---|
962 | EFIAPI
|
---|
963 | NetMapRemoveTail (
|
---|
964 | IN OUT NET_MAP *Map,
|
---|
965 | OUT VOID **Value OPTIONAL
|
---|
966 | );
|
---|
967 |
|
---|
968 | typedef
|
---|
969 | EFI_STATUS
|
---|
970 | (EFIAPI *NET_MAP_CALLBACK) (
|
---|
971 | IN NET_MAP *Map,
|
---|
972 | IN NET_MAP_ITEM *Item,
|
---|
973 | IN VOID *Arg
|
---|
974 | );
|
---|
975 |
|
---|
976 | /**
|
---|
977 | Iterate through the netmap and call CallBack for each item.
|
---|
978 |
|
---|
979 | It will contiue the traverse if CallBack returns EFI_SUCCESS, otherwise, break
|
---|
980 | from the loop. It returns the CallBack's last return value. This function is
|
---|
981 | delete safe for the current item.
|
---|
982 |
|
---|
983 | If Map is NULL, then ASSERT().
|
---|
984 | If CallBack is NULL, then ASSERT().
|
---|
985 |
|
---|
986 | @param[in] Map The Map to iterate through.
|
---|
987 | @param[in] CallBack The callback function to call for each item.
|
---|
988 | @param[in] Arg The opaque parameter to the callback.
|
---|
989 |
|
---|
990 | @retval EFI_SUCCESS There is no item in the netmap, or CallBack for each item
|
---|
991 | returns EFI_SUCCESS.
|
---|
992 | @retval Others It returns the CallBack's last return value.
|
---|
993 |
|
---|
994 | **/
|
---|
995 | EFI_STATUS
|
---|
996 | EFIAPI
|
---|
997 | NetMapIterate (
|
---|
998 | IN NET_MAP *Map,
|
---|
999 | IN NET_MAP_CALLBACK CallBack,
|
---|
1000 | IN VOID *Arg OPTIONAL
|
---|
1001 | );
|
---|
1002 |
|
---|
1003 |
|
---|
1004 | //
|
---|
1005 | // Helper functions to implement driver binding and service binding protocols.
|
---|
1006 | //
|
---|
1007 | /**
|
---|
1008 | Create a child of the service that is identified by ServiceBindingGuid.
|
---|
1009 |
|
---|
1010 | Get the ServiceBinding Protocol first, then use it to create a child.
|
---|
1011 |
|
---|
1012 | If ServiceBindingGuid is NULL, then ASSERT().
|
---|
1013 | If ChildHandle is NULL, then ASSERT().
|
---|
1014 |
|
---|
1015 | @param[in] Controller The controller which has the service installed.
|
---|
1016 | @param[in] Image The image handle used to open service.
|
---|
1017 | @param[in] ServiceBindingGuid The service's Guid.
|
---|
1018 | @param[in, out] ChildHandle The handle to receive the created child.
|
---|
1019 |
|
---|
1020 | @retval EFI_SUCCESS The child was successfully created.
|
---|
1021 | @retval Others Failed to create the child.
|
---|
1022 |
|
---|
1023 | **/
|
---|
1024 | EFI_STATUS
|
---|
1025 | EFIAPI
|
---|
1026 | NetLibCreateServiceChild (
|
---|
1027 | IN EFI_HANDLE Controller,
|
---|
1028 | IN EFI_HANDLE Image,
|
---|
1029 | IN EFI_GUID *ServiceBindingGuid,
|
---|
1030 | IN OUT EFI_HANDLE *ChildHandle
|
---|
1031 | );
|
---|
1032 |
|
---|
1033 | /**
|
---|
1034 | Destroy a child of the service that is identified by ServiceBindingGuid.
|
---|
1035 |
|
---|
1036 | Get the ServiceBinding Protocol first, then use it to destroy a child.
|
---|
1037 |
|
---|
1038 | If ServiceBindingGuid is NULL, then ASSERT().
|
---|
1039 |
|
---|
1040 | @param[in] Controller The controller which has the service installed.
|
---|
1041 | @param[in] Image The image handle used to open service.
|
---|
1042 | @param[in] ServiceBindingGuid The service's Guid.
|
---|
1043 | @param[in] ChildHandle The child to destroy.
|
---|
1044 |
|
---|
1045 | @retval EFI_SUCCESS The child was destroyed.
|
---|
1046 | @retval Others Failed to destroy the child.
|
---|
1047 |
|
---|
1048 | **/
|
---|
1049 | EFI_STATUS
|
---|
1050 | EFIAPI
|
---|
1051 | NetLibDestroyServiceChild (
|
---|
1052 | IN EFI_HANDLE Controller,
|
---|
1053 | IN EFI_HANDLE Image,
|
---|
1054 | IN EFI_GUID *ServiceBindingGuid,
|
---|
1055 | IN EFI_HANDLE ChildHandle
|
---|
1056 | );
|
---|
1057 |
|
---|
1058 | /**
|
---|
1059 | Get handle with Simple Network Protocol installed on it.
|
---|
1060 |
|
---|
1061 | There should be MNP Service Binding Protocol installed on the input ServiceHandle.
|
---|
1062 | If Simple Network Protocol is already installed on the ServiceHandle, the
|
---|
1063 | ServiceHandle will be returned. If SNP is not installed on the ServiceHandle,
|
---|
1064 | try to find its parent handle with SNP installed.
|
---|
1065 |
|
---|
1066 | @param[in] ServiceHandle The handle where network service binding protocols are
|
---|
1067 | installed on.
|
---|
1068 | @param[out] Snp The pointer to store the address of the SNP instance.
|
---|
1069 | This is an optional parameter that may be NULL.
|
---|
1070 |
|
---|
1071 | @return The SNP handle, or NULL if not found.
|
---|
1072 |
|
---|
1073 | **/
|
---|
1074 | EFI_HANDLE
|
---|
1075 | EFIAPI
|
---|
1076 | NetLibGetSnpHandle (
|
---|
1077 | IN EFI_HANDLE ServiceHandle,
|
---|
1078 | OUT EFI_SIMPLE_NETWORK_PROTOCOL **Snp OPTIONAL
|
---|
1079 | );
|
---|
1080 |
|
---|
1081 | /**
|
---|
1082 | Retrieve VLAN ID of a VLAN device handle.
|
---|
1083 |
|
---|
1084 | Search VLAN device path node in Device Path of specified ServiceHandle and
|
---|
1085 | return its VLAN ID. If no VLAN device path node found, then this ServiceHandle
|
---|
1086 | is not a VLAN device handle, and 0 will be returned.
|
---|
1087 |
|
---|
1088 | @param[in] ServiceHandle The handle where network service binding protocols are
|
---|
1089 | installed on.
|
---|
1090 |
|
---|
1091 | @return VLAN ID of the device handle, or 0 if not a VLAN device.
|
---|
1092 |
|
---|
1093 | **/
|
---|
1094 | UINT16
|
---|
1095 | EFIAPI
|
---|
1096 | NetLibGetVlanId (
|
---|
1097 | IN EFI_HANDLE ServiceHandle
|
---|
1098 | );
|
---|
1099 |
|
---|
1100 | /**
|
---|
1101 | Find VLAN device handle with specified VLAN ID.
|
---|
1102 |
|
---|
1103 | The VLAN child device handle is created by VLAN Config Protocol on ControllerHandle.
|
---|
1104 | This function will append VLAN device path node to the parent device path,
|
---|
1105 | and then use LocateDevicePath() to find the correct VLAN device handle.
|
---|
1106 |
|
---|
1107 | @param[in] ControllerHandle The handle where network service binding protocols are
|
---|
1108 | installed on.
|
---|
1109 | @param[in] VlanId The configured VLAN ID for the VLAN device.
|
---|
1110 |
|
---|
1111 | @return The VLAN device handle, or NULL if not found.
|
---|
1112 |
|
---|
1113 | **/
|
---|
1114 | EFI_HANDLE
|
---|
1115 | EFIAPI
|
---|
1116 | NetLibGetVlanHandle (
|
---|
1117 | IN EFI_HANDLE ControllerHandle,
|
---|
1118 | IN UINT16 VlanId
|
---|
1119 | );
|
---|
1120 |
|
---|
1121 | /**
|
---|
1122 | Get MAC address associated with the network service handle.
|
---|
1123 |
|
---|
1124 | There should be MNP Service Binding Protocol installed on the input ServiceHandle.
|
---|
1125 | If SNP is installed on the ServiceHandle or its parent handle, MAC address will
|
---|
1126 | be retrieved from SNP. If no SNP found, try to get SNP mode data use MNP.
|
---|
1127 |
|
---|
1128 | @param[in] ServiceHandle The handle where network service binding protocols are
|
---|
1129 | installed on.
|
---|
1130 | @param[out] MacAddress The pointer to store the returned MAC address.
|
---|
1131 | @param[out] AddressSize The length of returned MAC address.
|
---|
1132 |
|
---|
1133 | @retval EFI_SUCCESS MAC address was returned successfully.
|
---|
1134 | @retval Others Failed to get SNP mode data.
|
---|
1135 |
|
---|
1136 | **/
|
---|
1137 | EFI_STATUS
|
---|
1138 | EFIAPI
|
---|
1139 | NetLibGetMacAddress (
|
---|
1140 | IN EFI_HANDLE ServiceHandle,
|
---|
1141 | OUT EFI_MAC_ADDRESS *MacAddress,
|
---|
1142 | OUT UINTN *AddressSize
|
---|
1143 | );
|
---|
1144 |
|
---|
1145 | /**
|
---|
1146 | Convert MAC address of the NIC associated with specified Service Binding Handle
|
---|
1147 | to a unicode string. Callers are responsible for freeing the string storage.
|
---|
1148 |
|
---|
1149 | Locate simple network protocol associated with the Service Binding Handle and
|
---|
1150 | get the mac address from SNP. Then convert the mac address into a unicode
|
---|
1151 | string. It takes 2 unicode characters to represent a 1 byte binary buffer.
|
---|
1152 | Plus one unicode character for the null-terminator.
|
---|
1153 |
|
---|
1154 | @param[in] ServiceHandle The handle where network service binding protocol is
|
---|
1155 | installed.
|
---|
1156 | @param[in] ImageHandle The image handle used to act as the agent handle to
|
---|
1157 | get the simple network protocol. This parameter is
|
---|
1158 | optional and may be NULL.
|
---|
1159 | @param[out] MacString The pointer to store the address of the string
|
---|
1160 | representation of the mac address.
|
---|
1161 |
|
---|
1162 | @retval EFI_SUCCESS Converted the mac address a unicode string successfully.
|
---|
1163 | @retval EFI_OUT_OF_RESOURCES There are not enough memory resources.
|
---|
1164 | @retval Others Failed to open the simple network protocol.
|
---|
1165 |
|
---|
1166 | **/
|
---|
1167 | EFI_STATUS
|
---|
1168 | EFIAPI
|
---|
1169 | NetLibGetMacString (
|
---|
1170 | IN EFI_HANDLE ServiceHandle,
|
---|
1171 | IN EFI_HANDLE ImageHandle, OPTIONAL
|
---|
1172 | OUT CHAR16 **MacString
|
---|
1173 | );
|
---|
1174 |
|
---|
1175 | /**
|
---|
1176 | Detect media status for specified network device.
|
---|
1177 |
|
---|
1178 | The underlying UNDI driver may or may not support reporting media status from
|
---|
1179 | GET_STATUS command (PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED). This routine
|
---|
1180 | will try to invoke Snp->GetStatus() to get the media status. If media is already
|
---|
1181 | present, it returns directly. If media is not present, it will stop SNP and then
|
---|
1182 | restart SNP to get the latest media status. This provides an opportunity to get
|
---|
1183 | the correct media status for old UNDI driver, which doesn't support reporting
|
---|
1184 | media status from GET_STATUS command.
|
---|
1185 | Note: there are two limitations for the current algorithm:
|
---|
1186 | 1) For UNDI with this capability, when the cable is not attached, there will
|
---|
1187 | be an redundant Stop/Start() process.
|
---|
1188 | 2) for UNDI without this capability, in case that network cable is attached when
|
---|
1189 | Snp->Initialize() is invoked while network cable is unattached later,
|
---|
1190 | NetLibDetectMedia() will report MediaPresent as TRUE, causing upper layer
|
---|
1191 | apps to wait for timeout time.
|
---|
1192 |
|
---|
1193 | @param[in] ServiceHandle The handle where network service binding protocols are
|
---|
1194 | installed.
|
---|
1195 | @param[out] MediaPresent The pointer to store the media status.
|
---|
1196 |
|
---|
1197 | @retval EFI_SUCCESS Media detection success.
|
---|
1198 | @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network device handle.
|
---|
1199 | @retval EFI_UNSUPPORTED The network device does not support media detection.
|
---|
1200 | @retval EFI_DEVICE_ERROR SNP is in an unknown state.
|
---|
1201 |
|
---|
1202 | **/
|
---|
1203 | EFI_STATUS
|
---|
1204 | EFIAPI
|
---|
1205 | NetLibDetectMedia (
|
---|
1206 | IN EFI_HANDLE ServiceHandle,
|
---|
1207 | OUT BOOLEAN *MediaPresent
|
---|
1208 | );
|
---|
1209 |
|
---|
1210 | /**
|
---|
1211 | Create an IPv4 device path node.
|
---|
1212 |
|
---|
1213 | The header type of IPv4 device path node is MESSAGING_DEVICE_PATH.
|
---|
1214 | The header subtype of IPv4 device path node is MSG_IPv4_DP.
|
---|
1215 | The length of the IPv4 device path node in bytes is 19.
|
---|
1216 | Get other information from parameters to make up the whole IPv4 device path node.
|
---|
1217 |
|
---|
1218 | @param[in, out] Node The pointer to the IPv4 device path node.
|
---|
1219 | @param[in] Controller The controller handle.
|
---|
1220 | @param[in] LocalIp The local IPv4 address.
|
---|
1221 | @param[in] LocalPort The local port.
|
---|
1222 | @param[in] RemoteIp The remote IPv4 address.
|
---|
1223 | @param[in] RemotePort The remote port.
|
---|
1224 | @param[in] Protocol The protocol type in the IP header.
|
---|
1225 | @param[in] UseDefaultAddress Whether this instance is using default address or not.
|
---|
1226 |
|
---|
1227 | **/
|
---|
1228 | VOID
|
---|
1229 | EFIAPI
|
---|
1230 | NetLibCreateIPv4DPathNode (
|
---|
1231 | IN OUT IPv4_DEVICE_PATH *Node,
|
---|
1232 | IN EFI_HANDLE Controller,
|
---|
1233 | IN IP4_ADDR LocalIp,
|
---|
1234 | IN UINT16 LocalPort,
|
---|
1235 | IN IP4_ADDR RemoteIp,
|
---|
1236 | IN UINT16 RemotePort,
|
---|
1237 | IN UINT16 Protocol,
|
---|
1238 | IN BOOLEAN UseDefaultAddress
|
---|
1239 | );
|
---|
1240 |
|
---|
1241 | /**
|
---|
1242 | Create an IPv6 device path node.
|
---|
1243 |
|
---|
1244 | The header type of IPv6 device path node is MESSAGING_DEVICE_PATH.
|
---|
1245 | The header subtype of IPv6 device path node is MSG_IPv6_DP.
|
---|
1246 | The length of the IPv6 device path node in bytes is 43.
|
---|
1247 | Get other information from parameters to make up the whole IPv6 device path node.
|
---|
1248 |
|
---|
1249 | @param[in, out] Node The pointer to the IPv6 device path node.
|
---|
1250 | @param[in] Controller The controller handle.
|
---|
1251 | @param[in] LocalIp The local IPv6 address.
|
---|
1252 | @param[in] LocalPort The local port.
|
---|
1253 | @param[in] RemoteIp The remote IPv6 address.
|
---|
1254 | @param[in] RemotePort The remote port.
|
---|
1255 | @param[in] Protocol The protocol type in the IP header.
|
---|
1256 |
|
---|
1257 | **/
|
---|
1258 | VOID
|
---|
1259 | EFIAPI
|
---|
1260 | NetLibCreateIPv6DPathNode (
|
---|
1261 | IN OUT IPv6_DEVICE_PATH *Node,
|
---|
1262 | IN EFI_HANDLE Controller,
|
---|
1263 | IN EFI_IPv6_ADDRESS *LocalIp,
|
---|
1264 | IN UINT16 LocalPort,
|
---|
1265 | IN EFI_IPv6_ADDRESS *RemoteIp,
|
---|
1266 | IN UINT16 RemotePort,
|
---|
1267 | IN UINT16 Protocol
|
---|
1268 | );
|
---|
1269 |
|
---|
1270 |
|
---|
1271 | /**
|
---|
1272 | Find the UNDI/SNP handle from controller and protocol GUID.
|
---|
1273 |
|
---|
1274 | For example, IP will open an MNP child to transmit/receive
|
---|
1275 | packets. When MNP is stopped, IP should also be stopped. IP
|
---|
1276 | needs to find its own private data that is related the IP's
|
---|
1277 | service binding instance that is installed on the UNDI/SNP handle.
|
---|
1278 | The controller is then either an MNP or an ARP child handle. Note that
|
---|
1279 | IP opens these handles using BY_DRIVER. Use that infomation to get the
|
---|
1280 | UNDI/SNP handle.
|
---|
1281 |
|
---|
1282 | @param[in] Controller The protocol handle to check.
|
---|
1283 | @param[in] ProtocolGuid The protocol that is related with the handle.
|
---|
1284 |
|
---|
1285 | @return The UNDI/SNP handle or NULL for errors.
|
---|
1286 |
|
---|
1287 | **/
|
---|
1288 | EFI_HANDLE
|
---|
1289 | EFIAPI
|
---|
1290 | NetLibGetNicHandle (
|
---|
1291 | IN EFI_HANDLE Controller,
|
---|
1292 | IN EFI_GUID *ProtocolGuid
|
---|
1293 | );
|
---|
1294 |
|
---|
1295 | /**
|
---|
1296 | This is the default unload handle for all the network drivers.
|
---|
1297 |
|
---|
1298 | Disconnect the driver specified by ImageHandle from all the devices in the handle database.
|
---|
1299 | Uninstall all the protocols installed in the driver entry point.
|
---|
1300 |
|
---|
1301 | @param[in] ImageHandle The drivers' driver image.
|
---|
1302 |
|
---|
1303 | @retval EFI_SUCCESS The image is unloaded.
|
---|
1304 | @retval Others Failed to unload the image.
|
---|
1305 |
|
---|
1306 | **/
|
---|
1307 | EFI_STATUS
|
---|
1308 | EFIAPI
|
---|
1309 | NetLibDefaultUnload (
|
---|
1310 | IN EFI_HANDLE ImageHandle
|
---|
1311 | );
|
---|
1312 |
|
---|
1313 | /**
|
---|
1314 | Convert one Null-terminated ASCII string (decimal dotted) to EFI_IPv4_ADDRESS.
|
---|
1315 |
|
---|
1316 | @param[in] String The pointer to the Ascii string.
|
---|
1317 | @param[out] Ip4Address The pointer to the converted IPv4 address.
|
---|
1318 |
|
---|
1319 | @retval EFI_SUCCESS Converted to an IPv4 address successfully.
|
---|
1320 | @retval EFI_INVALID_PARAMETER The string is malformated, or Ip4Address is NULL.
|
---|
1321 |
|
---|
1322 | **/
|
---|
1323 | EFI_STATUS
|
---|
1324 | EFIAPI
|
---|
1325 | NetLibAsciiStrToIp4 (
|
---|
1326 | IN CONST CHAR8 *String,
|
---|
1327 | OUT EFI_IPv4_ADDRESS *Ip4Address
|
---|
1328 | );
|
---|
1329 |
|
---|
1330 | /**
|
---|
1331 | Convert one Null-terminated ASCII string to EFI_IPv6_ADDRESS. The format of the
|
---|
1332 | string is defined in RFC 4291 - Text Pepresentation of Addresses.
|
---|
1333 |
|
---|
1334 | @param[in] String The pointer to the Ascii string.
|
---|
1335 | @param[out] Ip6Address The pointer to the converted IPv6 address.
|
---|
1336 |
|
---|
1337 | @retval EFI_SUCCESS Converted to an IPv6 address successfully.
|
---|
1338 | @retval EFI_INVALID_PARAMETER The string is malformated, or Ip6Address is NULL.
|
---|
1339 |
|
---|
1340 | **/
|
---|
1341 | EFI_STATUS
|
---|
1342 | EFIAPI
|
---|
1343 | NetLibAsciiStrToIp6 (
|
---|
1344 | IN CONST CHAR8 *String,
|
---|
1345 | OUT EFI_IPv6_ADDRESS *Ip6Address
|
---|
1346 | );
|
---|
1347 |
|
---|
1348 | /**
|
---|
1349 | Convert one Null-terminated Unicode string (decimal dotted) to EFI_IPv4_ADDRESS.
|
---|
1350 |
|
---|
1351 | @param[in] String The pointer to the Ascii string.
|
---|
1352 | @param[out] Ip4Address The pointer to the converted IPv4 address.
|
---|
1353 |
|
---|
1354 | @retval EFI_SUCCESS Converted to an IPv4 address successfully.
|
---|
1355 | @retval EFI_INVALID_PARAMETER The string is mal-formated or Ip4Address is NULL.
|
---|
1356 | @retval EFI_OUT_OF_RESOURCES Failed to perform the operation due to lack of resources.
|
---|
1357 |
|
---|
1358 | **/
|
---|
1359 | EFI_STATUS
|
---|
1360 | EFIAPI
|
---|
1361 | NetLibStrToIp4 (
|
---|
1362 | IN CONST CHAR16 *String,
|
---|
1363 | OUT EFI_IPv4_ADDRESS *Ip4Address
|
---|
1364 | );
|
---|
1365 |
|
---|
1366 | /**
|
---|
1367 | Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS. The format of
|
---|
1368 | the string is defined in RFC 4291 - Text Pepresentation of Addresses.
|
---|
1369 |
|
---|
1370 | @param[in] String The pointer to the Ascii string.
|
---|
1371 | @param[out] Ip6Address The pointer to the converted IPv6 address.
|
---|
1372 |
|
---|
1373 | @retval EFI_SUCCESS Converted to an IPv6 address successfully.
|
---|
1374 | @retval EFI_INVALID_PARAMETER The string is malformated or Ip6Address is NULL.
|
---|
1375 | @retval EFI_OUT_OF_RESOURCES Failed to perform the operation due to a lack of resources.
|
---|
1376 |
|
---|
1377 | **/
|
---|
1378 | EFI_STATUS
|
---|
1379 | EFIAPI
|
---|
1380 | NetLibStrToIp6 (
|
---|
1381 | IN CONST CHAR16 *String,
|
---|
1382 | OUT EFI_IPv6_ADDRESS *Ip6Address
|
---|
1383 | );
|
---|
1384 |
|
---|
1385 | /**
|
---|
1386 | Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS and prefix length.
|
---|
1387 | The format of the string is defined in RFC 4291 - Text Pepresentation of Addresses
|
---|
1388 | Prefixes: ipv6-address/prefix-length.
|
---|
1389 |
|
---|
1390 | @param[in] String The pointer to the Ascii string.
|
---|
1391 | @param[out] Ip6Address The pointer to the converted IPv6 address.
|
---|
1392 | @param[out] PrefixLength The pointer to the converted prefix length.
|
---|
1393 |
|
---|
1394 | @retval EFI_SUCCESS Converted to an IPv6 address successfully.
|
---|
1395 | @retval EFI_INVALID_PARAMETER The string is malformated, or Ip6Address is NULL.
|
---|
1396 | @retval EFI_OUT_OF_RESOURCES Failed to perform the operation due to a lack of resources.
|
---|
1397 |
|
---|
1398 | **/
|
---|
1399 | EFI_STATUS
|
---|
1400 | EFIAPI
|
---|
1401 | NetLibStrToIp6andPrefix (
|
---|
1402 | IN CONST CHAR16 *String,
|
---|
1403 | OUT EFI_IPv6_ADDRESS *Ip6Address,
|
---|
1404 | OUT UINT8 *PrefixLength
|
---|
1405 | );
|
---|
1406 |
|
---|
1407 | /**
|
---|
1408 |
|
---|
1409 | Convert one EFI_IPv6_ADDRESS to Null-terminated Unicode string.
|
---|
1410 | The text representation of address is defined in RFC 4291.
|
---|
1411 |
|
---|
1412 | @param[in] Ip6Address The pointer to the IPv6 address.
|
---|
1413 | @param[out] String The buffer to return the converted string.
|
---|
1414 | @param[in] StringSize The length in bytes of the input String.
|
---|
1415 |
|
---|
1416 | @retval EFI_SUCCESS Convert to string successfully.
|
---|
1417 | @retval EFI_INVALID_PARAMETER The input parameter is invalid.
|
---|
1418 | @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small for the result. BufferSize has been
|
---|
1419 | updated with the size needed to complete the request.
|
---|
1420 | **/
|
---|
1421 | EFI_STATUS
|
---|
1422 | EFIAPI
|
---|
1423 | NetLibIp6ToStr (
|
---|
1424 | IN EFI_IPv6_ADDRESS *Ip6Address,
|
---|
1425 | OUT CHAR16 *String,
|
---|
1426 | IN UINTN StringSize
|
---|
1427 | );
|
---|
1428 |
|
---|
1429 | //
|
---|
1430 | // Various signatures
|
---|
1431 | //
|
---|
1432 | #define NET_BUF_SIGNATURE SIGNATURE_32 ('n', 'b', 'u', 'f')
|
---|
1433 | #define NET_VECTOR_SIGNATURE SIGNATURE_32 ('n', 'v', 'e', 'c')
|
---|
1434 | #define NET_QUE_SIGNATURE SIGNATURE_32 ('n', 'b', 'q', 'u')
|
---|
1435 |
|
---|
1436 |
|
---|
1437 | #define NET_PROTO_DATA 64 // Opaque buffer for protocols
|
---|
1438 | #define NET_BUF_HEAD 1 // Trim or allocate space from head
|
---|
1439 | #define NET_BUF_TAIL 0 // Trim or allocate space from tail
|
---|
1440 | #define NET_VECTOR_OWN_FIRST 0x01 // We allocated the 1st block in the vector
|
---|
1441 |
|
---|
1442 | #define NET_CHECK_SIGNATURE(PData, SIGNATURE) \
|
---|
1443 | ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))
|
---|
1444 |
|
---|
1445 | //
|
---|
1446 | // Single memory block in the vector.
|
---|
1447 | //
|
---|
1448 | typedef struct {
|
---|
1449 | UINT32 Len; // The block's length
|
---|
1450 | UINT8 *Bulk; // The block's Data
|
---|
1451 | } NET_BLOCK;
|
---|
1452 |
|
---|
1453 | typedef VOID (EFIAPI *NET_VECTOR_EXT_FREE) (VOID *Arg);
|
---|
1454 |
|
---|
1455 | //
|
---|
1456 | //NET_VECTOR contains several blocks to hold all packet's
|
---|
1457 | //fragments and other house-keeping stuff for sharing. It
|
---|
1458 | //doesn't specify the where actual packet fragment begins.
|
---|
1459 | //
|
---|
1460 | typedef struct {
|
---|
1461 | UINT32 Signature;
|
---|
1462 | INTN RefCnt; // Reference count to share NET_VECTOR.
|
---|
1463 | NET_VECTOR_EXT_FREE Free; // external function to free NET_VECTOR
|
---|
1464 | VOID *Arg; // opeque argument to Free
|
---|
1465 | UINT32 Flag; // Flags, NET_VECTOR_OWN_FIRST
|
---|
1466 | UINT32 Len; // Total length of the assocated BLOCKs
|
---|
1467 |
|
---|
1468 | UINT32 BlockNum;
|
---|
1469 | NET_BLOCK Block[1];
|
---|
1470 | } NET_VECTOR;
|
---|
1471 |
|
---|
1472 | //
|
---|
1473 | //NET_BLOCK_OP operates on the NET_BLOCK. It specifies
|
---|
1474 | //where the actual fragment begins and ends
|
---|
1475 | //
|
---|
1476 | typedef struct {
|
---|
1477 | UINT8 *BlockHead; // Block's head, or the smallest valid Head
|
---|
1478 | UINT8 *BlockTail; // Block's tail. BlockTail-BlockHead=block length
|
---|
1479 | UINT8 *Head; // 1st byte of the data in the block
|
---|
1480 | UINT8 *Tail; // Tail of the data in the block, Tail-Head=Size
|
---|
1481 | UINT32 Size; // The size of the data
|
---|
1482 | } NET_BLOCK_OP;
|
---|
1483 |
|
---|
1484 | typedef union {
|
---|
1485 | IP4_HEAD *Ip4;
|
---|
1486 | EFI_IP6_HEADER *Ip6;
|
---|
1487 | } NET_IP_HEAD;
|
---|
1488 |
|
---|
1489 | //
|
---|
1490 | //NET_BUF is the buffer manage structure used by the
|
---|
1491 | //network stack. Every network packet may be fragmented. The Vector points to
|
---|
1492 | //memory blocks used by each fragment, and BlockOp
|
---|
1493 | //specifies where each fragment begins and ends.
|
---|
1494 | //
|
---|
1495 | //It also contains an opaque area for the protocol to store
|
---|
1496 | //per-packet information. Protocol must be careful not
|
---|
1497 | //to overwrite the members after that.
|
---|
1498 | //
|
---|
1499 | typedef struct {
|
---|
1500 | UINT32 Signature;
|
---|
1501 | INTN RefCnt;
|
---|
1502 | LIST_ENTRY List; // The List this NET_BUF is on
|
---|
1503 |
|
---|
1504 | NET_IP_HEAD Ip; // Network layer header, for fast access
|
---|
1505 | TCP_HEAD *Tcp; // Transport layer header, for fast access
|
---|
1506 | EFI_UDP_HEADER *Udp; // User Datagram Protocol header
|
---|
1507 | UINT8 ProtoData [NET_PROTO_DATA]; //Protocol specific data
|
---|
1508 |
|
---|
1509 | NET_VECTOR *Vector; // The vector containing the packet
|
---|
1510 |
|
---|
1511 | UINT32 BlockOpNum; // Total number of BlockOp in the buffer
|
---|
1512 | UINT32 TotalSize; // Total size of the actual packet
|
---|
1513 | NET_BLOCK_OP BlockOp[1]; // Specify the position of actual packet
|
---|
1514 | } NET_BUF;
|
---|
1515 |
|
---|
1516 | //
|
---|
1517 | //A queue of NET_BUFs. It is a thin extension of
|
---|
1518 | //NET_BUF functions.
|
---|
1519 | //
|
---|
1520 | typedef struct {
|
---|
1521 | UINT32 Signature;
|
---|
1522 | INTN RefCnt;
|
---|
1523 | LIST_ENTRY List; // The List this buffer queue is on
|
---|
1524 |
|
---|
1525 | LIST_ENTRY BufList; // list of queued buffers
|
---|
1526 | UINT32 BufSize; // total length of DATA in the buffers
|
---|
1527 | UINT32 BufNum; // total number of buffers on the chain
|
---|
1528 | } NET_BUF_QUEUE;
|
---|
1529 |
|
---|
1530 | //
|
---|
1531 | // Pseudo header for TCP and UDP checksum
|
---|
1532 | //
|
---|
1533 | #pragma pack(1)
|
---|
1534 | typedef struct {
|
---|
1535 | IP4_ADDR SrcIp;
|
---|
1536 | IP4_ADDR DstIp;
|
---|
1537 | UINT8 Reserved;
|
---|
1538 | UINT8 Protocol;
|
---|
1539 | UINT16 Len;
|
---|
1540 | } NET_PSEUDO_HDR;
|
---|
1541 |
|
---|
1542 | typedef struct {
|
---|
1543 | EFI_IPv6_ADDRESS SrcIp;
|
---|
1544 | EFI_IPv6_ADDRESS DstIp;
|
---|
1545 | UINT32 Len;
|
---|
1546 | UINT32 Reserved:24;
|
---|
1547 | UINT32 NextHeader:8;
|
---|
1548 | } NET_IP6_PSEUDO_HDR;
|
---|
1549 | #pragma pack()
|
---|
1550 |
|
---|
1551 | //
|
---|
1552 | // The fragment entry table used in network interfaces. This is
|
---|
1553 | // the same as NET_BLOCK now. Use two different to distinguish
|
---|
1554 | // the two in case that NET_BLOCK be enhanced later.
|
---|
1555 | //
|
---|
1556 | typedef struct {
|
---|
1557 | UINT32 Len;
|
---|
1558 | UINT8 *Bulk;
|
---|
1559 | } NET_FRAGMENT;
|
---|
1560 |
|
---|
1561 | #define NET_GET_REF(PData) ((PData)->RefCnt++)
|
---|
1562 | #define NET_PUT_REF(PData) ((PData)->RefCnt--)
|
---|
1563 | #define NETBUF_FROM_PROTODATA(Info) BASE_CR((Info), NET_BUF, ProtoData)
|
---|
1564 |
|
---|
1565 | #define NET_BUF_SHARED(Buf) \
|
---|
1566 | (((Buf)->RefCnt > 1) || ((Buf)->Vector->RefCnt > 1))
|
---|
1567 |
|
---|
1568 | #define NET_VECTOR_SIZE(BlockNum) \
|
---|
1569 | (sizeof (NET_VECTOR) + ((BlockNum) - 1) * sizeof (NET_BLOCK))
|
---|
1570 |
|
---|
1571 | #define NET_BUF_SIZE(BlockOpNum) \
|
---|
1572 | (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP))
|
---|
1573 |
|
---|
1574 | #define NET_HEADSPACE(BlockOp) \
|
---|
1575 | (UINTN)((BlockOp)->Head - (BlockOp)->BlockHead)
|
---|
1576 |
|
---|
1577 | #define NET_TAILSPACE(BlockOp) \
|
---|
1578 | (UINTN)((BlockOp)->BlockTail - (BlockOp)->Tail)
|
---|
1579 |
|
---|
1580 | /**
|
---|
1581 | Allocate a single block NET_BUF. Upon allocation, all the
|
---|
1582 | free space is in the tail room.
|
---|
1583 |
|
---|
1584 | @param[in] Len The length of the block.
|
---|
1585 |
|
---|
1586 | @return The pointer to the allocated NET_BUF, or NULL if the
|
---|
1587 | allocation failed due to resource limitations.
|
---|
1588 |
|
---|
1589 | **/
|
---|
1590 | NET_BUF *
|
---|
1591 | EFIAPI
|
---|
1592 | NetbufAlloc (
|
---|
1593 | IN UINT32 Len
|
---|
1594 | );
|
---|
1595 |
|
---|
1596 | /**
|
---|
1597 | Free the net buffer and its associated NET_VECTOR.
|
---|
1598 |
|
---|
1599 | Decrease the reference count of the net buffer by one. Free the associated net
|
---|
1600 | vector and itself if the reference count of the net buffer is decreased to 0.
|
---|
1601 | The net vector free operation decreases the reference count of the net
|
---|
1602 | vector by one, and performs the resource free operation when the reference count
|
---|
1603 | of the net vector is 0.
|
---|
1604 |
|
---|
1605 | @param[in] Nbuf The pointer to the NET_BUF to be freed.
|
---|
1606 |
|
---|
1607 | **/
|
---|
1608 | VOID
|
---|
1609 | EFIAPI
|
---|
1610 | NetbufFree (
|
---|
1611 | IN NET_BUF *Nbuf
|
---|
1612 | );
|
---|
1613 |
|
---|
1614 | /**
|
---|
1615 | Get the index of NET_BLOCK_OP that contains the byte at Offset in the net
|
---|
1616 | buffer.
|
---|
1617 |
|
---|
1618 | For example, this function can be used to retrieve the IP header in the packet. It
|
---|
1619 | also can be used to get the fragment that contains the byte used
|
---|
1620 | mainly by the library implementation itself.
|
---|
1621 |
|
---|
1622 | @param[in] Nbuf The pointer to the net buffer.
|
---|
1623 | @param[in] Offset The offset of the byte.
|
---|
1624 | @param[out] Index Index of the NET_BLOCK_OP that contains the byte at
|
---|
1625 | Offset.
|
---|
1626 |
|
---|
1627 | @return The pointer to the Offset'th byte of data in the net buffer, or NULL
|
---|
1628 | if there is no such data in the net buffer.
|
---|
1629 |
|
---|
1630 | **/
|
---|
1631 | UINT8 *
|
---|
1632 | EFIAPI
|
---|
1633 | NetbufGetByte (
|
---|
1634 | IN NET_BUF *Nbuf,
|
---|
1635 | IN UINT32 Offset,
|
---|
1636 | OUT UINT32 *Index OPTIONAL
|
---|
1637 | );
|
---|
1638 |
|
---|
1639 | /**
|
---|
1640 | Create a copy of the net buffer that shares the associated net vector.
|
---|
1641 |
|
---|
1642 | The reference count of the newly created net buffer is set to 1. The reference
|
---|
1643 | count of the associated net vector is increased by one.
|
---|
1644 |
|
---|
1645 | @param[in] Nbuf The pointer to the net buffer to be cloned.
|
---|
1646 |
|
---|
1647 | @return The pointer to the cloned net buffer, or NULL if the
|
---|
1648 | allocation failed due to resource limitations.
|
---|
1649 |
|
---|
1650 | **/
|
---|
1651 | NET_BUF *
|
---|
1652 | EFIAPI
|
---|
1653 | NetbufClone (
|
---|
1654 | IN NET_BUF *Nbuf
|
---|
1655 | );
|
---|
1656 |
|
---|
1657 | /**
|
---|
1658 | Create a duplicated copy of the net buffer with data copied and HeadSpace
|
---|
1659 | bytes of head space reserved.
|
---|
1660 |
|
---|
1661 | The duplicated net buffer will allocate its own memory to hold the data of the
|
---|
1662 | source net buffer.
|
---|
1663 |
|
---|
1664 | @param[in] Nbuf The pointer to the net buffer to be duplicated from.
|
---|
1665 | @param[in, out] Duplicate The pointer to the net buffer to duplicate to. If
|
---|
1666 | NULL, a new net buffer is allocated.
|
---|
1667 | @param[in] HeadSpace The length of the head space to reserve.
|
---|
1668 |
|
---|
1669 | @return The pointer to the duplicated net buffer, or NULL if
|
---|
1670 | the allocation failed due to resource limitations.
|
---|
1671 |
|
---|
1672 | **/
|
---|
1673 | NET_BUF *
|
---|
1674 | EFIAPI
|
---|
1675 | NetbufDuplicate (
|
---|
1676 | IN NET_BUF *Nbuf,
|
---|
1677 | IN OUT NET_BUF *Duplicate OPTIONAL,
|
---|
1678 | IN UINT32 HeadSpace
|
---|
1679 | );
|
---|
1680 |
|
---|
1681 | /**
|
---|
1682 | Create a NET_BUF structure which contains Len byte data of Nbuf starting from
|
---|
1683 | Offset.
|
---|
1684 |
|
---|
1685 | A new NET_BUF structure will be created but the associated data in NET_VECTOR
|
---|
1686 | is shared. This function exists to perform IP packet fragmentation.
|
---|
1687 |
|
---|
1688 | @param[in] Nbuf The pointer to the net buffer to be extracted.
|
---|
1689 | @param[in] Offset Starting point of the data to be included in the new
|
---|
1690 | net buffer.
|
---|
1691 | @param[in] Len The bytes of data to be included in the new net buffer.
|
---|
1692 | @param[in] HeadSpace The bytes of the head space to reserve for the protocol header.
|
---|
1693 |
|
---|
1694 | @return The pointer to the cloned net buffer, or NULL if the
|
---|
1695 | allocation failed due to resource limitations.
|
---|
1696 |
|
---|
1697 | **/
|
---|
1698 | NET_BUF *
|
---|
1699 | EFIAPI
|
---|
1700 | NetbufGetFragment (
|
---|
1701 | IN NET_BUF *Nbuf,
|
---|
1702 | IN UINT32 Offset,
|
---|
1703 | IN UINT32 Len,
|
---|
1704 | IN UINT32 HeadSpace
|
---|
1705 | );
|
---|
1706 |
|
---|
1707 | /**
|
---|
1708 | Reserve some space in the header room of the net buffer.
|
---|
1709 |
|
---|
1710 | Upon allocation, all the space is in the tail room of the buffer. Call this
|
---|
1711 | function to move space to the header room. This function is quite limited
|
---|
1712 | in that it can only reserve space from the first block of an empty NET_BUF not
|
---|
1713 | built from the external. However, it should be enough for the network stack.
|
---|
1714 |
|
---|
1715 | @param[in, out] Nbuf The pointer to the net buffer.
|
---|
1716 | @param[in] Len The length of buffer to be reserved from the header.
|
---|
1717 |
|
---|
1718 | **/
|
---|
1719 | VOID
|
---|
1720 | EFIAPI
|
---|
1721 | NetbufReserve (
|
---|
1722 | IN OUT NET_BUF *Nbuf,
|
---|
1723 | IN UINT32 Len
|
---|
1724 | );
|
---|
1725 |
|
---|
1726 | /**
|
---|
1727 | Allocate Len bytes of space from the header or tail of the buffer.
|
---|
1728 |
|
---|
1729 | @param[in, out] Nbuf The pointer to the net buffer.
|
---|
1730 | @param[in] Len The length of the buffer to be allocated.
|
---|
1731 | @param[in] FromHead The flag to indicate whether to reserve the data
|
---|
1732 | from head (TRUE) or tail (FALSE).
|
---|
1733 |
|
---|
1734 | @return The pointer to the first byte of the allocated buffer,
|
---|
1735 | or NULL, if there is no sufficient space.
|
---|
1736 |
|
---|
1737 | **/
|
---|
1738 | UINT8*
|
---|
1739 | EFIAPI
|
---|
1740 | NetbufAllocSpace (
|
---|
1741 | IN OUT NET_BUF *Nbuf,
|
---|
1742 | IN UINT32 Len,
|
---|
1743 | IN BOOLEAN FromHead
|
---|
1744 | );
|
---|
1745 |
|
---|
1746 | /**
|
---|
1747 | Trim Len bytes from the header or the tail of the net buffer.
|
---|
1748 |
|
---|
1749 | @param[in, out] Nbuf The pointer to the net buffer.
|
---|
1750 | @param[in] Len The length of the data to be trimmed.
|
---|
1751 | @param[in] FromHead The flag to indicate whether trim data is from the
|
---|
1752 | head (TRUE) or the tail (FALSE).
|
---|
1753 |
|
---|
1754 | @return The length of the actual trimmed data, which may be less
|
---|
1755 | than Len if the TotalSize of Nbuf is less than Len.
|
---|
1756 |
|
---|
1757 | **/
|
---|
1758 | UINT32
|
---|
1759 | EFIAPI
|
---|
1760 | NetbufTrim (
|
---|
1761 | IN OUT NET_BUF *Nbuf,
|
---|
1762 | IN UINT32 Len,
|
---|
1763 | IN BOOLEAN FromHead
|
---|
1764 | );
|
---|
1765 |
|
---|
1766 | /**
|
---|
1767 | Copy Len bytes of data from the specific offset of the net buffer to the
|
---|
1768 | destination memory.
|
---|
1769 |
|
---|
1770 | The Len bytes of data may cross several fragments of the net buffer.
|
---|
1771 |
|
---|
1772 | @param[in] Nbuf The pointer to the net buffer.
|
---|
1773 | @param[in] Offset The sequence number of the first byte to copy.
|
---|
1774 | @param[in] Len The length of the data to copy.
|
---|
1775 | @param[in] Dest The destination of the data to copy to.
|
---|
1776 |
|
---|
1777 | @return The length of the actual copied data, or 0 if the offset
|
---|
1778 | specified exceeds the total size of net buffer.
|
---|
1779 |
|
---|
1780 | **/
|
---|
1781 | UINT32
|
---|
1782 | EFIAPI
|
---|
1783 | NetbufCopy (
|
---|
1784 | IN NET_BUF *Nbuf,
|
---|
1785 | IN UINT32 Offset,
|
---|
1786 | IN UINT32 Len,
|
---|
1787 | IN UINT8 *Dest
|
---|
1788 | );
|
---|
1789 |
|
---|
1790 | /**
|
---|
1791 | Build a NET_BUF from external blocks.
|
---|
1792 |
|
---|
1793 | A new NET_BUF structure will be created from external blocks. An additional block
|
---|
1794 | of memory will be allocated to hold reserved HeadSpace bytes of header room
|
---|
1795 | and existing HeadLen bytes of header, but the external blocks are shared by the
|
---|
1796 | net buffer to avoid data copying.
|
---|
1797 |
|
---|
1798 | @param[in] ExtFragment The pointer to the data block.
|
---|
1799 | @param[in] ExtNum The number of the data blocks.
|
---|
1800 | @param[in] HeadSpace The head space to be reserved.
|
---|
1801 | @param[in] HeadLen The length of the protocol header. The function
|
---|
1802 | pulls this amount of data into a linear block.
|
---|
1803 | @param[in] ExtFree The pointer to the caller-provided free function.
|
---|
1804 | @param[in] Arg The argument passed to ExtFree when ExtFree is
|
---|
1805 | called.
|
---|
1806 |
|
---|
1807 | @return The pointer to the net buffer built from the data blocks,
|
---|
1808 | or NULL if the allocation failed due to resource
|
---|
1809 | limit.
|
---|
1810 |
|
---|
1811 | **/
|
---|
1812 | NET_BUF *
|
---|
1813 | EFIAPI
|
---|
1814 | NetbufFromExt (
|
---|
1815 | IN NET_FRAGMENT *ExtFragment,
|
---|
1816 | IN UINT32 ExtNum,
|
---|
1817 | IN UINT32 HeadSpace,
|
---|
1818 | IN UINT32 HeadLen,
|
---|
1819 | IN NET_VECTOR_EXT_FREE ExtFree,
|
---|
1820 | IN VOID *Arg OPTIONAL
|
---|
1821 | );
|
---|
1822 |
|
---|
1823 | /**
|
---|
1824 | Build a fragment table to contain the fragments in the net buffer. This is the
|
---|
1825 | opposite operation of the NetbufFromExt.
|
---|
1826 |
|
---|
1827 | @param[in] Nbuf Points to the net buffer.
|
---|
1828 | @param[in, out] ExtFragment The pointer to the data block.
|
---|
1829 | @param[in, out] ExtNum The number of the data blocks.
|
---|
1830 |
|
---|
1831 | @retval EFI_BUFFER_TOO_SMALL The number of non-empty blocks is bigger than
|
---|
1832 | ExtNum.
|
---|
1833 | @retval EFI_SUCCESS The fragment table was built successfully.
|
---|
1834 |
|
---|
1835 | **/
|
---|
1836 | EFI_STATUS
|
---|
1837 | EFIAPI
|
---|
1838 | NetbufBuildExt (
|
---|
1839 | IN NET_BUF *Nbuf,
|
---|
1840 | IN OUT NET_FRAGMENT *ExtFragment,
|
---|
1841 | IN OUT UINT32 *ExtNum
|
---|
1842 | );
|
---|
1843 |
|
---|
1844 | /**
|
---|
1845 | Build a net buffer from a list of net buffers.
|
---|
1846 |
|
---|
1847 | All the fragments will be collected from the list of NEW_BUF, and then a new
|
---|
1848 | net buffer will be created through NetbufFromExt.
|
---|
1849 |
|
---|
1850 | @param[in] BufList A List of the net buffer.
|
---|
1851 | @param[in] HeadSpace The head space to be reserved.
|
---|
1852 | @param[in] HeaderLen The length of the protocol header. The function
|
---|
1853 | pulls this amount of data into a linear block.
|
---|
1854 | @param[in] ExtFree The pointer to the caller provided free function.
|
---|
1855 | @param[in] Arg The argument passed to ExtFree when ExtFree is called.
|
---|
1856 |
|
---|
1857 | @return The pointer to the net buffer built from the list of net
|
---|
1858 | buffers.
|
---|
1859 |
|
---|
1860 | **/
|
---|
1861 | NET_BUF *
|
---|
1862 | EFIAPI
|
---|
1863 | NetbufFromBufList (
|
---|
1864 | IN LIST_ENTRY *BufList,
|
---|
1865 | IN UINT32 HeadSpace,
|
---|
1866 | IN UINT32 HeaderLen,
|
---|
1867 | IN NET_VECTOR_EXT_FREE ExtFree,
|
---|
1868 | IN VOID *Arg OPTIONAL
|
---|
1869 | );
|
---|
1870 |
|
---|
1871 | /**
|
---|
1872 | Free a list of net buffers.
|
---|
1873 |
|
---|
1874 | @param[in, out] Head The pointer to the head of linked net buffers.
|
---|
1875 |
|
---|
1876 | **/
|
---|
1877 | VOID
|
---|
1878 | EFIAPI
|
---|
1879 | NetbufFreeList (
|
---|
1880 | IN OUT LIST_ENTRY *Head
|
---|
1881 | );
|
---|
1882 |
|
---|
1883 | /**
|
---|
1884 | Initiate the net buffer queue.
|
---|
1885 |
|
---|
1886 | @param[in, out] NbufQue The pointer to the net buffer queue to be initialized.
|
---|
1887 |
|
---|
1888 | **/
|
---|
1889 | VOID
|
---|
1890 | EFIAPI
|
---|
1891 | NetbufQueInit (
|
---|
1892 | IN OUT NET_BUF_QUEUE *NbufQue
|
---|
1893 | );
|
---|
1894 |
|
---|
1895 | /**
|
---|
1896 | Allocate and initialize a net buffer queue.
|
---|
1897 |
|
---|
1898 | @return The pointer to the allocated net buffer queue, or NULL if the
|
---|
1899 | allocation failed due to resource limit.
|
---|
1900 |
|
---|
1901 | **/
|
---|
1902 | NET_BUF_QUEUE *
|
---|
1903 | EFIAPI
|
---|
1904 | NetbufQueAlloc (
|
---|
1905 | VOID
|
---|
1906 | );
|
---|
1907 |
|
---|
1908 | /**
|
---|
1909 | Free a net buffer queue.
|
---|
1910 |
|
---|
1911 | Decrease the reference count of the net buffer queue by one. The real resource
|
---|
1912 | free operation isn't performed until the reference count of the net buffer
|
---|
1913 | queue is decreased to 0.
|
---|
1914 |
|
---|
1915 | @param[in] NbufQue The pointer to the net buffer queue to be freed.
|
---|
1916 |
|
---|
1917 | **/
|
---|
1918 | VOID
|
---|
1919 | EFIAPI
|
---|
1920 | NetbufQueFree (
|
---|
1921 | IN NET_BUF_QUEUE *NbufQue
|
---|
1922 | );
|
---|
1923 |
|
---|
1924 | /**
|
---|
1925 | Remove a net buffer from the head in the specific queue and return it.
|
---|
1926 |
|
---|
1927 | @param[in, out] NbufQue The pointer to the net buffer queue.
|
---|
1928 |
|
---|
1929 | @return The pointer to the net buffer removed from the specific queue,
|
---|
1930 | or NULL if there is no net buffer in the specific queue.
|
---|
1931 |
|
---|
1932 | **/
|
---|
1933 | NET_BUF *
|
---|
1934 | EFIAPI
|
---|
1935 | NetbufQueRemove (
|
---|
1936 | IN OUT NET_BUF_QUEUE *NbufQue
|
---|
1937 | );
|
---|
1938 |
|
---|
1939 | /**
|
---|
1940 | Append a net buffer to the net buffer queue.
|
---|
1941 |
|
---|
1942 | @param[in, out] NbufQue The pointer to the net buffer queue.
|
---|
1943 | @param[in, out] Nbuf The pointer to the net buffer to be appended.
|
---|
1944 |
|
---|
1945 | **/
|
---|
1946 | VOID
|
---|
1947 | EFIAPI
|
---|
1948 | NetbufQueAppend (
|
---|
1949 | IN OUT NET_BUF_QUEUE *NbufQue,
|
---|
1950 | IN OUT NET_BUF *Nbuf
|
---|
1951 | );
|
---|
1952 |
|
---|
1953 | /**
|
---|
1954 | Copy Len bytes of data from the net buffer queue at the specific offset to the
|
---|
1955 | destination memory.
|
---|
1956 |
|
---|
1957 | The copying operation is the same as NetbufCopy, but applies to the net buffer
|
---|
1958 | queue instead of the net buffer.
|
---|
1959 |
|
---|
1960 | @param[in] NbufQue The pointer to the net buffer queue.
|
---|
1961 | @param[in] Offset The sequence number of the first byte to copy.
|
---|
1962 | @param[in] Len The length of the data to copy.
|
---|
1963 | @param[out] Dest The destination of the data to copy to.
|
---|
1964 |
|
---|
1965 | @return The length of the actual copied data, or 0 if the offset
|
---|
1966 | specified exceeds the total size of net buffer queue.
|
---|
1967 |
|
---|
1968 | **/
|
---|
1969 | UINT32
|
---|
1970 | EFIAPI
|
---|
1971 | NetbufQueCopy (
|
---|
1972 | IN NET_BUF_QUEUE *NbufQue,
|
---|
1973 | IN UINT32 Offset,
|
---|
1974 | IN UINT32 Len,
|
---|
1975 | OUT UINT8 *Dest
|
---|
1976 | );
|
---|
1977 |
|
---|
1978 | /**
|
---|
1979 | Trim Len bytes of data from the buffer queue and free any net buffer
|
---|
1980 | that is completely trimmed.
|
---|
1981 |
|
---|
1982 | The trimming operation is the same as NetbufTrim but applies to the net buffer
|
---|
1983 | queue instead of the net buffer.
|
---|
1984 |
|
---|
1985 | @param[in, out] NbufQue The pointer to the net buffer queue.
|
---|
1986 | @param[in] Len The length of the data to trim.
|
---|
1987 |
|
---|
1988 | @return The actual length of the data trimmed.
|
---|
1989 |
|
---|
1990 | **/
|
---|
1991 | UINT32
|
---|
1992 | EFIAPI
|
---|
1993 | NetbufQueTrim (
|
---|
1994 | IN OUT NET_BUF_QUEUE *NbufQue,
|
---|
1995 | IN UINT32 Len
|
---|
1996 | );
|
---|
1997 |
|
---|
1998 |
|
---|
1999 | /**
|
---|
2000 | Flush the net buffer queue.
|
---|
2001 |
|
---|
2002 | @param[in, out] NbufQue The pointer to the queue to be flushed.
|
---|
2003 |
|
---|
2004 | **/
|
---|
2005 | VOID
|
---|
2006 | EFIAPI
|
---|
2007 | NetbufQueFlush (
|
---|
2008 | IN OUT NET_BUF_QUEUE *NbufQue
|
---|
2009 | );
|
---|
2010 |
|
---|
2011 | /**
|
---|
2012 | Compute the checksum for a bulk of data.
|
---|
2013 |
|
---|
2014 | @param[in] Bulk The pointer to the data.
|
---|
2015 | @param[in] Len The length of the data, in bytes.
|
---|
2016 |
|
---|
2017 | @return The computed checksum.
|
---|
2018 |
|
---|
2019 | **/
|
---|
2020 | UINT16
|
---|
2021 | EFIAPI
|
---|
2022 | NetblockChecksum (
|
---|
2023 | IN UINT8 *Bulk,
|
---|
2024 | IN UINT32 Len
|
---|
2025 | );
|
---|
2026 |
|
---|
2027 | /**
|
---|
2028 | Add two checksums.
|
---|
2029 |
|
---|
2030 | @param[in] Checksum1 The first checksum to be added.
|
---|
2031 | @param[in] Checksum2 The second checksum to be added.
|
---|
2032 |
|
---|
2033 | @return The new checksum.
|
---|
2034 |
|
---|
2035 | **/
|
---|
2036 | UINT16
|
---|
2037 | EFIAPI
|
---|
2038 | NetAddChecksum (
|
---|
2039 | IN UINT16 Checksum1,
|
---|
2040 | IN UINT16 Checksum2
|
---|
2041 | );
|
---|
2042 |
|
---|
2043 | /**
|
---|
2044 | Compute the checksum for a NET_BUF.
|
---|
2045 |
|
---|
2046 | @param[in] Nbuf The pointer to the net buffer.
|
---|
2047 |
|
---|
2048 | @return The computed checksum.
|
---|
2049 |
|
---|
2050 | **/
|
---|
2051 | UINT16
|
---|
2052 | EFIAPI
|
---|
2053 | NetbufChecksum (
|
---|
2054 | IN NET_BUF *Nbuf
|
---|
2055 | );
|
---|
2056 |
|
---|
2057 | /**
|
---|
2058 | Compute the checksum for TCP/UDP pseudo header.
|
---|
2059 |
|
---|
2060 | Src and Dst are in network byte order, and Len is in host byte order.
|
---|
2061 |
|
---|
2062 | @param[in] Src The source address of the packet.
|
---|
2063 | @param[in] Dst The destination address of the packet.
|
---|
2064 | @param[in] Proto The protocol type of the packet.
|
---|
2065 | @param[in] Len The length of the packet.
|
---|
2066 |
|
---|
2067 | @return The computed checksum.
|
---|
2068 |
|
---|
2069 | **/
|
---|
2070 | UINT16
|
---|
2071 | EFIAPI
|
---|
2072 | NetPseudoHeadChecksum (
|
---|
2073 | IN IP4_ADDR Src,
|
---|
2074 | IN IP4_ADDR Dst,
|
---|
2075 | IN UINT8 Proto,
|
---|
2076 | IN UINT16 Len
|
---|
2077 | );
|
---|
2078 |
|
---|
2079 | /**
|
---|
2080 | Compute the checksum for the TCP6/UDP6 pseudo header.
|
---|
2081 |
|
---|
2082 | Src and Dst are in network byte order, and Len is in host byte order.
|
---|
2083 |
|
---|
2084 | @param[in] Src The source address of the packet.
|
---|
2085 | @param[in] Dst The destination address of the packet.
|
---|
2086 | @param[in] NextHeader The protocol type of the packet.
|
---|
2087 | @param[in] Len The length of the packet.
|
---|
2088 |
|
---|
2089 | @return The computed checksum.
|
---|
2090 |
|
---|
2091 | **/
|
---|
2092 | UINT16
|
---|
2093 | EFIAPI
|
---|
2094 | NetIp6PseudoHeadChecksum (
|
---|
2095 | IN EFI_IPv6_ADDRESS *Src,
|
---|
2096 | IN EFI_IPv6_ADDRESS *Dst,
|
---|
2097 | IN UINT8 NextHeader,
|
---|
2098 | IN UINT32 Len
|
---|
2099 | );
|
---|
2100 |
|
---|
2101 | /**
|
---|
2102 | The function frees the net buffer which allocated by the IP protocol. It releases
|
---|
2103 | only the net buffer and doesn't call the external free function.
|
---|
2104 |
|
---|
2105 | This function should be called after finishing the process of mIpSec->ProcessExt()
|
---|
2106 | for outbound traffic. The (EFI_IPSEC2_PROTOCOL)->ProcessExt() allocates a new
|
---|
2107 | buffer for the ESP, so there needs a function to free the old net buffer.
|
---|
2108 |
|
---|
2109 | @param[in] Nbuf The network buffer to be freed.
|
---|
2110 |
|
---|
2111 | **/
|
---|
2112 | VOID
|
---|
2113 | NetIpSecNetbufFree (
|
---|
2114 | NET_BUF *Nbuf
|
---|
2115 | );
|
---|
2116 |
|
---|
2117 | /**
|
---|
2118 | This function obtains the system guid from the smbios table.
|
---|
2119 |
|
---|
2120 | @param[out] SystemGuid The pointer of the returned system guid.
|
---|
2121 |
|
---|
2122 | @retval EFI_SUCCESS Successfully obtained the system guid.
|
---|
2123 | @retval EFI_NOT_FOUND Did not find the SMBIOS table.
|
---|
2124 |
|
---|
2125 | **/
|
---|
2126 | EFI_STATUS
|
---|
2127 | EFIAPI
|
---|
2128 | NetLibGetSystemGuid (
|
---|
2129 | OUT EFI_GUID *SystemGuid
|
---|
2130 | );
|
---|
2131 |
|
---|
2132 | #endif
|
---|