3 Copyright (c) 2005 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Library for the UEFI network stack.
27 #include <Library/BaseMemoryLib.h>
28 #include <Library/MemoryAllocationLib.h>
29 #include <Protocol/DriverBinding.h>
30 #include <Protocol/ComponentName.h>
31 #include <Protocol/DriverConfiguration.h>
32 #include <Protocol/DriverDiagnostics.h>
33 #include <Protocol/Dpc.h>
35 typedef UINT32 IP4_ADDR
;
36 typedef UINT32 TCP_SEQNO
;
37 typedef UINT16 TCP_PORTNO
;
40 NET_ETHER_ADDR_LEN
= 6,
41 NET_IFTYPE_ETHERNET
= 0x01,
43 EFI_IP_PROTO_UDP
= 0x11,
44 EFI_IP_PROTO_TCP
= 0x06,
45 EFI_IP_PROTO_ICMP
= 0x01,
48 // The address classfication
62 // Ethernet head definition
65 UINT8 DstMac
[NET_ETHER_ADDR_LEN
];
66 UINT8 SrcMac
[NET_ETHER_ADDR_LEN
];
72 // The EFI_IP4_HEADER is hard to use because the source and
73 // destination address are defined as EFI_IPv4_ADDRESS, which
74 // is a structure. Two structures can't be compared or masked
75 // directly. This is why there is an internal representation.
93 // ICMP head definition. ICMP message is categoried as either an error
94 // message or query message. Two message types have their own head format.
104 UINT32 Fourth
; // 4th filed of the head, it depends on Type.
106 } IP4_ICMP_ERROR_HEAD
;
112 } IP4_ICMP_QUERY_HEAD
;
116 // UDP header definition
127 // TCP header definition
144 #define NET_MAC_EQUAL(pMac1, pMac2, Len) \
145 (CompareMem ((pMac1), (pMac2), Len) == 0)
147 #define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \
148 (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))
150 #define NTOHL(x) (UINT32)((((UINT32) (x) & 0xff) << 24) | \
151 (((UINT32) (x) & 0xff00) << 8) | \
152 (((UINT32) (x) & 0xff0000) >> 8) | \
153 (((UINT32) (x) & 0xff000000) >> 24))
155 #define HTONL(x) NTOHL(x)
157 #define NTOHS(x) (UINT16)((((UINT16) (x) & 0xff) << 8) | \
158 (((UINT16) (x) & 0xff00) >> 8))
160 #define HTONS(x) NTOHS(x)
163 // Test the IP's attribute, All the IPs are in host byte order.
165 #define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)
166 #define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)
167 #define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))
168 #define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != IP4_MASK_NUM)
171 // Convert the EFI_IP4_ADDRESS to plain UINT32 IP4 address.
173 #define EFI_IP4(EfiIpAddr) (*(IP4_ADDR *) ((EfiIpAddr).Addr))
174 #define EFI_NTOHL(EfiIp) (NTOHL (EFI_IP4 ((EfiIp))))
175 #define EFI_IP4_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)
193 extern IP4_ADDR mIp4AllMasks
[IP4_MASK_NUM
];
196 extern EFI_IPv4_ADDRESS mZeroIp4Addr
;
198 #define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9'))
199 #define NET_ROUNDUP(size, unit) (((size) + (unit) - 1) & (~((unit) - 1)))
200 #define NET_IS_LOWER_CASE_CHAR(Ch) (('a' <= (Ch)) && ((Ch) <= 'z'))
201 #define NET_IS_UPPER_CASE_CHAR(Ch) (('A' <= (Ch)) && ((Ch) <= 'Z'))
203 #define TICKS_PER_MS 10000U
204 #define TICKS_PER_SECOND 10000000U
206 #define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
226 #define NET_LIST_USER_STRUCT(Entry, Type, Field) \
227 _CR(Entry, Type, Field)
229 #define NET_LIST_USER_STRUCT_S(Entry, Type, Field, Sig) \
230 CR(Entry, Type, Field, Sig)
233 // Iterate through the doule linked list. It is NOT delete safe
235 #define NET_LIST_FOR_EACH(Entry, ListHead) \
236 for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
239 // Iterate through the doule linked list. This is delete-safe.
240 // Don't touch NextEntry. Also, don't use this macro if list
241 // entries other than the Entry may be deleted when processing
242 // the current Entry.
244 #define NET_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
245 for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink; \
246 Entry != (ListHead); \
247 Entry = NextEntry, NextEntry = Entry->ForwardLink \
251 // Make sure the list isn't empty before get the frist/last record.
253 #define NET_LIST_HEAD(ListHead, Type, Field) \
254 NET_LIST_USER_STRUCT((ListHead)->ForwardLink, Type, Field)
256 #define NET_LIST_TAIL(ListHead, Type, Field) \
257 NET_LIST_USER_STRUCT((ListHead)->BackLink, Type, Field)
272 IN LIST_ENTRY
*PrevEntry
,
273 IN LIST_ENTRY
*NewEntry
277 NetListInsertBefore (
278 IN LIST_ENTRY
*PostEntry
,
279 IN LIST_ENTRY
*NewEntry
284 // Object container: EFI network stack spec defines various kinds of
285 // tokens. The drivers can share code to manage those objects.
299 #define NET_MAP_INCREAMENT 64
325 IN VOID
*Value OPTIONAL
332 IN VOID
*Value OPTIONAL
344 IN NET_MAP_ITEM
*Item
,
345 OUT VOID
**Value OPTIONAL
351 OUT VOID
**Value OPTIONAL
357 OUT VOID
**Value OPTIONAL
362 (*NET_MAP_CALLBACK
) (
364 IN NET_MAP_ITEM
*Item
,
371 IN NET_MAP_CALLBACK CallBack
,
372 IN VOID
*Arg OPTIONAL
377 // Helper functions to implement driver binding and service binding protocols.
380 NetLibCreateServiceChild (
381 IN EFI_HANDLE ControllerHandle
,
382 IN EFI_HANDLE ImageHandle
,
383 IN EFI_GUID
*ServiceBindingGuid
,
384 OUT EFI_HANDLE
*ChildHandle
388 NetLibDestroyServiceChild (
389 IN EFI_HANDLE ControllerHandle
,
390 IN EFI_HANDLE ImageHandle
,
391 IN EFI_GUID
*ServiceBindingGuid
,
392 IN EFI_HANDLE ChildHandle
397 IN EFI_HANDLE SnpHandle
,
398 IN EFI_HANDLE ImageHandle
,
399 IN OUT CHAR16
**MacString
403 NetLibCreateIPv4DPathNode (
404 IN OUT IPv4_DEVICE_PATH
*Node
,
405 IN EFI_HANDLE Controller
,
408 IN IP4_ADDR RemoteIp
,
409 IN UINT16 RemotePort
,
411 IN BOOLEAN UseDefaultAddress
416 IN EFI_HANDLE Controller
,
417 IN EFI_GUID
*ProtocolGuid
423 IN EFI_DPC_PROCEDURE DpcProcedure
,
424 IN VOID
*DpcContext OPTIONAL
434 NetLibDefaultUnload (
435 IN EFI_HANDLE ImageHandle
442 NET_BUF_SIGNATURE
= EFI_SIGNATURE_32 ('n', 'b', 'u', 'f'),
443 NET_VECTOR_SIGNATURE
= EFI_SIGNATURE_32 ('n', 'v', 'e', 'c'),
444 NET_QUE_SIGNATURE
= EFI_SIGNATURE_32 ('n', 'b', 'q', 'u'),
447 NET_PROTO_DATA
= 64, // Opaque buffer for protocols
448 NET_BUF_HEAD
= 1, // Trim or allocate space from head
449 NET_BUF_TAIL
= 0, // Trim or allocate space from tail
450 NET_VECTOR_OWN_FIRST
= 0x01, // We allocated the 1st block in the vector
453 #define NET_CHECK_SIGNATURE(PData, SIGNATURE) \
454 ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))
456 #define NET_SWAP_SHORT(Value) \
457 ((((Value) & 0xff) << 8) | (((Value) >> 8) & 0xff))
460 // Single memory block in the vector.
463 UINT32 Len
; // The block's length
464 UINT8
*Bulk
; // The block's Data
467 typedef VOID (*NET_VECTOR_EXT_FREE
) (VOID
*Arg
);
470 //NET_VECTOR contains several blocks to hold all packet's
471 //fragments and other house-keeping stuff for sharing. It
472 //doesn't specify the where actual packet fragment begins.
476 INTN RefCnt
; // Reference count to share NET_VECTOR.
477 NET_VECTOR_EXT_FREE Free
; // external function to free NET_VECTOR
478 VOID
*Arg
; // opeque argument to Free
479 UINT32 Flag
; // Flags, NET_VECTOR_OWN_FIRST
480 UINT32 Len
; // Total length of the assocated BLOCKs
487 //NET_BLOCK_OP operate on the NET_BLOCK, It specifies
488 //where the actual fragment begins and where it ends
491 UINT8
*BlockHead
; // Block's head, or the smallest valid Head
492 UINT8
*BlockTail
; // Block's tail. BlockTail-BlockHead=block length
493 UINT8
*Head
; // 1st byte of the data in the block
494 UINT8
*Tail
; // Tail of the data in the block, Tail-Head=Size
495 UINT32 Size
; // The size of the data
500 //NET_BUF is the buffer manage structure used by the
501 //network stack. Every network packet may be fragmented,
502 //and contains multiple fragments. The Vector points to
503 //memory blocks used by the each fragment, and BlockOp
504 //specifies where each fragment begins and ends.
506 //It also contains a opaque area for protocol to store
507 //per-packet informations. Protocol must be caution not
508 //to overwrite the members after that.
513 LIST_ENTRY List
; // The List this NET_BUF is on
515 IP4_HEAD
*Ip
; // Network layer header, for fast access
516 TCP_HEAD
*Tcp
; // Transport layer header, for fast access
517 UINT8 ProtoData
[NET_PROTO_DATA
]; //Protocol specific data
519 NET_VECTOR
*Vector
; // The vector containing the packet
521 UINT32 BlockOpNum
; // Total number of BlockOp in the buffer
522 UINT32 TotalSize
; // Total size of the actual packet
523 NET_BLOCK_OP BlockOp
[1]; // Specify the position of actual packet
528 //A queue of NET_BUFs, It is just a thin extension of
534 LIST_ENTRY List
; // The List this buffer queue is on
536 LIST_ENTRY BufList
; // list of queued buffers
537 UINT32 BufSize
; // total length of DATA in the buffers
538 UINT32 BufNum
; // total number of buffers on the chain
542 // Pseudo header for TCP and UDP checksum
555 // The fragment entry table used in network interfaces. This is
556 // the same as NET_BLOCK now. Use two different to distinguish
557 // the two in case that NET_BLOCK be enhanced later.
564 #define NET_GET_REF(PData) ((PData)->RefCnt++)
565 #define NET_PUT_REF(PData) ((PData)->RefCnt--)
566 #define NETBUF_FROM_PROTODATA(Info) _CR((Info), NET_BUF, ProtoData)
568 #define NET_BUF_SHARED(Buf) \
569 (((Buf)->RefCnt > 1) || ((Buf)->Vector->RefCnt > 1))
571 #define NET_VECTOR_SIZE(BlockNum) \
572 (sizeof (NET_VECTOR) + ((BlockNum) - 1) * sizeof (NET_BLOCK))
574 #define NET_BUF_SIZE(BlockOpNum) \
575 (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP))
577 #define NET_HEADSPACE(BlockOp) \
578 (UINTN)((BlockOp)->Head - (BlockOp)->BlockHead)
580 #define NET_TAILSPACE(BlockOp) \
581 (UINTN)((BlockOp)->BlockTail - (BlockOp)->Tail)
598 OUT UINT32
*Index OPTIONAL
609 IN NET_BUF
*Duplicate OPTIONAL
,
651 IN NET_FRAGMENT
*ExtFragment
,
655 IN NET_VECTOR_EXT_FREE ExtFree
,
656 IN VOID
*Arg OPTIONAL
662 IN NET_FRAGMENT
*ExtFragment
,
668 IN LIST_ENTRY
*BufList
,
671 IN NET_VECTOR_EXT_FREE ExtFree
,
672 IN VOID
*Arg OPTIONAL
682 IN NET_BUF_QUEUE
*NbufQue
692 IN NET_BUF_QUEUE
*NbufQue
697 IN NET_BUF_QUEUE
*NbufQue
702 IN NET_BUF_QUEUE
*NbufQue
,
708 IN NET_BUF_QUEUE
*NbufQue
,
716 IN NET_BUF_QUEUE
*NbufQue
,
722 IN NET_BUF_QUEUE
*NbufQue
743 NetPseudoHeadChecksum (