]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Include/Library/NetLib.h
c3695b539707e41e23cca39dbbed7959e9d8e72a
[mirror_edk2.git] / MdeModulePkg / Include / Library / NetLib.h
1 /** @file
2 This library provides basic functiosn for UEFI network stack.
3
4 Copyright (c) 2005 - 2008, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef _NET_LIB_H_
16 #define _NET_LIB_H_
17
18 #include <PiDxe.h>
19 #include <Library/BaseMemoryLib.h>
20 #include <Library/MemoryAllocationLib.h>
21 #include <Protocol/DriverBinding.h>
22 #include <Protocol/ComponentName.h>
23 #include <Protocol/DriverConfiguration.h>
24 #include <Protocol/DriverDiagnostics.h>
25 #include <Protocol/Dpc.h>
26
27 typedef UINT32 IP4_ADDR;
28 typedef UINT32 TCP_SEQNO;
29 typedef UINT16 TCP_PORTNO;
30
31 enum {
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
48 IP4_MASK_NUM = 33
49 };
50
51 #pragma pack(1)
52
53 //
54 // Ethernet head definition
55 //
56 typedef 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 //
69 typedef struct {
70 UINT8 HeadLen : 4;
71 UINT8 Ver : 4;
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 //
88 typedef struct {
89 UINT8 Type;
90 UINT8 Code;
91 UINT16 Checksum;
92 } IP4_ICMP_HEAD;
93
94 typedef 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
100 typedef 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 //
110 typedef 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 //
121 typedef struct {
122 TCP_PORTNO SrcPort;
123 TCP_PORTNO DstPort;
124 TCP_SEQNO Seq;
125 TCP_SEQNO Ack;
126 UINT8 Res : 4;
127 UINT8 HeadLen : 4;
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) \
137 (CompareMem ((pMac1), (pMac2), Len) == 0)
138
139 #define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \
140 (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))
141
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)
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))))
167 #define EFI_IP4_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)
168
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
179 **/
180 INTN
181 EFIAPI
182 NetGetMaskLength (
183 IN IP4_ADDR Mask
184 );
185
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
194 **/
195 INTN
196 EFIAPI
197 NetGetIpClass (
198 IN IP4_ADDR Addr
199 );
200
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
211 **/
212 BOOLEAN
213 Ip4IsUnicast (
214 IN IP4_ADDR Ip,
215 IN IP4_ADDR NetMask
216 );
217
218 extern IP4_ADDR mIp4AllMasks [IP4_MASK_NUM];
219
220
221 extern EFI_IPv4_ADDRESS mZeroIp4Addr;
222
223 #define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9'))
224 #define NET_ROUNDUP(size, unit) (((size) + (unit) - 1) & (~((unit) - 1)))
225 #define NET_IS_LOWER_CASE_CHAR(Ch) (('a' <= (Ch)) && ((Ch) <= 'z'))
226 #define NET_IS_UPPER_CASE_CHAR(Ch) (('A' <= (Ch)) && ((Ch) <= 'Z'))
227
228 #define TICKS_PER_MS 10000U
229 #define TICKS_PER_SECOND 10000000U
230
231 #define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
232
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
241 **/
242 UINT32
243 EFIAPI
244 NetGetUint32 (
245 IN UINT8 *Buf
246 );
247
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
257 **/
258 VOID
259 EFIAPI
260 NetPutUint32 (
261 IN UINT8 *Buf,
262 IN UINT32 Data
263 );
264
265 /**
266 Initialize a random seed using current time.
267
268 None
269
270 @return The random seed initialized with current time.
271
272 **/
273 UINT32
274 EFIAPI
275 NetRandomInitSeed (
276 VOID
277 );
278
279
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
313
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
321 **/
322 LIST_ENTRY *
323 EFIAPI
324 NetListRemoveHead (
325 LIST_ENTRY *Head
326 );
327
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
335 **/
336 LIST_ENTRY *
337 EFIAPI
338 NetListRemoveTail (
339 LIST_ENTRY *Head
340 );
341
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
350 **/
351 VOID
352 EFIAPI
353 NetListInsertAfter (
354 IN LIST_ENTRY *PrevEntry,
355 IN LIST_ENTRY *NewEntry
356 );
357
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
366 **/
367 VOID
368 EFIAPI
369 NetListInsertBefore (
370 IN LIST_ENTRY *PostEntry,
371 IN LIST_ENTRY *NewEntry
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 //
379 typedef struct {
380 LIST_ENTRY Link;
381 VOID *Key;
382 VOID *Value;
383 } NET_MAP_ITEM;
384
385 typedef struct {
386 LIST_ENTRY Used;
387 LIST_ENTRY Recycled;
388 UINTN Count;
389 } NET_MAP;
390
391 #define NET_MAP_INCREAMENT 64
392
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
400 **/
401 VOID
402 EFIAPI
403 NetMapInit (
404 IN NET_MAP *Map
405 );
406
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
414 **/
415 VOID
416 EFIAPI
417 NetMapClean (
418 IN NET_MAP *Map
419 );
420
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
428 **/
429 BOOLEAN
430 EFIAPI
431 NetMapIsEmpty (
432 IN NET_MAP *Map
433 );
434
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
442 **/
443 UINTN
444 EFIAPI
445 NetMapGetCount (
446 IN NET_MAP *Map
447 );
448
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
459 **/
460 EFI_STATUS
461 EFIAPI
462 NetMapInsertHead (
463 IN NET_MAP *Map,
464 IN VOID *Key,
465 IN VOID *Value OPTIONAL
466 );
467
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
478 **/
479 EFI_STATUS
480 EFIAPI
481 NetMapInsertTail (
482 IN NET_MAP *Map,
483 IN VOID *Key,
484 IN VOID *Value OPTIONAL
485 );
486
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
495 **/
496 NET_MAP_ITEM *
497 EFIAPI
498 NetMapFindKey (
499 IN NET_MAP *Map,
500 IN VOID *Key
501 );
502
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
512 **/
513 VOID *
514 EFIAPI
515 NetMapRemoveItem (
516 IN NET_MAP *Map,
517 IN NET_MAP_ITEM *Item,
518 OUT VOID **Value OPTIONAL
519 );
520
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
529 **/
530 VOID *
531 EFIAPI
532 NetMapRemoveHead (
533 IN NET_MAP *Map,
534 OUT VOID **Value OPTIONAL
535 );
536
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
545 **/
546 VOID *
547 EFIAPI
548 NetMapRemoveTail (
549 IN NET_MAP *Map,
550 OUT VOID **Value OPTIONAL
551 );
552
553 typedef
554 EFI_STATUS
555 (*NET_MAP_CALLBACK) (
556 IN NET_MAP *Map,
557 IN NET_MAP_ITEM *Item,
558 IN VOID *Arg
559 );
560
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
573 **/
574 EFI_STATUS
575 EFIAPI
576 NetMapIterate (
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 //
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
597 **/
598 EFI_STATUS
599 EFIAPI
600 NetLibCreateServiceChild (
601 IN EFI_HANDLE ControllerHandle,
602 IN EFI_HANDLE ImageHandle,
603 IN EFI_GUID *ServiceBindingGuid,
604 OUT EFI_HANDLE *ChildHandle
605 );
606
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
618 **/
619 EFI_STATUS
620 EFIAPI
621 NetLibDestroyServiceChild (
622 IN EFI_HANDLE ControllerHandle,
623 IN EFI_HANDLE ImageHandle,
624 IN EFI_GUID *ServiceBindingGuid,
625 IN EFI_HANDLE ChildHandle
626 );
627
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
643 **/
644 EFI_STATUS
645 EFIAPI
646 NetLibGetMacString (
647 IN EFI_HANDLE SnpHandle,
648 IN EFI_HANDLE ImageHandle,
649 IN OUT CHAR16 **MacString
650 );
651
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
665 **/
666 VOID
667 EFIAPI
668 NetLibCreateIPv4DPathNode (
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
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
694 **/
695 EFI_HANDLE
696 EFIAPI
697 NetLibGetNicHandle (
698 IN EFI_HANDLE Controller,
699 IN EFI_GUID *ProtocolGuid
700 );
701
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
716 **/
717 EFI_STATUS
718 EFIAPI
719 NetLibQueueDpc (
720 IN EFI_TPL DpcTpl,
721 IN EFI_DPC_PROCEDURE DpcProcedure,
722 IN VOID *DpcContext OPTIONAL
723 );
724
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
731 **/
732 EFI_STATUS
733 EFIAPI
734 NetLibDispatchDpc (
735 VOID
736 );
737
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
749 **/
750 EFI_STATUS
751 EFIAPI
752 NetLibDefaultUnload (
753 IN EFI_HANDLE ImageHandle
754 );
755
756 enum {
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
768 NET_VECTOR_OWN_FIRST = 0x01 // We allocated the 1st block in the vector
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 //
780 typedef struct {
781 UINT32 Len; // The block's length
782 UINT8 *Bulk; // The block's Data
783 } NET_BLOCK;
784
785 typedef 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 //
792 typedef 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 //
808 typedef 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 //
828 typedef struct {
829 UINT32 Signature;
830 INTN RefCnt;
831 LIST_ENTRY List; // The List this NET_BUF is on
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 //
849 typedef struct {
850 UINT32 Signature;
851 INTN RefCnt;
852 LIST_ENTRY List; // The List this buffer queue is on
853
854 LIST_ENTRY BufList; // list of queued buffers
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)
863 typedef 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 //
877 typedef 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
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
910 **/
911 NET_BUF *
912 EFIAPI
913 NetbufAlloc (
914 IN UINT32 Len
915 );
916
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
924 **/
925 VOID
926 EFIAPI
927 NetbufFree (
928 IN NET_BUF *Nbuf
929 );
930
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
944 **/
945 UINT8 *
946 EFIAPI
947 NetbufGetByte (
948 IN NET_BUF *Nbuf,
949 IN UINT32 Offset,
950 OUT UINT32 *Index OPTIONAL
951 );
952
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
960 **/
961 NET_BUF *
962 EFIAPI
963 NetbufClone (
964 IN NET_BUF *Nbuf
965 );
966
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
978 **/
979 NET_BUF *
980 EFIAPI
981 NetbufDuplicate (
982 IN NET_BUF *Nbuf,
983 IN NET_BUF *Duplicate OPTIONAL,
984 IN UINT32 HeadSpace
985 );
986
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
1002 **/
1003 NET_BUF *
1004 EFIAPI
1005 NetbufGetFragment (
1006 IN NET_BUF *Nbuf,
1007 IN UINT32 Offset,
1008 IN UINT32 Len,
1009 IN UINT32 HeadSpace
1010 );
1011
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
1026 **/
1027 VOID
1028 EFIAPI
1029 NetbufReserve (
1030 IN NET_BUF *Nbuf,
1031 IN UINT32 Len
1032 );
1033
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
1045 **/
1046 UINT8 *
1047 EFIAPI
1048 NetbufAllocSpace (
1049 IN NET_BUF *Nbuf,
1050 IN UINT32 Len,
1051 IN BOOLEAN FromHead
1052 );
1053
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
1064 **/
1065 UINT32
1066 EFIAPI
1067 NetbufTrim (
1068 IN NET_BUF *Nbuf,
1069 IN UINT32 Len,
1070 IN BOOLEAN FromHead
1071 );
1072
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
1083 **/
1084 UINT32
1085 EFIAPI
1086 NetbufCopy (
1087 IN NET_BUF *Nbuf,
1088 IN UINT32 Offset,
1089 IN UINT32 Len,
1090 IN UINT8 *Dest
1091 );
1092
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
1108 **/
1109 NET_BUF *
1110 EFIAPI
1111 NetbufFromExt (
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
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
1131 **/
1132 EFI_STATUS
1133 EFIAPI
1134 NetbufBuildExt (
1135 IN NET_BUF *Nbuf,
1136 IN NET_FRAGMENT *ExtFragment,
1137 IN UINT32 *ExtNum
1138 );
1139
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
1154 **/
1155 NET_BUF *
1156 EFIAPI
1157 NetbufFromBufList (
1158 IN LIST_ENTRY *BufList,
1159 IN UINT32 HeadSpace,
1160 IN UINT32 HeaderLen,
1161 IN NET_VECTOR_EXT_FREE ExtFree,
1162 IN VOID *Arg OPTIONAL
1163 );
1164
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
1172 **/
1173 VOID
1174 EFIAPI
1175 NetbufFreeList (
1176 IN LIST_ENTRY *Head
1177 );
1178
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
1186 **/
1187 VOID
1188 EFIAPI
1189 NetbufQueInit (
1190 IN NET_BUF_QUEUE *NbufQue
1191 );
1192
1193 /**
1194 Allocate an initialized net buffer queue.
1195
1196 None.
1197
1198 @retval * Pointer to the allocated net buffer queue.
1199
1200 **/
1201 NET_BUF_QUEUE *
1202 EFIAPI
1203 NetbufQueAlloc (
1204 VOID
1205 );
1206
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
1214 **/
1215 VOID
1216 EFIAPI
1217 NetbufQueFree (
1218 IN NET_BUF_QUEUE *NbufQue
1219 );
1220
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
1229 **/
1230 NET_BUF *
1231 EFIAPI
1232 NetbufQueRemove (
1233 IN NET_BUF_QUEUE *NbufQue
1234 );
1235
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
1244 **/
1245 VOID
1246 EFIAPI
1247 NetbufQueAppend (
1248 IN NET_BUF_QUEUE *NbufQue,
1249 IN NET_BUF *Nbuf
1250 );
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
1262 **/
1263 UINT32
1264 EFIAPI
1265 NetbufQueCopy (
1266 IN NET_BUF_QUEUE *NbufQue,
1267 IN UINT32 Offset,
1268 IN UINT32 Len,
1269 IN UINT8 *Dest
1270 );
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
1282 **/
1283 UINT32
1284 EFIAPI
1285 NetbufQueTrim (
1286 IN NET_BUF_QUEUE *NbufQue,
1287 IN UINT32 Len
1288 );
1289
1290
1291 /**
1292 Flush the net buffer queue.
1293
1294 @param NbufQue Pointer to the queue to be flushed.
1295
1296 @return None.
1297
1298 **/
1299 VOID
1300 EFIAPI
1301 NetbufQueFlush (
1302 IN NET_BUF_QUEUE *NbufQue
1303 );
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
1313 **/
1314 UINT16
1315 EFIAPI
1316 NetblockChecksum (
1317 IN UINT8 *Bulk,
1318 IN UINT32 Len
1319 );
1320
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 **/
1330 UINT16
1331 EFIAPI
1332 NetAddChecksum (
1333 IN UINT16 Checksum1,
1334 IN UINT16 Checksum2
1335 );
1336
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
1344 **/
1345 UINT16
1346 EFIAPI
1347 NetbufChecksum (
1348 IN NET_BUF *Nbuf
1349 );
1350
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
1363 **/
1364 UINT16
1365 EFIAPI
1366 NetPseudoHeadChecksum (
1367 IN IP4_ADDR Src,
1368 IN IP4_ADDR Dst,
1369 IN UINT8 Proto,
1370 IN UINT16 Len
1371 );
1372
1373 #endif