]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Include/Library/NetLib.h
Add a MACRO IP6_IS_MULTICAST.
[mirror_edk2.git] / MdeModulePkg / Include / Library / NetLib.h
1 /** @file
2 Ihis 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 - 2009, Intel Corporation
6 All rights reserved. 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
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 typedef UINT32 IP4_ADDR;
20 typedef UINT32 TCP_SEQNO;
21 typedef UINT16 TCP_PORTNO;
22
23 typedef enum {
24 NET_ETHER_ADDR_LEN = 6,
25 NET_IFTYPE_ETHERNET = 0x01,
26
27 EFI_IP_PROTO_UDP = 0x11,
28 EFI_IP_PROTO_TCP = 0x06,
29 EFI_IP_PROTO_ICMP = 0x01,
30
31 //
32 // The address classification
33 //
34 IP4_ADDR_CLASSA = 1,
35 IP4_ADDR_CLASSB,
36 IP4_ADDR_CLASSC,
37 IP4_ADDR_CLASSD,
38 IP4_ADDR_CLASSE,
39
40 IP4_MASK_NUM = 33
41 } IP4_CLASS_TYPE;
42
43 #pragma pack(1)
44
45 //
46 // Ethernet head definition
47 //
48 typedef struct {
49 UINT8 DstMac [NET_ETHER_ADDR_LEN];
50 UINT8 SrcMac [NET_ETHER_ADDR_LEN];
51 UINT16 EtherType;
52 } ETHER_HEAD;
53
54
55 //
56 // The EFI_IP4_HEADER is hard to use because the source and
57 // destination address are defined as EFI_IPv4_ADDRESS, which
58 // is a structure. Two structures can't be compared or masked
59 // directly. This is why there is an internal representation.
60 //
61 typedef struct {
62 UINT8 HeadLen : 4;
63 UINT8 Ver : 4;
64 UINT8 Tos;
65 UINT16 TotalLen;
66 UINT16 Id;
67 UINT16 Fragment;
68 UINT8 Ttl;
69 UINT8 Protocol;
70 UINT16 Checksum;
71 IP4_ADDR Src;
72 IP4_ADDR Dst;
73 } IP4_HEAD;
74
75
76 //
77 // ICMP head definition. Each ICMP message is categorized as either an error
78 // message or query message. Two message types have their own head format.
79 //
80 typedef struct {
81 UINT8 Type;
82 UINT8 Code;
83 UINT16 Checksum;
84 } IP4_ICMP_HEAD;
85
86 typedef struct {
87 IP4_ICMP_HEAD Head;
88 UINT32 Fourth; // 4th filed of the head, it depends on Type.
89 IP4_HEAD IpHead;
90 } IP4_ICMP_ERROR_HEAD;
91
92 typedef struct {
93 IP4_ICMP_HEAD Head;
94 UINT16 Id;
95 UINT16 Seq;
96 } IP4_ICMP_QUERY_HEAD;
97
98
99 //
100 // UDP header definition
101 //
102 typedef struct {
103 UINT16 SrcPort;
104 UINT16 DstPort;
105 UINT16 Length;
106 UINT16 Checksum;
107 } EFI_UDP4_HEADER;
108
109
110 //
111 // TCP header definition
112 //
113 typedef struct {
114 TCP_PORTNO SrcPort;
115 TCP_PORTNO DstPort;
116 TCP_SEQNO Seq;
117 TCP_SEQNO Ack;
118 UINT8 Res : 4;
119 UINT8 HeadLen : 4;
120 UINT8 Flag;
121 UINT16 Wnd;
122 UINT16 Checksum;
123 UINT16 Urg;
124 } TCP_HEAD;
125
126 #pragma pack()
127
128 #define NET_MAC_EQUAL(pMac1, pMac2, Len) \
129 (CompareMem ((pMac1), (pMac2), Len) == 0)
130
131 #define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \
132 (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))
133
134 #define NTOHL(x) (UINT32)((((UINT32) (x) & 0xff) << 24) | \
135 (((UINT32) (x) & 0xff00) << 8) | \
136 (((UINT32) (x) & 0xff0000) >> 8) | \
137 (((UINT32) (x) & 0xff000000) >> 24))
138
139 #define HTONL(x) NTOHL(x)
140
141 #define NTOHS(x) (UINT16)((((UINT16) (x) & 0xff) << 8) | \
142 (((UINT16) (x) & 0xff00) >> 8))
143
144 #define HTONS(x) NTOHS(x)
145
146 //
147 // Test the IP's attribute, All the IPs are in host byte order.
148 //
149 #define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)
150 #define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)
151 #define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))
152 #define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != IP4_MASK_NUM)
153
154 #define IP6_IS_MULTICAST(Ip6) (((Ip6)->Addr[0]) == 0xFF)
155
156 //
157 // Convert the EFI_IP4_ADDRESS to plain UINT32 IP4 address.
158 //
159 #define EFI_IP4(EfiIpAddr) (*(IP4_ADDR *) ((EfiIpAddr).Addr))
160 #define EFI_NTOHL(EfiIp) (NTOHL (EFI_IP4 ((EfiIp))))
161 #define EFI_IP4_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)
162
163 /**
164 Return the length of the mask.
165
166 Return the length of the mask. Valid values are 0 to 32.
167 If the mask is invalid, return the invalid length 33, which is IP4_MASK_NUM.
168 NetMask is in the host byte order.
169
170 @param[in] NetMask The netmask to get the length from.
171
172 @return The length of the netmask, or IP4_MASK_NUM (33) if the mask is invalid.
173
174 **/
175 INTN
176 EFIAPI
177 NetGetMaskLength (
178 IN IP4_ADDR NetMask
179 );
180
181 /**
182 Return the class of the IP address, such as class A, B, C.
183 Addr is in host byte order.
184
185 The address of class A starts with 0.
186 If the address belong to class A, return IP4_ADDR_CLASSA.
187 The address of class B starts with 10.
188 If the address belong to class B, return IP4_ADDR_CLASSB.
189 The address of class C starts with 110.
190 If the address belong to class C, return IP4_ADDR_CLASSC.
191 The address of class D starts with 1110.
192 If the address belong to class D, return IP4_ADDR_CLASSD.
193 The address of class E starts with 1111.
194 If the address belong to class E, return IP4_ADDR_CLASSE.
195
196
197 @param[in] Addr The address to get the class from.
198
199 @return IP address class, such as IP4_ADDR_CLASSA.
200
201 **/
202 INTN
203 EFIAPI
204 NetGetIpClass (
205 IN IP4_ADDR Addr
206 );
207
208 /**
209 Check whether the IP is a valid unicast address according to
210 the netmask. If NetMask is zero, use the IP address's class to get the default mask.
211
212 If Ip is 0, IP is not a valid unicast address.
213 Class D address is used for multicasting and class E address is reserved for future. If Ip
214 belongs to class D or class E, Ip is not a valid unicast address.
215 If all bits of the host address of Ip are 0 or 1, Ip is not a valid unicast address.
216
217 @param[in] Ip The IP to check against.
218 @param[in] NetMask The mask of the IP.
219
220 @return TRUE if Ip is a valid unicast address on the network, otherwise FALSE.
221
222 **/
223 BOOLEAN
224 EFIAPI
225 Ip4IsUnicast (
226 IN IP4_ADDR Ip,
227 IN IP4_ADDR NetMask
228 );
229
230 extern IP4_ADDR gIp4AllMasks[IP4_MASK_NUM];
231
232
233 extern EFI_IPv4_ADDRESS mZeroIp4Addr;
234
235 #define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9'))
236 #define NET_ROUNDUP(size, unit) (((size) + (unit) - 1) & (~((unit) - 1)))
237 #define NET_IS_LOWER_CASE_CHAR(Ch) (('a' <= (Ch)) && ((Ch) <= 'z'))
238 #define NET_IS_UPPER_CASE_CHAR(Ch) (('A' <= (Ch)) && ((Ch) <= 'Z'))
239
240 #define TICKS_PER_MS 10000U
241 #define TICKS_PER_SECOND 10000000U
242
243 #define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
244
245 /**
246 Extract a UINT32 from a byte stream.
247
248 This function copies a UINT32 from a byte stream, and then converts it from Network
249 byte order to host byte order. Use this function to avoid alignment error.
250
251 @param[in] Buf The buffer to extract the UINT32.
252
253 @return The UINT32 extracted.
254
255 **/
256 UINT32
257 EFIAPI
258 NetGetUint32 (
259 IN UINT8 *Buf
260 );
261
262 /**
263 Puts a UINT32 into the byte stream in network byte order.
264
265 Converts a UINT32 from host byte order to network byte order, and then copies it to the
266 byte stream.
267
268 @param[in, out] Buf The buffer to put the UINT32.
269 @param[in] Data The data to put.
270
271 **/
272 VOID
273 EFIAPI
274 NetPutUint32 (
275 IN OUT UINT8 *Buf,
276 IN UINT32 Data
277 );
278
279 /**
280 Initialize a random seed using current time.
281
282 Get current time first. Then initialize a random seed based on some basic
283 mathematical operations on the hour, day, minute, second, nanosecond and year
284 of the current time.
285
286 @return The random seed, initialized with current time.
287
288 **/
289 UINT32
290 EFIAPI
291 NetRandomInitSeed (
292 VOID
293 );
294
295
296 #define NET_LIST_USER_STRUCT(Entry, Type, Field) \
297 BASE_CR(Entry, Type, Field)
298
299 #define NET_LIST_USER_STRUCT_S(Entry, Type, Field, Sig) \
300 CR(Entry, Type, Field, Sig)
301
302 //
303 // Iterate through the double linked list. It is NOT delete safe
304 //
305 #define NET_LIST_FOR_EACH(Entry, ListHead) \
306 for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
307
308 //
309 // Iterate through the double linked list. This is delete-safe.
310 // Don't touch NextEntry. Also, don't use this macro if list
311 // entries other than the Entry may be deleted when processing
312 // the current Entry.
313 //
314 #define NET_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
315 for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink; \
316 Entry != (ListHead); \
317 Entry = NextEntry, NextEntry = Entry->ForwardLink \
318 )
319
320 //
321 // Make sure the list isn't empty before getting the first/last record.
322 //
323 #define NET_LIST_HEAD(ListHead, Type, Field) \
324 NET_LIST_USER_STRUCT((ListHead)->ForwardLink, Type, Field)
325
326 #define NET_LIST_TAIL(ListHead, Type, Field) \
327 NET_LIST_USER_STRUCT((ListHead)->BackLink, Type, Field)
328
329
330 /**
331 Remove the first node entry on the list, and return the removed node entry.
332
333 Removes the first node entry from a doubly linked list. It is up to the caller of
334 this function to release the memory used by the first node, if that is required. On
335 exit, the removed node is returned.
336
337 If Head is NULL, then ASSERT().
338 If Head was not initialized, then ASSERT().
339 If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
340 linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,
341 then ASSERT().
342
343 @param[in, out] Head The list header.
344
345 @return The first node entry that is removed from the list, NULL if the list is empty.
346
347 **/
348 LIST_ENTRY *
349 EFIAPI
350 NetListRemoveHead (
351 IN OUT LIST_ENTRY *Head
352 );
353
354 /**
355 Remove the last node entry on the list and return the removed node entry.
356
357 Removes the last node entry from a doubly linked list. It is up to the caller of
358 this function to release the memory used by the first node, if that is required. On
359 exit, the removed node is returned.
360
361 If Head is NULL, then ASSERT().
362 If Head was not initialized, then ASSERT().
363 If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
364 linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,
365 then ASSERT().
366
367 @param[in, out] Head The list head.
368
369 @return The last node entry that is removed from the list, NULL if the list is empty.
370
371 **/
372 LIST_ENTRY *
373 EFIAPI
374 NetListRemoveTail (
375 IN OUT LIST_ENTRY *Head
376 );
377
378 /**
379 Insert a new node entry after a designated node entry of a doubly linked list.
380
381 Inserts a new node entry designated by NewEntry after the node entry designated by PrevEntry
382 of the doubly linked list.
383
384 @param[in, out] PrevEntry The entry after which to insert.
385 @param[in, out] NewEntry The new entry to insert.
386
387 **/
388 VOID
389 EFIAPI
390 NetListInsertAfter (
391 IN OUT LIST_ENTRY *PrevEntry,
392 IN OUT LIST_ENTRY *NewEntry
393 );
394
395 /**
396 Insert a new node entry before a designated node entry of a doubly linked list.
397
398 Inserts a new node entry designated by NewEntry before the node entry designated by PostEntry
399 of the doubly linked list.
400
401 @param[in, out] PostEntry The entry to insert before.
402 @param[in, out] NewEntry The new entry to insert.
403
404 **/
405 VOID
406 EFIAPI
407 NetListInsertBefore (
408 IN OUT LIST_ENTRY *PostEntry,
409 IN OUT LIST_ENTRY *NewEntry
410 );
411
412
413 //
414 // Object container: EFI network stack spec defines various kinds of
415 // tokens. The drivers can share code to manage those objects.
416 //
417 typedef struct {
418 LIST_ENTRY Link;
419 VOID *Key;
420 VOID *Value;
421 } NET_MAP_ITEM;
422
423 typedef struct {
424 LIST_ENTRY Used;
425 LIST_ENTRY Recycled;
426 UINTN Count;
427 } NET_MAP;
428
429 #define NET_MAP_INCREAMENT 64
430
431 /**
432 Initialize the netmap. Netmap is a reposity to keep the <Key, Value> pairs.
433
434 Initialize the forward and backward links of two head nodes donated by Map->Used
435 and Map->Recycled of two doubly linked lists.
436 Initializes the count of the <Key, Value> pairs in the netmap to zero.
437
438 If Map is NULL, then ASSERT().
439 If the address of Map->Used is NULL, then ASSERT().
440 If the address of Map->Recycled is NULl, then ASSERT().
441
442 @param[in, out] Map The netmap to initialize.
443
444 **/
445 VOID
446 EFIAPI
447 NetMapInit (
448 IN OUT NET_MAP *Map
449 );
450
451 /**
452 To clean up the netmap, that is, release allocated memories.
453
454 Removes all nodes of the Used doubly linked list and frees memory of all related netmap items.
455 Removes all nodes of the Recycled doubly linked list and free memory of all related netmap items.
456 The number of the <Key, Value> pairs in the netmap is set to zero.
457
458 If Map is NULL, then ASSERT().
459
460 @param[in, out] Map The netmap to clean up.
461
462 **/
463 VOID
464 EFIAPI
465 NetMapClean (
466 IN OUT NET_MAP *Map
467 );
468
469 /**
470 Test whether the netmap is empty and return true if it is.
471
472 If the number of the <Key, Value> pairs in the netmap is zero, return TRUE.
473
474 If Map is NULL, then ASSERT().
475
476
477 @param[in] Map The net map to test.
478
479 @return TRUE if the netmap is empty, otherwise FALSE.
480
481 **/
482 BOOLEAN
483 EFIAPI
484 NetMapIsEmpty (
485 IN NET_MAP *Map
486 );
487
488 /**
489 Return the number of the <Key, Value> pairs in the netmap.
490
491 @param[in] Map The netmap to get the entry number.
492
493 @return The entry number in the netmap.
494
495 **/
496 UINTN
497 EFIAPI
498 NetMapGetCount (
499 IN NET_MAP *Map
500 );
501
502 /**
503 Allocate an item to save the <Key, Value> pair to the head of the netmap.
504
505 Allocate an item to save the <Key, Value> pair and add corresponding node entry
506 to the beginning of the Used doubly linked list. The number of the <Key, Value>
507 pairs in the netmap increase by 1.
508
509 If Map is NULL, then ASSERT().
510
511 @param[in, out] Map The netmap to insert into.
512 @param[in] Key The user's key.
513 @param[in] Value The user's value for the key.
514
515 @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.
516 @retval EFI_SUCCESS The item is inserted to the head.
517
518 **/
519 EFI_STATUS
520 EFIAPI
521 NetMapInsertHead (
522 IN OUT NET_MAP *Map,
523 IN VOID *Key,
524 IN VOID *Value OPTIONAL
525 );
526
527 /**
528 Allocate an item to save the <Key, Value> pair to the tail of the netmap.
529
530 Allocate an item to save the <Key, Value> pair and add corresponding node entry
531 to the tail of the Used doubly linked list. The number of the <Key, Value>
532 pairs in the netmap increase by 1.
533
534 If Map is NULL, then ASSERT().
535
536 @param[in, out] Map The netmap to insert into.
537 @param[in] Key The user's key.
538 @param[in] Value The user's value for the key.
539
540 @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.
541 @retval EFI_SUCCESS The item is inserted to the tail.
542
543 **/
544 EFI_STATUS
545 EFIAPI
546 NetMapInsertTail (
547 IN OUT NET_MAP *Map,
548 IN VOID *Key,
549 IN VOID *Value OPTIONAL
550 );
551
552 /**
553 Finds the key in the netmap and returns the point to the item containing the Key.
554
555 Iterate the Used doubly linked list of the netmap to get every item. Compare the key of every
556 item with the key to search. It returns the point to the item contains the Key if found.
557
558 If Map is NULL, then ASSERT().
559
560 @param[in] Map The netmap to search within.
561 @param[in] Key The key to search.
562
563 @return The point to the item contains the Key, or NULL if Key isn't in the map.
564
565 **/
566 NET_MAP_ITEM *
567 EFIAPI
568 NetMapFindKey (
569 IN NET_MAP *Map,
570 IN VOID *Key
571 );
572
573 /**
574 Remove the node entry of the item from the netmap and return the key of the removed item.
575
576 Remove the node entry of the item from the Used doubly linked list of the netmap.
577 The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
578 entry of the item to the Recycled doubly linked list of the netmap. If Value is not NULL,
579 Value will point to the value of the item. It returns the key of the removed item.
580
581 If Map is NULL, then ASSERT().
582 If Item is NULL, then ASSERT().
583 if item in not in the netmap, then ASSERT().
584
585 @param[in, out] Map The netmap to remove the item from.
586 @param[in, out] Item The item to remove.
587 @param[out] Value The variable to receive the value if not NULL.
588
589 @return The key of the removed item.
590
591 **/
592 VOID *
593 EFIAPI
594 NetMapRemoveItem (
595 IN OUT NET_MAP *Map,
596 IN OUT NET_MAP_ITEM *Item,
597 OUT VOID **Value OPTIONAL
598 );
599
600 /**
601 Remove the first node entry on the netmap and return the key of the removed item.
602
603 Remove the first node entry from the Used doubly linked list of the netmap.
604 The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
605 entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,
606 parameter Value will point to the value of the item. It returns the key of the removed item.
607
608 If Map is NULL, then ASSERT().
609 If the Used doubly linked list is empty, then ASSERT().
610
611 @param[in, out] Map The netmap to remove the head from.
612 @param[out] Value The variable to receive the value if not NULL.
613
614 @return The key of the item removed.
615
616 **/
617 VOID *
618 EFIAPI
619 NetMapRemoveHead (
620 IN OUT NET_MAP *Map,
621 OUT VOID **Value OPTIONAL
622 );
623
624 /**
625 Remove the last node entry on the netmap and return the key of the removed item.
626
627 Remove the last node entry from the Used doubly linked list of the netmap.
628 The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
629 entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,
630 parameter Value will point to the value of the item. It returns the key of the removed item.
631
632 If Map is NULL, then ASSERT().
633 If the Used doubly linked list is empty, then ASSERT().
634
635 @param[in, out] Map The netmap to remove the tail from.
636 @param[out] Value The variable to receive the value if not NULL.
637
638 @return The key of the item removed.
639
640 **/
641 VOID *
642 EFIAPI
643 NetMapRemoveTail (
644 IN OUT NET_MAP *Map,
645 OUT VOID **Value OPTIONAL
646 );
647
648 typedef
649 EFI_STATUS
650 (*NET_MAP_CALLBACK) (
651 IN NET_MAP *Map,
652 IN NET_MAP_ITEM *Item,
653 IN VOID *Arg
654 );
655
656 /**
657 Iterate through the netmap and call CallBack for each item.
658
659 It will contiue the traverse if CallBack returns EFI_SUCCESS, otherwise, break
660 from the loop. It returns the CallBack's last return value. This function is
661 delete safe for the current item.
662
663 If Map is NULL, then ASSERT().
664 If CallBack is NULL, then ASSERT().
665
666 @param[in] Map The Map to iterate through.
667 @param[in] CallBack The callback function to call for each item.
668 @param[in] Arg The opaque parameter to the callback.
669
670 @retval EFI_SUCCESS There is no item in the netmap or CallBack for each item
671 return EFI_SUCCESS.
672 @retval Others It returns the CallBack's last return value.
673
674 **/
675 EFI_STATUS
676 EFIAPI
677 NetMapIterate (
678 IN NET_MAP *Map,
679 IN NET_MAP_CALLBACK CallBack,
680 IN VOID *Arg
681 );
682
683
684 //
685 // Helper functions to implement driver binding and service binding protocols.
686 //
687 /**
688 Create a child of the service that is identified by ServiceBindingGuid.
689
690 Get the ServiceBinding Protocol first, then use it to create a child.
691
692 If ServiceBindingGuid is NULL, then ASSERT().
693 If ChildHandle is NULL, then ASSERT().
694
695 @param[in] Controller The controller which has the service installed.
696 @param[in] Image The image handle used to open service.
697 @param[in] ServiceBindingGuid The service's Guid.
698 @param[in, out] ChildHandle The handle to receive the created child.
699
700 @retval EFI_SUCCESS The child was successfully created.
701 @retval Others Failed to create the child.
702
703 **/
704 EFI_STATUS
705 EFIAPI
706 NetLibCreateServiceChild (
707 IN EFI_HANDLE Controller,
708 IN EFI_HANDLE Image,
709 IN EFI_GUID *ServiceBindingGuid,
710 IN OUT EFI_HANDLE *ChildHandle
711 );
712
713 /**
714 Destroy a child of the service that is identified by ServiceBindingGuid.
715
716 Get the ServiceBinding Protocol first, then use it to destroy a child.
717
718 If ServiceBindingGuid is NULL, then ASSERT().
719
720 @param[in] Controller The controller which has the service installed.
721 @param[in] Image The image handle used to open service.
722 @param[in] ServiceBindingGuid The service's Guid.
723 @param[in] ChildHandle The child to destroy.
724
725 @retval EFI_SUCCESS The child is successfully destroyed.
726 @retval Others Failed to destroy the child.
727
728 **/
729 EFI_STATUS
730 EFIAPI
731 NetLibDestroyServiceChild (
732 IN EFI_HANDLE Controller,
733 IN EFI_HANDLE Image,
734 IN EFI_GUID *ServiceBindingGuid,
735 IN EFI_HANDLE ChildHandle
736 );
737
738 /**
739 Convert the mac address of the simple network protocol installed on
740 SnpHandle to a unicode string. Callers are responsible for freeing the
741 string storage.
742
743 Get the mac address of the Simple Network protocol from the SnpHandle. Then convert
744 the mac address into a unicode string. It takes 2 unicode characters to represent
745 a 1 byte binary buffer, plus one unicode character for the null terminator.
746
747
748 @param[in] SnpHandle The handle on which the simple network protocol is
749 installed.
750 @param[in] ImageHandle The image handle to act as the agent handle to
751 get the simple network protocol.
752 @param[out] MacString The pointer to store the address of the string
753 representation of the mac address.
754
755 @retval EFI_SUCCESS Converted the mac address a unicode string successfully.
756 @retval EFI_OUT_OF_RESOURCES There are not enough memory resources.
757 @retval Others Failed to open the simple network protocol.
758
759 **/
760 EFI_STATUS
761 EFIAPI
762 NetLibGetMacString (
763 IN EFI_HANDLE SnpHandle,
764 IN EFI_HANDLE ImageHandle,
765 OUT CHAR16 **MacString
766 );
767
768 /**
769 Create an IPv4 device path node.
770
771 The header type of IPv4 device path node is MESSAGING_DEVICE_PATH.
772 The header subtype of IPv4 device path node is MSG_IPv4_DP.
773 The length of the IPv4 device path node in bytes is 19.
774 Get other info from parameters to make up the whole IPv4 device path node.
775
776 @param[in, out] Node Pointer to the IPv4 device path node.
777 @param[in] Controller The handle where the NIC IP4 config protocol resides.
778 @param[in] LocalIp The local IPv4 address.
779 @param[in] LocalPort The local port.
780 @param[in] RemoteIp The remote IPv4 address.
781 @param[in] RemotePort The remote port.
782 @param[in] Protocol The protocol type in the IP header.
783 @param[in] UseDefaultAddress Whether this instance is using default address or not.
784
785 **/
786 VOID
787 EFIAPI
788 NetLibCreateIPv4DPathNode (
789 IN OUT IPv4_DEVICE_PATH *Node,
790 IN EFI_HANDLE Controller,
791 IN IP4_ADDR LocalIp,
792 IN UINT16 LocalPort,
793 IN IP4_ADDR RemoteIp,
794 IN UINT16 RemotePort,
795 IN UINT16 Protocol,
796 IN BOOLEAN UseDefaultAddress
797 );
798
799 /**
800 Find the UNDI/SNP handle from controller and protocol GUID.
801
802 For example, IP will open an MNP child to transmit/receive
803 packets. When MNP is stopped, IP should also be stopped. IP
804 needs to find its own private data which is related the IP's
805 service binding instance that is install on UNDI/SNP handle.
806 Now, the controller is either a MNP or ARP child handle. But
807 IP opens these handle BY_DRIVER, use that info, we can get the
808 UNDI/SNP handle.
809
810 @param[in] Controller Then protocol handle to check.
811 @param[in] ProtocolGuid The protocol that is related with the handle.
812
813 @return The UNDI/SNP handle or NULL for errors.
814
815 **/
816 EFI_HANDLE
817 EFIAPI
818 NetLibGetNicHandle (
819 IN EFI_HANDLE Controller,
820 IN EFI_GUID *ProtocolGuid
821 );
822
823 /**
824 This is the default unload handle for all the network drivers.
825
826 Disconnect the driver specified by ImageHandle from all the devices in the handle database.
827 Uninstall all the protocols installed in the driver entry point.
828
829 @param[in] ImageHandle The drivers' driver image.
830
831 @retval EFI_SUCCESS The image is unloaded.
832 @retval Others Failed to unload the image.
833
834 **/
835 EFI_STATUS
836 EFIAPI
837 NetLibDefaultUnload (
838 IN EFI_HANDLE ImageHandle
839 );
840
841 typedef enum {
842 //
843 //Various signatures
844 //
845 NET_BUF_SIGNATURE = SIGNATURE_32 ('n', 'b', 'u', 'f'),
846 NET_VECTOR_SIGNATURE = SIGNATURE_32 ('n', 'v', 'e', 'c'),
847 NET_QUE_SIGNATURE = SIGNATURE_32 ('n', 'b', 'q', 'u'),
848
849
850 NET_PROTO_DATA = 64, // Opaque buffer for protocols
851 NET_BUF_HEAD = 1, // Trim or allocate space from head
852 NET_BUF_TAIL = 0, // Trim or allocate space from tail
853 NET_VECTOR_OWN_FIRST = 0x01 // We allocated the 1st block in the vector
854 } NET_SIGNATURE_TYPE;
855
856 #define NET_CHECK_SIGNATURE(PData, SIGNATURE) \
857 ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))
858
859 #define NET_SWAP_SHORT(Value) \
860 ((((Value) & 0xff) << 8) | (((Value) >> 8) & 0xff))
861
862 //
863 // Single memory block in the vector.
864 //
865 typedef struct {
866 UINT32 Len; // The block's length
867 UINT8 *Bulk; // The block's Data
868 } NET_BLOCK;
869
870 typedef VOID (*NET_VECTOR_EXT_FREE) (VOID *Arg);
871
872 //
873 //NET_VECTOR contains several blocks to hold all packet's
874 //fragments and other house-keeping stuff for sharing. It
875 //doesn't specify the where actual packet fragment begins.
876 //
877 typedef struct {
878 UINT32 Signature;
879 INTN RefCnt; // Reference count to share NET_VECTOR.
880 NET_VECTOR_EXT_FREE Free; // external function to free NET_VECTOR
881 VOID *Arg; // opeque argument to Free
882 UINT32 Flag; // Flags, NET_VECTOR_OWN_FIRST
883 UINT32 Len; // Total length of the assocated BLOCKs
884
885 UINT32 BlockNum;
886 NET_BLOCK Block[1];
887 } NET_VECTOR;
888
889 //
890 //NET_BLOCK_OP operates on the NET_BLOCK. It specifies
891 //where the actual fragment begins and ends
892 //
893 typedef struct {
894 UINT8 *BlockHead; // Block's head, or the smallest valid Head
895 UINT8 *BlockTail; // Block's tail. BlockTail-BlockHead=block length
896 UINT8 *Head; // 1st byte of the data in the block
897 UINT8 *Tail; // Tail of the data in the block, Tail-Head=Size
898 UINT32 Size; // The size of the data
899 } NET_BLOCK_OP;
900
901
902 //
903 //NET_BUF is the buffer manage structure used by the
904 //network stack. Every network packet may be fragmented. The Vector points to
905 //memory blocks used by each fragment, and BlockOp
906 //specifies where each fragment begins and ends.
907 //
908 //It also contains an opaque area for the protocol to store
909 //per-packet information. Protocol must be careful not
910 //to overwrite the members after that.
911 //
912 typedef struct {
913 UINT32 Signature;
914 INTN RefCnt;
915 LIST_ENTRY List; // The List this NET_BUF is on
916
917 IP4_HEAD *Ip; // Network layer header, for fast access
918 TCP_HEAD *Tcp; // Transport layer header, for fast access
919 UINT8 ProtoData [NET_PROTO_DATA]; //Protocol specific data
920
921 NET_VECTOR *Vector; // The vector containing the packet
922
923 UINT32 BlockOpNum; // Total number of BlockOp in the buffer
924 UINT32 TotalSize; // Total size of the actual packet
925 NET_BLOCK_OP BlockOp[1]; // Specify the position of actual packet
926 } NET_BUF;
927
928
929 //
930 //A queue of NET_BUFs. It is a thin extension of
931 //NET_BUF functions.
932 //
933 typedef struct {
934 UINT32 Signature;
935 INTN RefCnt;
936 LIST_ENTRY List; // The List this buffer queue is on
937
938 LIST_ENTRY BufList; // list of queued buffers
939 UINT32 BufSize; // total length of DATA in the buffers
940 UINT32 BufNum; // total number of buffers on the chain
941 } NET_BUF_QUEUE;
942
943 //
944 // Pseudo header for TCP and UDP checksum
945 //
946 #pragma pack(1)
947 typedef struct {
948 IP4_ADDR SrcIp;
949 IP4_ADDR DstIp;
950 UINT8 Reserved;
951 UINT8 Protocol;
952 UINT16 Len;
953 } NET_PSEUDO_HDR;
954 #pragma pack()
955
956 //
957 // The fragment entry table used in network interfaces. This is
958 // the same as NET_BLOCK now. Use two different to distinguish
959 // the two in case that NET_BLOCK be enhanced later.
960 //
961 typedef struct {
962 UINT32 Len;
963 UINT8 *Bulk;
964 } NET_FRAGMENT;
965
966 #define NET_GET_REF(PData) ((PData)->RefCnt++)
967 #define NET_PUT_REF(PData) ((PData)->RefCnt--)
968 #define NETBUF_FROM_PROTODATA(Info) BASE_CR((Info), NET_BUF, ProtoData)
969
970 #define NET_BUF_SHARED(Buf) \
971 (((Buf)->RefCnt > 1) || ((Buf)->Vector->RefCnt > 1))
972
973 #define NET_VECTOR_SIZE(BlockNum) \
974 (sizeof (NET_VECTOR) + ((BlockNum) - 1) * sizeof (NET_BLOCK))
975
976 #define NET_BUF_SIZE(BlockOpNum) \
977 (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP))
978
979 #define NET_HEADSPACE(BlockOp) \
980 (UINTN)((BlockOp)->Head - (BlockOp)->BlockHead)
981
982 #define NET_TAILSPACE(BlockOp) \
983 (UINTN)((BlockOp)->BlockTail - (BlockOp)->Tail)
984
985 /**
986 Allocate a single block NET_BUF. Upon allocation, all the
987 free space is in the tail room.
988
989 @param[in] Len The length of the block.
990
991 @return Pointer to the allocated NET_BUF, or NULL if the
992 allocation failed due to resource limit.
993
994 **/
995 NET_BUF *
996 EFIAPI
997 NetbufAlloc (
998 IN UINT32 Len
999 );
1000
1001 /**
1002 Free the net buffer and its associated NET_VECTOR.
1003
1004 Decrease the reference count of the net buffer by one. Free the associated net
1005 vector and itself if the reference count of the net buffer is decreased to 0.
1006 The net vector free operation decreases the reference count of the net
1007 vector by one, and performs the resource free operation when the reference count
1008 of the net vector is 0.
1009
1010 @param[in] Nbuf Pointer to the NET_BUF to be freed.
1011
1012 **/
1013 VOID
1014 EFIAPI
1015 NetbufFree (
1016 IN NET_BUF *Nbuf
1017 );
1018
1019 /**
1020 Get the index of NET_BLOCK_OP that contains the byte at Offset in the net
1021 buffer.
1022
1023 For example, this function can be used to retrieve the IP header in the packet. It
1024 also can be used to get the fragment that contains the byte used
1025 mainly by the library implementation itself.
1026
1027 @param[in] Nbuf Pointer to the net buffer.
1028 @param[in] Offset The offset of the byte.
1029 @param[out] Index Index of the NET_BLOCK_OP that contains the byte at
1030 Offset.
1031
1032 @return Pointer to the Offset'th byte of data in the net buffer, or NULL
1033 if there is no such data in the net buffer.
1034
1035 **/
1036 UINT8 *
1037 EFIAPI
1038 NetbufGetByte (
1039 IN NET_BUF *Nbuf,
1040 IN UINT32 Offset,
1041 OUT UINT32 *Index OPTIONAL
1042 );
1043
1044 /**
1045 Create a copy of the net buffer that shares the associated net vector.
1046
1047 The reference count of the newly created net buffer is set to 1. The reference
1048 count of the associated net vector is increased by one.
1049
1050 @param[in] Nbuf Pointer to the net buffer to be cloned.
1051
1052 @return Pointer to the cloned net buffer, or NULL if the
1053 allocation failed due to resource limit.
1054
1055 **/
1056 NET_BUF *
1057 EFIAPI
1058 NetbufClone (
1059 IN NET_BUF *Nbuf
1060 );
1061
1062 /**
1063 Create a duplicated copy of the net buffer with data copied and HeadSpace
1064 bytes of head space reserved.
1065
1066 The duplicated net buffer will allocate its own memory to hold the data of the
1067 source net buffer.
1068
1069 @param[in] Nbuf Pointer to the net buffer to be duplicated from.
1070 @param[in, out] Duplicate Pointer to the net buffer to duplicate to, if
1071 NULL a new net buffer is allocated.
1072 @param[in] HeadSpace Length of the head space to reserve.
1073
1074 @return Pointer to the duplicated net buffer, or NULL if
1075 the allocation failed due to resource limit.
1076
1077 **/
1078 NET_BUF *
1079 EFIAPI
1080 NetbufDuplicate (
1081 IN NET_BUF *Nbuf,
1082 IN OUT NET_BUF *Duplicate OPTIONAL,
1083 IN UINT32 HeadSpace
1084 );
1085
1086 /**
1087 Create a NET_BUF structure which contains Len byte data of Nbuf starting from
1088 Offset.
1089
1090 A new NET_BUF structure will be created but the associated data in NET_VECTOR
1091 is shared. This function exists to do IP packet fragmentation.
1092
1093 @param[in] Nbuf Pointer to the net buffer to be extracted.
1094 @param[in] Offset Starting point of the data to be included in the new
1095 net buffer.
1096 @param[in] Len Bytes of data to be included in the new net buffer.
1097 @param[in] HeadSpace Bytes of head space to reserve for protocol header.
1098
1099 @return Pointer to the cloned net buffer, or NULL if the
1100 allocation failed due to resource limit.
1101
1102 **/
1103 NET_BUF *
1104 EFIAPI
1105 NetbufGetFragment (
1106 IN NET_BUF *Nbuf,
1107 IN UINT32 Offset,
1108 IN UINT32 Len,
1109 IN UINT32 HeadSpace
1110 );
1111
1112 /**
1113 Reserve some space in the header room of the net buffer.
1114
1115 Upon allocation, all the space is in the tail room of the buffer. Call this
1116 function to move some space to the header room. This function is quite limited
1117 in that it can only reserve space from the first block of an empty NET_BUF not
1118 built from the external. But it should be enough for the network stack.
1119
1120 @param[in, out] Nbuf Pointer to the net buffer.
1121 @param[in] Len The length of buffer to be reserved from the header.
1122
1123 **/
1124 VOID
1125 EFIAPI
1126 NetbufReserve (
1127 IN OUT NET_BUF *Nbuf,
1128 IN UINT32 Len
1129 );
1130
1131 /**
1132 Allocate Len bytes of space from the header or tail of the buffer.
1133
1134 @param[in, out] Nbuf Pointer to the net buffer.
1135 @param[in] Len The length of the buffer to be allocated.
1136 @param[in] FromHead The flag to indicate whether reserve the data
1137 from head (TRUE) or tail (FALSE).
1138
1139 @return Pointer to the first byte of the allocated buffer,
1140 or NULL if there is no sufficient space.
1141
1142 **/
1143 UINT8*
1144 EFIAPI
1145 NetbufAllocSpace (
1146 IN OUT NET_BUF *Nbuf,
1147 IN UINT32 Len,
1148 IN BOOLEAN FromHead
1149 );
1150
1151 /**
1152 Trim Len bytes from the header or tail of the net buffer.
1153
1154 @param[in, out] Nbuf Pointer to the net buffer.
1155 @param[in] Len The length of the data to be trimmed.
1156 @param[in] FromHead The flag to indicate whether trim data from head
1157 (TRUE) or tail (FALSE).
1158
1159 @return Length of the actually trimmed data, which may be less
1160 than Len if the TotalSize of Nbuf is less than Len.
1161
1162 **/
1163 UINT32
1164 EFIAPI
1165 NetbufTrim (
1166 IN OUT NET_BUF *Nbuf,
1167 IN UINT32 Len,
1168 IN BOOLEAN FromHead
1169 );
1170
1171 /**
1172 Copy Len bytes of data from the specific offset of the net buffer to the
1173 destination memory.
1174
1175 The Len bytes of data may cross several fragments of the net buffer.
1176
1177 @param[in] Nbuf Pointer to the net buffer.
1178 @param[in] Offset The sequence number of the first byte to copy.
1179 @param[in] Len Length of the data to copy.
1180 @param[in] Dest The destination of the data to copy to.
1181
1182 @return The length of the actual copied data, or 0 if the offset
1183 specified exceeds the total size of net buffer.
1184
1185 **/
1186 UINT32
1187 EFIAPI
1188 NetbufCopy (
1189 IN NET_BUF *Nbuf,
1190 IN UINT32 Offset,
1191 IN UINT32 Len,
1192 IN UINT8 *Dest
1193 );
1194
1195 /**
1196 Build a NET_BUF from external blocks.
1197
1198 A new NET_BUF structure will be created from external blocks. An additional block
1199 of memory will be allocated to hold reserved HeadSpace bytes of header room
1200 and existing HeadLen bytes of header, but the external blocks are shared by the
1201 net buffer to avoid data copying.
1202
1203 @param[in] ExtFragment Pointer to the data block.
1204 @param[in] ExtNum The number of the data blocks.
1205 @param[in] HeadSpace The head space to be reserved.
1206 @param[in] HeadLen The length of the protocol header. The function
1207 pulls this amount of data into a linear block.
1208 @param[in] ExtFree Pointer to the caller-provided free function.
1209 @param[in] Arg The argument passed to ExtFree when ExtFree is
1210 called.
1211
1212 @return Pointer to the net buffer built from the data blocks,
1213 or NULL if the allocation failed due to resource
1214 limit.
1215
1216 **/
1217 NET_BUF *
1218 EFIAPI
1219 NetbufFromExt (
1220 IN NET_FRAGMENT *ExtFragment,
1221 IN UINT32 ExtNum,
1222 IN UINT32 HeadSpace,
1223 IN UINT32 HeadLen,
1224 IN NET_VECTOR_EXT_FREE ExtFree,
1225 IN VOID *Arg OPTIONAL
1226 );
1227
1228 /**
1229 Build a fragment table to contain the fragments in the net buffer. This is the
1230 opposite operation of the NetbufFromExt.
1231
1232 @param[in] Nbuf Point to the net buffer.
1233 @param[in, out] ExtFragment Pointer to the data block.
1234 @param[in, out] ExtNum The number of the data blocks.
1235
1236 @retval EFI_BUFFER_TOO_SMALL The number of non-empty blocks is bigger than
1237 ExtNum.
1238 @retval EFI_SUCCESS Fragment table is built successfully.
1239
1240 **/
1241 EFI_STATUS
1242 EFIAPI
1243 NetbufBuildExt (
1244 IN NET_BUF *Nbuf,
1245 IN OUT NET_FRAGMENT *ExtFragment,
1246 IN OUT UINT32 *ExtNum
1247 );
1248
1249 /**
1250 Build a net buffer from a list of net buffers.
1251
1252 All the fragments will be collected from the list of NEW_BUF and then a new
1253 net buffer will be created through NetbufFromExt.
1254
1255 @param[in] BufList A List of the net buffer.
1256 @param[in] HeadSpace The head space to be reserved.
1257 @param[in] HeaderLen The length of the protocol header. The function
1258 pulls this amount of data into a linear block.
1259 @param[in] ExtFree Pointer to the caller provided free function.
1260 @param[in] Arg The argument passed to ExtFree when ExtFree is called.
1261
1262 @return Pointer to the net buffer built from the list of net
1263 buffers.
1264
1265 **/
1266 NET_BUF *
1267 EFIAPI
1268 NetbufFromBufList (
1269 IN LIST_ENTRY *BufList,
1270 IN UINT32 HeadSpace,
1271 IN UINT32 HeaderLen,
1272 IN NET_VECTOR_EXT_FREE ExtFree,
1273 IN VOID *Arg OPTIONAL
1274 );
1275
1276 /**
1277 Free a list of net buffers.
1278
1279 @param[in, out] Head Pointer to the head of linked net buffers.
1280
1281 **/
1282 VOID
1283 EFIAPI
1284 NetbufFreeList (
1285 IN OUT LIST_ENTRY *Head
1286 );
1287
1288 /**
1289 Initiate the net buffer queue.
1290
1291 @param[in, out] NbufQue Pointer to the net buffer queue to be initialized.
1292
1293 **/
1294 VOID
1295 EFIAPI
1296 NetbufQueInit (
1297 IN OUT NET_BUF_QUEUE *NbufQue
1298 );
1299
1300 /**
1301 Allocate and initialize a net buffer queue.
1302
1303 @return Pointer to the allocated net buffer queue, or NULL if the
1304 allocation failed due to resource limit.
1305
1306 **/
1307 NET_BUF_QUEUE *
1308 EFIAPI
1309 NetbufQueAlloc (
1310 VOID
1311 );
1312
1313 /**
1314 Free a net buffer queue.
1315
1316 Decrease the reference count of the net buffer queue by one. The real resource
1317 free operation isn't performed until the reference count of the net buffer
1318 queue is decreased to 0.
1319
1320 @param[in] NbufQue Pointer to the net buffer queue to be freed.
1321
1322 **/
1323 VOID
1324 EFIAPI
1325 NetbufQueFree (
1326 IN NET_BUF_QUEUE *NbufQue
1327 );
1328
1329 /**
1330 Remove a net buffer from the head in the specific queue and return it.
1331
1332 @param[in, out] NbufQue Pointer to the net buffer queue.
1333
1334 @return Pointer to the net buffer removed from the specific queue,
1335 or NULL if there is no net buffer in the specific queue.
1336
1337 **/
1338 NET_BUF *
1339 EFIAPI
1340 NetbufQueRemove (
1341 IN OUT NET_BUF_QUEUE *NbufQue
1342 );
1343
1344 /**
1345 Append a net buffer to the net buffer queue.
1346
1347 @param[in, out] NbufQue Pointer to the net buffer queue.
1348 @param[in, out] Nbuf Pointer to the net buffer to be appended.
1349
1350 **/
1351 VOID
1352 EFIAPI
1353 NetbufQueAppend (
1354 IN OUT NET_BUF_QUEUE *NbufQue,
1355 IN OUT NET_BUF *Nbuf
1356 );
1357
1358 /**
1359 Copy Len bytes of data from the net buffer queue at the specific offset to the
1360 destination memory.
1361
1362 The copying operation is the same as NetbufCopy but applies to the net buffer
1363 queue instead of the net buffer.
1364
1365 @param[in] NbufQue Pointer to the net buffer queue.
1366 @param[in] Offset The sequence number of the first byte to copy.
1367 @param[in] Len Length of the data to copy.
1368 @param[out] Dest The destination of the data to copy to.
1369
1370 @return The length of the actual copied data, or 0 if the offset
1371 specified exceeds the total size of net buffer queue.
1372
1373 **/
1374 UINT32
1375 EFIAPI
1376 NetbufQueCopy (
1377 IN NET_BUF_QUEUE *NbufQue,
1378 IN UINT32 Offset,
1379 IN UINT32 Len,
1380 OUT UINT8 *Dest
1381 );
1382
1383 /**
1384 Trim Len bytes of data from the queue header and release any net buffer
1385 that is trimmed wholely.
1386
1387 The trimming operation is the same as NetbufTrim but applies to the net buffer
1388 queue instead of the net buffer.
1389
1390 @param[in, out] NbufQue Pointer to the net buffer queue.
1391 @param[in] Len Length of the data to trim.
1392
1393 @return The actual length of the data trimmed.
1394
1395 **/
1396 UINT32
1397 EFIAPI
1398 NetbufQueTrim (
1399 IN OUT NET_BUF_QUEUE *NbufQue,
1400 IN UINT32 Len
1401 );
1402
1403
1404 /**
1405 Flush the net buffer queue.
1406
1407 @param[in, out] NbufQue Pointer to the queue to be flushed.
1408
1409 **/
1410 VOID
1411 EFIAPI
1412 NetbufQueFlush (
1413 IN OUT NET_BUF_QUEUE *NbufQue
1414 );
1415
1416 /**
1417 Compute the checksum for a bulk of data.
1418
1419 @param[in] Bulk Pointer to the data.
1420 @param[in] Len Length of the data, in bytes.
1421
1422 @return The computed checksum.
1423
1424 **/
1425 UINT16
1426 EFIAPI
1427 NetblockChecksum (
1428 IN UINT8 *Bulk,
1429 IN UINT32 Len
1430 );
1431
1432 /**
1433 Add two checksums.
1434
1435 @param[in] Checksum1 The first checksum to be added.
1436 @param[in] Checksum2 The second checksum to be added.
1437
1438 @return The new checksum.
1439
1440 **/
1441 UINT16
1442 EFIAPI
1443 NetAddChecksum (
1444 IN UINT16 Checksum1,
1445 IN UINT16 Checksum2
1446 );
1447
1448 /**
1449 Compute the checksum for a NET_BUF.
1450
1451 @param[in] Nbuf Pointer to the net buffer.
1452
1453 @return The computed checksum.
1454
1455 **/
1456 UINT16
1457 EFIAPI
1458 NetbufChecksum (
1459 IN NET_BUF *Nbuf
1460 );
1461
1462 /**
1463 Compute the checksum for TCP/UDP pseudo header.
1464
1465 Src and Dst are in network byte order, and Len is in host byte order.
1466
1467 @param[in] Src The source address of the packet.
1468 @param[in] Dst The destination address of the packet.
1469 @param[in] Proto The protocol type of the packet.
1470 @param[in] Len The length of the packet.
1471
1472 @return The computed checksum.
1473
1474 **/
1475 UINT16
1476 EFIAPI
1477 NetPseudoHeadChecksum (
1478 IN IP4_ADDR Src,
1479 IN IP4_ADDR Dst,
1480 IN UINT8 Proto,
1481 IN UINT16 Len
1482 );
1483
1484 #endif