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