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 <Protocol/DriverBinding.h>
28 #include <Protocol/ComponentName.h>
29 #include <Protocol/DriverConfiguration.h>
30 #include <Protocol/DriverDiagnostics.h>
31 #include <Protocol/Dpc.h>
33 #define EFI_NET_LITTLE_ENDIAN
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.
78 #ifdef EFI_NET_LITTLE_ENDIAN
98 // ICMP head definition. ICMP message is categoried as either an error
99 // message or query message. Two message types have their own head format.
109 UINT32 Fourth
; // 4th filed of the head, it depends on Type.
111 } IP4_ICMP_ERROR_HEAD
;
117 } IP4_ICMP_QUERY_HEAD
;
121 // UDP header definition
132 // TCP header definition
139 #ifdef EFI_NET_LITTLE_ENDIAN
154 #define NET_MAC_EQUAL(pMac1, pMac2, Len) \
155 (NetCompareMem ((pMac1), (pMac2), Len) == 0)
157 #define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \
158 (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))
160 #ifdef EFI_NET_LITTLE_ENDIAN
161 #define NTOHL(x) (UINT32)((((UINT32) (x) & 0xff) << 24) | \
162 (((UINT32) (x) & 0xff00) << 8) | \
163 (((UINT32) (x) & 0xff0000) >> 8) | \
164 (((UINT32) (x) & 0xff000000) >> 24))
166 #define HTONL(x) NTOHL(x)
168 #define NTOHS(x) (UINT16)((((UINT16) (x) & 0xff) << 8) | \
169 (((UINT16) (x) & 0xff00) >> 8))
171 #define HTONS(x) NTOHS(x)
173 #define NTOHL(x) (UINT32)(x)
174 #define HTONL(x) (UINT32)(x)
175 #define NTOHS(x) (UINT16)(x)
176 #define HTONS(x) (UINT16)(x)
180 // Test the IP's attribute, All the IPs are in host byte order.
182 #define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)
183 #define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)
184 #define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))
185 #define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != IP4_MASK_NUM)
188 // Convert the EFI_IP4_ADDRESS to plain UINT32 IP4 address.
190 #define EFI_IP4(EfiIpAddr) (*(IP4_ADDR *) ((EfiIpAddr).Addr))
191 #define EFI_NTOHL(EfiIp) (NTOHL (EFI_IP4 ((EfiIp))))
192 #define EFI_IP4_EQUAL(Ip1, Ip2) (NetCompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)
210 extern IP4_ADDR mIp4AllMasks
[IP4_MASK_NUM
];
213 extern EFI_IPv4_ADDRESS mZeroIp4Addr
;
215 #define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9'))
217 // Wrap functions to ease the impact of EFI library changes.
219 #define NetAllocateZeroPool AllocateZeroPool
220 #define NetAllocatePool AllocatePool
221 #define NetFreePool gBS->FreePool
222 #define NetCopyMem CopyMem
223 #define NetSetMem SetMem
224 #define NetZeroMem(Dest, Len) SetMem ((Dest), (Len), 0)
225 #define NetCompareMem CompareMem
228 // Lock primitives: the stack implements its lock primitives according
229 // to the standard EFI enviornment. It will NOT consider multiprocessor.
231 #define NET_TPL_LOCK TPL_CALLBACK
232 #define NET_TPL_EVENT TPL_NOTIFY
233 #define NET_TPL_RECYCLE TPL_NOTIFY
234 #define NET_TPL_TIMER NET_TPL_LOCK
236 #define NET_LOCK EFI_LOCK
237 #define NET_LOCK_INIT(x) EfiInitializeLock (x, NET_TPL_LOCK)
238 #define NET_RECYCLE_LOCK_INIT(x) EfiInitializeLock (x, NET_TPL_RECYCLE)
239 #define NET_TRYLOCK(x) EfiAcquireLockOrFail (x)
240 #define NET_UNLOCK(x) EfiReleaseLock (x)
242 #define NET_RAISE_TPL(x) (gBS->RaiseTPL (x))
243 #define NET_RESTORE_TPL(x) (gBS->RestoreTPL (x))
245 #define TICKS_PER_MS 10000U
246 #define TICKS_PER_SECOND 10000000U
248 #define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
269 // Double linked list entry functions, this extends the
270 // EFI list functions.
272 typedef LIST_ENTRY NET_LIST_ENTRY
;
274 #define NetListInit(Head) InitializeListHead(Head)
275 #define NetListInsertHead(Head, Entry) InsertHeadList((Head), (Entry))
276 #define NetListInsertTail(Head, Entry) InsertTailList((Head), (Entry))
277 #define NetListIsEmpty(List) IsListEmpty(List)
279 #define NET_LIST_USER_STRUCT(Entry, Type, Field) \
280 _CR(Entry, Type, Field)
282 #define NET_LIST_USER_STRUCT_S(Entry, Type, Field, Sig) \
283 CR(Entry, Type, Field, Sig)
286 // Iterate through the doule linked list. It is NOT delete safe
288 #define NET_LIST_FOR_EACH(Entry, ListHead) \
289 for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
292 // Iterate through the doule linked list. This is delete-safe.
293 // Don't touch NextEntry. Also, don't use this macro if list
294 // entries other than the Entry may be deleted when processing
295 // the current Entry.
297 #define NET_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
298 for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink; \
299 Entry != (ListHead); \
300 Entry = NextEntry, NextEntry = Entry->ForwardLink \
304 // Make sure the list isn't empty before get the frist/last record.
306 #define NET_LIST_HEAD(ListHead, Type, Field) \
307 NET_LIST_USER_STRUCT((ListHead)->ForwardLink, Type, Field)
309 #define NET_LIST_TAIL(ListHead, Type, Field) \
310 NET_LIST_USER_STRUCT((ListHead)->BackLink, Type, Field)
312 #define NetListRemoveEntry(Entry) RemoveEntryList (Entry)
326 IN NET_LIST_ENTRY
*PrevEntry
,
327 IN NET_LIST_ENTRY
*NewEntry
331 NetListInsertBefore (
332 IN NET_LIST_ENTRY
*PostEntry
,
333 IN NET_LIST_ENTRY
*NewEntry
338 // Object container: EFI network stack spec defines various kinds of
339 // tokens. The drivers can share code to manage those objects.
349 NET_LIST_ENTRY Recycled
;
353 #define NET_MAP_INCREAMENT 64
379 IN VOID
*Value OPTIONAL
386 IN VOID
*Value OPTIONAL
398 IN NET_MAP_ITEM
*Item
,
399 OUT VOID
**Value OPTIONAL
405 OUT VOID
**Value OPTIONAL
411 OUT VOID
**Value OPTIONAL
416 (*NET_MAP_CALLBACK
) (
418 IN NET_MAP_ITEM
*Item
,
425 IN NET_MAP_CALLBACK CallBack
,
426 IN VOID
*Arg OPTIONAL
431 // Helper functions to implement driver binding and service binding protocols.
434 NetLibCreateServiceChild (
435 IN EFI_HANDLE ControllerHandle
,
436 IN EFI_HANDLE ImageHandle
,
437 IN EFI_GUID
*ServiceBindingGuid
,
438 OUT EFI_HANDLE
*ChildHandle
442 NetLibDestroyServiceChild (
443 IN EFI_HANDLE ControllerHandle
,
444 IN EFI_HANDLE ImageHandle
,
445 IN EFI_GUID
*ServiceBindingGuid
,
446 IN EFI_HANDLE ChildHandle
451 IN EFI_HANDLE SnpHandle
,
452 IN EFI_HANDLE ImageHandle
,
453 IN OUT CHAR16
**MacString
457 NetLibCreateIPv4DPathNode (
458 IN OUT IPv4_DEVICE_PATH
*Node
,
459 IN EFI_HANDLE Controller
,
462 IN IP4_ADDR RemoteIp
,
463 IN UINT16 RemotePort
,
465 IN BOOLEAN UseDefaultAddress
470 IN EFI_HANDLE Controller
,
471 IN EFI_GUID
*ProtocolGuid
477 IN EFI_DPC_PROCEDURE DpcProcedure
,
478 IN VOID
*DpcContext OPTIONAL
488 NetLibDefaultUnload (
489 IN EFI_HANDLE ImageHandle
496 NET_BUF_SIGNATURE
= EFI_SIGNATURE_32 ('n', 'b', 'u', 'f'),
497 NET_VECTOR_SIGNATURE
= EFI_SIGNATURE_32 ('n', 'v', 'e', 'c'),
498 NET_QUE_SIGNATURE
= EFI_SIGNATURE_32 ('n', 'b', 'q', 'u'),
501 NET_PROTO_DATA
= 64, // Opaque buffer for protocols
502 NET_BUF_HEAD
= 1, // Trim or allocate space from head
503 NET_BUF_TAIL
= 0, // Trim or allocate space from tail
504 NET_VECTOR_OWN_FIRST
= 0x01, // We allocated the 1st block in the vector
507 #define NET_CHECK_SIGNATURE(PData, SIGNATURE) \
508 ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))
510 #define NET_SWAP_SHORT(Value) \
511 ((((Value) & 0xff) << 8) | (((Value) >> 8) & 0xff))
514 // Single memory block in the vector.
517 UINT32 Len
; // The block's length
518 UINT8
*Bulk
; // The block's Data
521 typedef VOID (*NET_VECTOR_EXT_FREE
) (VOID
*Arg
);
524 //NET_VECTOR contains several blocks to hold all packet's
525 //fragments and other house-keeping stuff for sharing. It
526 //doesn't specify the where actual packet fragment begins.
530 INTN RefCnt
; // Reference count to share NET_VECTOR.
531 NET_VECTOR_EXT_FREE Free
; // external function to free NET_VECTOR
532 VOID
*Arg
; // opeque argument to Free
533 UINT32 Flag
; // Flags, NET_VECTOR_OWN_FIRST
534 UINT32 Len
; // Total length of the assocated BLOCKs
541 //NET_BLOCK_OP operate on the NET_BLOCK, It specifies
542 //where the actual fragment begins and where it ends
545 UINT8
*BlockHead
; // Block's head, or the smallest valid Head
546 UINT8
*BlockTail
; // Block's tail. BlockTail-BlockHead=block length
547 UINT8
*Head
; // 1st byte of the data in the block
548 UINT8
*Tail
; // Tail of the data in the block, Tail-Head=Size
549 UINT32 Size
; // The size of the data
554 //NET_BUF is the buffer manage structure used by the
555 //network stack. Every network packet may be fragmented,
556 //and contains multiple fragments. The Vector points to
557 //memory blocks used by the each fragment, and BlockOp
558 //specifies where each fragment begins and ends.
560 //It also contains a opaque area for protocol to store
561 //per-packet informations. Protocol must be caution not
562 //to overwrite the members after that.
567 NET_LIST_ENTRY List
; // The List this NET_BUF is on
569 IP4_HEAD
*Ip
; // Network layer header, for fast access
570 TCP_HEAD
*Tcp
; // Transport layer header, for fast access
571 UINT8 ProtoData
[NET_PROTO_DATA
]; //Protocol specific data
573 NET_VECTOR
*Vector
; // The vector containing the packet
575 UINT32 BlockOpNum
; // Total number of BlockOp in the buffer
576 UINT32 TotalSize
; // Total size of the actual packet
577 NET_BLOCK_OP BlockOp
[1]; // Specify the position of actual packet
582 //A queue of NET_BUFs, It is just a thin extension of
588 NET_LIST_ENTRY List
; // The List this buffer queue is on
590 NET_LIST_ENTRY BufList
; // list of queued buffers
591 UINT32 BufSize
; // total length of DATA in the buffers
592 UINT32 BufNum
; // total number of buffers on the chain
596 // Pseudo header for TCP and UDP checksum
609 // The fragment entry table used in network interfaces. This is
610 // the same as NET_BLOCK now. Use two different to distinguish
611 // the two in case that NET_BLOCK be enhanced later.
618 #define NET_GET_REF(PData) ((PData)->RefCnt++)
619 #define NET_PUT_REF(PData) ((PData)->RefCnt--)
620 #define NETBUF_FROM_PROTODATA(Info) _CR((Info), NET_BUF, ProtoData)
622 #define NET_BUF_SHARED(Buf) \
623 (((Buf)->RefCnt > 1) || ((Buf)->Vector->RefCnt > 1))
625 #define NET_VECTOR_SIZE(BlockNum) \
626 (sizeof (NET_VECTOR) + ((BlockNum) - 1) * sizeof (NET_BLOCK))
628 #define NET_BUF_SIZE(BlockOpNum) \
629 (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP))
631 #define NET_HEADSPACE(BlockOp) \
632 (UINTN)((BlockOp)->Head - (BlockOp)->BlockHead)
634 #define NET_TAILSPACE(BlockOp) \
635 (UINTN)((BlockOp)->BlockTail - (BlockOp)->Tail)
652 OUT UINT32
*Index OPTIONAL
663 IN NET_BUF
*Duplicate OPTIONAL
,
705 IN NET_FRAGMENT
*ExtFragment
,
709 IN NET_VECTOR_EXT_FREE ExtFree
,
710 IN VOID
*Arg OPTIONAL
716 IN NET_FRAGMENT
*ExtFragment
,
722 IN NET_LIST_ENTRY
*BufList
,
725 IN NET_VECTOR_EXT_FREE ExtFree
,
726 IN VOID
*Arg OPTIONAL
731 IN NET_LIST_ENTRY
*Head
736 IN NET_BUF_QUEUE
*NbufQue
746 IN NET_BUF_QUEUE
*NbufQue
751 IN NET_BUF_QUEUE
*NbufQue
756 IN NET_BUF_QUEUE
*NbufQue
,
762 IN NET_BUF_QUEUE
*NbufQue
,
770 IN NET_BUF_QUEUE
*NbufQue
,
776 IN NET_BUF_QUEUE
*NbufQue
797 NetPseudoHeadChecksum (
805 // The debug level definition. This value is also used as the
806 // syslog's servity level. Don't change it.
809 NETDEBUG_LEVEL_TRACE
= 5,
810 NETDEBUG_LEVEL_WARNING
= 4,
811 NETDEBUG_LEVEL_ERROR
= 3,
814 #ifdef EFI_NETWORK_STACK_DEBUG
817 // The debug output expects the ASCII format string, Use %a to print ASCII
818 // string, and %s to print UNICODE string. PrintArg must be enclosed in ().
819 // For example: NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name));
821 #define NET_DEBUG_TRACE(Module, PrintArg) \
823 NETDEBUG_LEVEL_TRACE, \
827 NetDebugASPrint PrintArg \
830 #define NET_DEBUG_WARNING(Module, PrintArg) \
832 NETDEBUG_LEVEL_WARNING, \
836 NetDebugASPrint PrintArg \
839 #define NET_DEBUG_ERROR(Module, PrintArg) \
841 NETDEBUG_LEVEL_ERROR, \
845 NetDebugASPrint PrintArg \
849 #define NET_DEBUG_TRACE(Module, PrintString)
850 #define NET_DEBUG_WARNING(Module, PrintString)
851 #define NET_DEBUG_ERROR(Module, PrintString)
870 // Network debug message is sent out as syslog.
873 NET_SYSLOG_FACILITY
= 16, // Syslog local facility local use
874 NET_SYSLOG_PACKET_LEN
= 512,
875 NET_DEBUG_MSG_LEN
= 470, // 512 - (ether+ip+udp head length)
876 NET_SYSLOG_TX_TIMEOUT
= 500 *1000 *10, // 500ms