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