X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FInclude%2FLibrary%2FNetLib.h;h=b9df46c50f63f73671654e246bdb37d8caf8d603;hp=039e04f696f4a7f4d860a1702cc5d65e5ebb6a15;hb=29788f178e48fa5ffe7d3262d73c9548e9285d2d;hpb=779ae3579848a36319d67a6ba012b4b9aa88aa6b diff --git a/MdeModulePkg/Include/Library/NetLib.h b/MdeModulePkg/Include/Library/NetLib.h index 039e04f696..b9df46c50f 100644 --- a/MdeModulePkg/Include/Library/NetLib.h +++ b/MdeModulePkg/Include/Library/NetLib.h @@ -2,10 +2,10 @@ This library is only intended to be used by UEFI network stack modules. It provides basic functions for the UEFI network stack. -Copyright (c) 2005 - 2009, Intel Corporation -All rights reserved. This program and the accompanying materials +Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at +which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, @@ -19,6 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include +#include typedef UINT32 IP4_ADDR; typedef UINT32 TCP_SEQNO; @@ -36,21 +37,27 @@ typedef UINT16 TCP_PORTNO; #define EFI_IP_PROTO_ICMP 0x01 #define IP4_PROTO_IGMP 0x02 #define IP6_ICMP 58 +#define DNS_MAX_NAME_SIZE 255 +#define DNS_MAX_MESSAGE_SIZE 512 // // The address classification // -#define IP4_ADDR_CLASSA 1 -#define IP4_ADDR_CLASSB 2 -#define IP4_ADDR_CLASSC 3 +#define IP4_ADDR_CLASSA 1 // Deprecated +#define IP4_ADDR_CLASSB 2 // Deprecated +#define IP4_ADDR_CLASSC 3 // Deprecated #define IP4_ADDR_CLASSD 4 #define IP4_ADDR_CLASSE 5 #define IP4_MASK_NUM 33 #define IP6_PREFIX_NUM 129 +#define IP4_MASK_MAX 32 +#define IP6_PREFIX_MAX 128 + #define IP6_HOP_BY_HOP 0 #define IP6_DESTINATION 60 +#define IP6_ROUTING 43 #define IP6_FRAGMENT 44 #define IP6_AH 51 #define IP6_ESP 50 @@ -59,6 +66,35 @@ typedef UINT16 TCP_PORTNO; #define IP_VERSION_4 4 #define IP_VERSION_6 6 +#define IP6_PREFIX_LENGTH 64 + +// +// DNS QTYPE values +// +#define DNS_TYPE_A 1 +#define DNS_TYPE_NS 2 +#define DNS_TYPE_CNAME 5 +#define DNS_TYPE_SOA 6 +#define DNS_TYPE_WKS 11 +#define DNS_TYPE_PTR 12 +#define DNS_TYPE_HINFO 13 +#define DNS_TYPE_MINFO 14 +#define DNS_TYPE_MX 15 +#define DNS_TYPE_TXT 16 +#define DNS_TYPE_AAAA 28 +#define DNS_TYPE_SRV_RR 33 +#define DNS_TYPE_AXFR 252 +#define DNS_TYPE_MAILB 253 +#define DNS_TYPE_ANY 255 + +// +// DNS QCLASS values +// +#define DNS_CLASS_INET 1 +#define DNS_CLASS_CH 3 +#define DNS_CLASS_HS 4 +#define DNS_CLASS_ANY 255 + #pragma pack(1) // @@ -195,9 +231,10 @@ typedef struct { // Test the IP's attribute, All the IPs are in host byte order. // #define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000) +#define IP4_IS_UNSPECIFIED(Ip) ((Ip) == 0) #define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF) #define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask))) -#define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != IP4_MASK_NUM) +#define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != (IP4_MASK_MAX + 1)) #define IP6_IS_MULTICAST(Ip6) (((Ip6)->Addr[0]) == 0xFF) @@ -210,12 +247,13 @@ typedef struct { #define EFI_IP6_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv6_ADDRESS)) == 0) +#define IP4_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv4_ADDRESS))) #define IP6_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv6_ADDRESS))) #define IP6_COPY_LINK_ADDRESS(Mac1, Mac2) (CopyMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS))) // // The debug level definition. This value is also used as the -// syslog's servity level. Don't change it. +// syslog's severity level. Don't change it. // #define NETDEBUG_LEVEL_TRACE 5 #define NETDEBUG_LEVEL_WARNING 4 @@ -282,10 +320,11 @@ typedef struct { by the Format string. @return The buffer containing the formatted message, - or NULL if failed to allocate memory. + or NULL if memory allocation failed. **/ CHAR8 * +EFIAPI NetDebugASPrint ( IN CHAR8 *Format, ... @@ -297,8 +336,8 @@ NetDebugASPrint ( This function will locate a instance of SNP then send the message through it. Because it isn't open the SNP BY_DRIVER, apply caution when using it. - @param Level The servity level of the message. - @param Module The Moudle that generates the log. + @param Level The severity level of the message. + @param Module The Module that generates the log. @param File The file that contains the log. @param Line The exact line that contains the log. @param Message The user message to log. @@ -309,6 +348,7 @@ NetDebugASPrint ( than the mNetDebugLevelMax. Or, it has been sent out. **/ EFI_STATUS +EFIAPI NetDebugOutput ( IN UINT32 Level, IN UINT8 *Module, @@ -340,6 +380,11 @@ NetGetMaskLength ( Return the class of the IP address, such as class A, B, C. Addr is in host byte order. + [ATTENTION] + Classful addressing (IP class A/B/C) has been deprecated according to RFC4632. + Caller of this function could only check the returned value against + IP4_ADDR_CLASSD (multicast) or IP4_ADDR_CLASSE (reserved) now. + The address of class A starts with 0. If the address belong to class A, return IP4_ADDR_CLASSA. The address of class B starts with 10. @@ -365,17 +410,18 @@ NetGetIpClass ( /** Check whether the IP is a valid unicast address according to - the netmask. If NetMask is zero, use the IP address's class to get the default mask. - - If Ip is 0, IP is not a valid unicast address. - Class D address is used for multicasting and class E address is reserved for future. If Ip - belongs to class D or class E, Ip is not a valid unicast address. - If all bits of the host address of Ip are 0 or 1, Ip is not a valid unicast address. - + the netmask. + + ASSERT if NetMask is zero. + + If all bits of the host address of IP are 0 or 1, IP is also not a valid unicast address, + except when the originator is one of the endpoints of a point-to-point link with a 31-bit + mask (RFC3021). + @param[in] Ip The IP to check against. @param[in] NetMask The mask of the IP. - @return TRUE if Ip is a valid unicast address on the network, otherwise FALSE. + @return TRUE if IP is a valid unicast address on the network, otherwise FALSE. **/ BOOLEAN @@ -400,6 +446,7 @@ NetIp4IsUnicast ( **/ BOOLEAN +EFIAPI NetIp6IsValidUnicast ( IN EFI_IPv6_ADDRESS *Ip6 ); @@ -410,11 +457,12 @@ NetIp6IsValidUnicast ( @param[in] Ip6 - Ip6 address, in network order. - @retval TRUE - Yes, unspecified - @retval FALSE - No + @retval TRUE - Yes, incoming Ipv6 address is the unspecified address. + @retval FALSE - The incoming Ipv6 address is not the unspecified address **/ BOOLEAN +EFIAPI NetIp6IsUnspecifiedAddr ( IN EFI_IPv6_ADDRESS *Ip6 ); @@ -424,11 +472,12 @@ NetIp6IsUnspecifiedAddr ( @param[in] Ip6 - Ip6 address, in network order. - @retval TRUE - Yes, link-local address - @retval FALSE - No + @retval TRUE - The incoming Ipv6 address is a link-local address. + @retval FALSE - The incoming Ipv6 address is not a link-local address. **/ BOOLEAN +EFIAPI NetIp6IsLinkLocalAddr ( IN EFI_IPv6_ADDRESS *Ip6 ); @@ -440,11 +489,12 @@ NetIp6IsLinkLocalAddr ( @param[in] Ip2 - Ip6 address2, in network order. @param[in] PrefixLength - The prefix length of the checking net. - @retval TRUE - Yes, connected. - @retval FALSE - No. + @retval TRUE - Yes, the Ipv6 address1 and address2 are connected. + @retval FALSE - No the Ipv6 address1 and address2 are not connected. **/ BOOLEAN +EFIAPI NetIp6IsNetEqual ( EFI_IPv6_ADDRESS *Ip1, EFI_IPv6_ADDRESS *Ip2, @@ -452,18 +502,19 @@ NetIp6IsNetEqual ( ); /** - Switches the endianess of an IPv6 address + Switches the endianess of an IPv6 address. This function swaps the bytes in a 128-bit IPv6 address to switch the value from little endian to big endian or vice versa. The byte swapped value is returned. - @param Ip6 Points to an IPv6 address + @param Ip6 Points to an IPv6 address. @return The byte swapped IPv6 address. **/ EFI_IPv6_ADDRESS * +EFIAPI Ip6Swap128 ( EFI_IPv6_ADDRESS *Ip6 ); @@ -474,6 +525,7 @@ extern IP4_ADDR gIp4AllMasks[IP4_MASK_NUM]; extern EFI_IPv4_ADDRESS mZeroIp4Addr; #define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9')) +#define NET_IS_HEX(Ch) ((('0' <= (Ch)) && ((Ch) <= '9')) || (('A' <= (Ch)) && ((Ch) <= 'F')) || (('a' <= (Ch)) && ((Ch) <= 'f'))) #define NET_ROUNDUP(size, unit) (((size) + (unit) - 1) & (~((unit) - 1))) #define NET_IS_LOWER_CASE_CHAR(Ch) (('a' <= (Ch)) && ((Ch) <= 'z')) #define NET_IS_UPPER_CASE_CHAR(Ch) (('A' <= (Ch)) && ((Ch) <= 'Z')) @@ -503,11 +555,11 @@ NetGetUint32 ( /** Puts a UINT32 into the byte stream in network byte order. - Converts a UINT32 from host byte order to network byte order, and then copies it to the + Converts a UINT32 from host byte order to network byte order, then copies it to the byte stream. - @param[in, out] Buf The buffer to put the UINT32. - @param[in] Data The data to put. + @param[in, out] Buf The buffer in which to put the UINT32. + @param[in] Data The data to be converted and put into the byte stream. **/ VOID @@ -518,13 +570,13 @@ NetPutUint32 ( ); /** - Initialize a random seed using current time. + Initialize a random seed using current time and monotonic count. - Get current time first. Then initialize a random seed based on some basic - mathematical operations on the hour, day, minute, second, nanosecond and year - of the current time. + Get current time and monotonic count first. Then initialize a random seed + based on some basic mathematics operation on the hour, day, minute, second, + nanosecond and year of the current time and the monotonic count value. - @return The random seed, initialized with current time. + @return The random seed initialized with current time. **/ UINT32 @@ -650,6 +702,73 @@ NetListInsertBefore ( IN OUT LIST_ENTRY *NewEntry ); +/** + Callback function which provided by user to remove one node in NetDestroyLinkList process. + + @param[in] Entry The entry to be removed. + @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList. + + @retval EFI_SUCCESS The entry has been removed successfully. + @retval Others Fail to remove the entry. + +**/ +typedef +EFI_STATUS +(EFIAPI *NET_DESTROY_LINK_LIST_CALLBACK) ( + IN LIST_ENTRY *Entry, + IN VOID *Context OPTIONAL + ); + +/** + Safe destroy nodes in a linked list, and return the length of the list after all possible operations finished. + + Destroy network children list by list traversals is not safe due to graph dependencies between nodes. + This function performs a safe traversal to destroy these nodes by checking to see if the node being destroyed + has been removed from the list or not. + If it has been removed, then restart the traversal from the head. + If it hasn't been removed, then continue with the next node directly. + This function will end the iterate and return the CallBack's last return value if error happens, + or retrun EFI_SUCCESS if 2 complete passes are made with no changes in the number of children in the list. + + @param[in] List The head of the list. + @param[in] CallBack Pointer to the callback function to destroy one node in the list. + @param[in] Context Pointer to the callback function's context: corresponds to the + parameter Context in NET_DESTROY_LINK_LIST_CALLBACK. + @param[out] ListLength The length of the link list if the function returns successfully. + + @retval EFI_SUCCESS Two complete passes are made with no changes in the number of children. + @retval EFI_INVALID_PARAMETER The input parameter is invalid. + @retval Others Return the CallBack's last return value. + +**/ +EFI_STATUS +EFIAPI +NetDestroyLinkList ( + IN LIST_ENTRY *List, + IN NET_DESTROY_LINK_LIST_CALLBACK CallBack, + IN VOID *Context, OPTIONAL + OUT UINTN *ListLength OPTIONAL + ); + +/** + This function checks the input Handle to see if it's one of these handles in ChildHandleBuffer. + + @param[in] Handle Handle to be checked. + @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. + @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL + if NumberOfChildren is 0. + + @retval TRUE Found the input Handle in ChildHandleBuffer. + @retval FALSE Can't find the input Handle in ChildHandleBuffer. + +**/ +BOOLEAN +EFIAPI +NetIsInHandleBuffer ( + IN EFI_HANDLE Handle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer OPTIONAL + ); // // Object container: EFI network stack spec defines various kinds of @@ -888,7 +1007,7 @@ NetMapRemoveTail ( typedef EFI_STATUS -(*NET_MAP_CALLBACK) ( +(EFIAPI *NET_MAP_CALLBACK) ( IN NET_MAP *Map, IN NET_MAP_ITEM *Item, IN VOID *Arg @@ -897,7 +1016,7 @@ EFI_STATUS /** Iterate through the netmap and call CallBack for each item. - It will contiue the traverse if CallBack returns EFI_SUCCESS, otherwise, break + It will continue the traverse if CallBack returns EFI_SUCCESS, otherwise, break from the loop. It returns the CallBack's last return value. This function is delete safe for the current item. @@ -908,8 +1027,8 @@ EFI_STATUS @param[in] CallBack The callback function to call for each item. @param[in] Arg The opaque parameter to the callback. - @retval EFI_SUCCESS There is no item in the netmap or CallBack for each item - return EFI_SUCCESS. + @retval EFI_SUCCESS There is no item in the netmap, or CallBack for each item + returns EFI_SUCCESS. @retval Others It returns the CallBack's last return value. **/ @@ -963,7 +1082,7 @@ NetLibCreateServiceChild ( @param[in] ServiceBindingGuid The service's Guid. @param[in] ChildHandle The child to destroy. - @retval EFI_SUCCESS The child is successfully destroyed. + @retval EFI_SUCCESS The child was destroyed. @retval Others Failed to destroy the child. **/ @@ -1025,9 +1144,9 @@ NetLibGetVlanId ( This function will append VLAN device path node to the parent device path, and then use LocateDevicePath() to find the correct VLAN device handle. - @param[in] ServiceHandle The handle where network service binding protocols are + @param[in] ControllerHandle The handle where network service binding protocols are installed on. - @param[in] VLanId The configured VLAN ID for the VLAN device. + @param[in] VlanId The configured VLAN ID for the VLAN device. @return The VLAN device handle, or NULL if not found. @@ -1051,7 +1170,7 @@ NetLibGetVlanHandle ( @param[out] MacAddress The pointer to store the returned MAC address. @param[out] AddressSize The length of returned MAC address. - @retval EFI_SUCCESS MAC address is returned successfully. + @retval EFI_SUCCESS MAC address was returned successfully. @retval Others Failed to get SNP mode data. **/ @@ -1073,14 +1192,15 @@ NetLibGetMacAddress ( Plus one unicode character for the null-terminator. @param[in] ServiceHandle The handle where network service binding protocol is - installed on. + installed. @param[in] ImageHandle The image handle used to act as the agent handle to - get the simple network protocol. + get the simple network protocol. This parameter is + optional and may be NULL. @param[out] MacString The pointer to store the address of the string representation of the mac address. - @retval EFI_SUCCESS Convert the mac address a unicode string successfully. - @retval EFI_OUT_OF_RESOURCES There are not enough memory resource. + @retval EFI_SUCCESS Converted the mac address a unicode string successfully. + @retval EFI_OUT_OF_RESOURCES There are not enough memory resources. @retval Others Failed to open the simple network protocol. **/ @@ -1088,19 +1208,54 @@ EFI_STATUS EFIAPI NetLibGetMacString ( IN EFI_HANDLE ServiceHandle, - IN EFI_HANDLE ImageHandle, + IN EFI_HANDLE ImageHandle, OPTIONAL OUT CHAR16 **MacString ); +/** + Detect media status for specified network device. + + The underlying UNDI driver may or may not support reporting media status from + GET_STATUS command (PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED). This routine + will try to invoke Snp->GetStatus() to get the media status. If media is already + present, it returns directly. If media is not present, it will stop SNP and then + restart SNP to get the latest media status. This provides an opportunity to get + the correct media status for old UNDI driver, which doesn't support reporting + media status from GET_STATUS command. + Note: there are two limitations for the current algorithm: + 1) For UNDI with this capability, when the cable is not attached, there will + be an redundant Stop/Start() process. + 2) for UNDI without this capability, in case that network cable is attached when + Snp->Initialize() is invoked while network cable is unattached later, + NetLibDetectMedia() will report MediaPresent as TRUE, causing upper layer + apps to wait for timeout time. + + @param[in] ServiceHandle The handle where network service binding protocols are + installed. + @param[out] MediaPresent The pointer to store the media status. + + @retval EFI_SUCCESS Media detection success. + @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network device handle. + @retval EFI_UNSUPPORTED The network device does not support media detection. + @retval EFI_DEVICE_ERROR SNP is in an unknown state. + +**/ +EFI_STATUS +EFIAPI +NetLibDetectMedia ( + IN EFI_HANDLE ServiceHandle, + OUT BOOLEAN *MediaPresent + ); + /** Create an IPv4 device path node. The header type of IPv4 device path node is MESSAGING_DEVICE_PATH. The header subtype of IPv4 device path node is MSG_IPv4_DP. The length of the IPv4 device path node in bytes is 19. - Get other info from parameters to make up the whole IPv4 device path node. + Get other information from parameters to make up the whole IPv4 device path node. - @param[in, out] Node Pointer to the IPv4 device path node. + @param[in, out] Node The pointer to the IPv4 device path node. @param[in] Controller The controller handle. @param[in] LocalIp The local IPv4 address. @param[in] LocalPort The local port. @@ -1129,9 +1284,9 @@ NetLibCreateIPv4DPathNode ( The header type of IPv6 device path node is MESSAGING_DEVICE_PATH. The header subtype of IPv6 device path node is MSG_IPv6_DP. The length of the IPv6 device path node in bytes is 43. - Get other info from parameters to make up the whole IPv6 device path node. + Get other information from parameters to make up the whole IPv6 device path node. - @param[in, out] Node Pointer to the IPv6 device path node. + @param[in, out] Node The pointer to the IPv6 device path node. @param[in] Controller The controller handle. @param[in] LocalIp The local IPv6 address. @param[in] LocalPort The local port. @@ -1158,13 +1313,13 @@ NetLibCreateIPv6DPathNode ( For example, IP will open an MNP child to transmit/receive packets. When MNP is stopped, IP should also be stopped. IP - needs to find its own private data which is related the IP's - service binding instance that is install on UNDI/SNP handle. - Now, the controller is either a MNP or ARP child handle. But - IP opens these handle BY_DRIVER, use that info, we can get the + needs to find its own private data that is related the IP's + service binding instance that is installed on the UNDI/SNP handle. + The controller is then either an MNP or an ARP child handle. Note that + IP opens these handles using BY_DRIVER. Use that information to get the UNDI/SNP handle. - @param[in] Controller Then protocol handle to check. + @param[in] Controller The protocol handle to check. @param[in] ProtocolGuid The protocol that is related with the handle. @return The UNDI/SNP handle or NULL for errors. @@ -1195,9 +1350,121 @@ NetLibDefaultUnload ( IN EFI_HANDLE ImageHandle ); +/** + Convert one Null-terminated ASCII string (decimal dotted) to EFI_IPv4_ADDRESS. + + @param[in] String The pointer to the Ascii string. + @param[out] Ip4Address The pointer to the converted IPv4 address. + + @retval EFI_SUCCESS Converted to an IPv4 address successfully. + @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip4Address is NULL. + +**/ +EFI_STATUS +EFIAPI +NetLibAsciiStrToIp4 ( + IN CONST CHAR8 *String, + OUT EFI_IPv4_ADDRESS *Ip4Address + ); + +/** + Convert one Null-terminated ASCII string to EFI_IPv6_ADDRESS. The format of the + string is defined in RFC 4291 - Text Representation of Addresses. + + @param[in] String The pointer to the Ascii string. + @param[out] Ip6Address The pointer to the converted IPv6 address. + + @retval EFI_SUCCESS Converted to an IPv6 address successfully. + @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip6Address is NULL. + +**/ +EFI_STATUS +EFIAPI +NetLibAsciiStrToIp6 ( + IN CONST CHAR8 *String, + OUT EFI_IPv6_ADDRESS *Ip6Address + ); + +/** + Convert one Null-terminated Unicode string (decimal dotted) to EFI_IPv4_ADDRESS. + + @param[in] String The pointer to the Ascii string. + @param[out] Ip4Address The pointer to the converted IPv4 address. + + @retval EFI_SUCCESS Converted to an IPv4 address successfully. + @retval EFI_INVALID_PARAMETER The string is mal-formatted or Ip4Address is NULL. + +**/ +EFI_STATUS +EFIAPI +NetLibStrToIp4 ( + IN CONST CHAR16 *String, + OUT EFI_IPv4_ADDRESS *Ip4Address + ); + +/** + Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS. The format of + the string is defined in RFC 4291 - Text Representation of Addresses. + + @param[in] String The pointer to the Ascii string. + @param[out] Ip6Address The pointer to the converted IPv6 address. + + @retval EFI_SUCCESS Converted to an IPv6 address successfully. + @retval EFI_INVALID_PARAMETER The string is malformatted or Ip6Address is NULL. + +**/ +EFI_STATUS +EFIAPI +NetLibStrToIp6 ( + IN CONST CHAR16 *String, + OUT EFI_IPv6_ADDRESS *Ip6Address + ); + +/** + Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS and prefix length. + The format of the string is defined in RFC 4291 - Text Representation of Addresses + Prefixes: ipv6-address/prefix-length. + + @param[in] String The pointer to the Ascii string. + @param[out] Ip6Address The pointer to the converted IPv6 address. + @param[out] PrefixLength The pointer to the converted prefix length. + + @retval EFI_SUCCESS Converted to an IPv6 address successfully. + @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip6Address is NULL. + +**/ +EFI_STATUS +EFIAPI +NetLibStrToIp6andPrefix ( + IN CONST CHAR16 *String, + OUT EFI_IPv6_ADDRESS *Ip6Address, + OUT UINT8 *PrefixLength + ); + +/** + + Convert one EFI_IPv6_ADDRESS to Null-terminated Unicode string. + The text representation of address is defined in RFC 4291. + + @param[in] Ip6Address The pointer to the IPv6 address. + @param[out] String The buffer to return the converted string. + @param[in] StringSize The length in bytes of the input String. + + @retval EFI_SUCCESS Convert to string successfully. + @retval EFI_INVALID_PARAMETER The input parameter is invalid. + @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small for the result. BufferSize has been + updated with the size needed to complete the request. +**/ +EFI_STATUS +EFIAPI +NetLibIp6ToStr ( + IN EFI_IPv6_ADDRESS *Ip6Address, + OUT CHAR16 *String, + IN UINTN StringSize + ); // -//Various signatures +// Various signatures // #define NET_BUF_SIGNATURE SIGNATURE_32 ('n', 'b', 'u', 'f') #define NET_VECTOR_SIGNATURE SIGNATURE_32 ('n', 'v', 'e', 'c') @@ -1220,7 +1487,7 @@ typedef struct { UINT8 *Bulk; // The block's Data } NET_BLOCK; -typedef VOID (*NET_VECTOR_EXT_FREE) (VOID *Arg); +typedef VOID (EFIAPI *NET_VECTOR_EXT_FREE) (VOID *Arg); // //NET_VECTOR contains several blocks to hold all packet's @@ -1231,9 +1498,9 @@ typedef struct { UINT32 Signature; INTN RefCnt; // Reference count to share NET_VECTOR. NET_VECTOR_EXT_FREE Free; // external function to free NET_VECTOR - VOID *Arg; // opeque argument to Free + VOID *Arg; // opaque argument to Free UINT32 Flag; // Flags, NET_VECTOR_OWN_FIRST - UINT32 Len; // Total length of the assocated BLOCKs + UINT32 Len; // Total length of the associated BLOCKs UINT32 BlockNum; NET_BLOCK Block[1]; @@ -1342,10 +1609,10 @@ typedef struct { (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP)) #define NET_HEADSPACE(BlockOp) \ - (UINTN)((BlockOp)->Head - (BlockOp)->BlockHead) + ((UINTN)((BlockOp)->Head) - (UINTN)((BlockOp)->BlockHead)) #define NET_TAILSPACE(BlockOp) \ - (UINTN)((BlockOp)->BlockTail - (BlockOp)->Tail) + ((UINTN)((BlockOp)->BlockTail) - (UINTN)((BlockOp)->Tail)) /** Allocate a single block NET_BUF. Upon allocation, all the @@ -1353,8 +1620,8 @@ typedef struct { @param[in] Len The length of the block. - @return Pointer to the allocated NET_BUF, or NULL if the - allocation failed due to resource limit. + @return The pointer to the allocated NET_BUF, or NULL if the + allocation failed due to resource limitations. **/ NET_BUF * @@ -1372,7 +1639,7 @@ NetbufAlloc ( vector by one, and performs the resource free operation when the reference count of the net vector is 0. - @param[in] Nbuf Pointer to the NET_BUF to be freed. + @param[in] Nbuf The pointer to the NET_BUF to be freed. **/ VOID @@ -1389,12 +1656,12 @@ NetbufFree ( also can be used to get the fragment that contains the byte used mainly by the library implementation itself. - @param[in] Nbuf Pointer to the net buffer. + @param[in] Nbuf The pointer to the net buffer. @param[in] Offset The offset of the byte. @param[out] Index Index of the NET_BLOCK_OP that contains the byte at Offset. - @return Pointer to the Offset'th byte of data in the net buffer, or NULL + @return The pointer to the Offset'th byte of data in the net buffer, or NULL if there is no such data in the net buffer. **/ @@ -1412,10 +1679,10 @@ NetbufGetByte ( The reference count of the newly created net buffer is set to 1. The reference count of the associated net vector is increased by one. - @param[in] Nbuf Pointer to the net buffer to be cloned. + @param[in] Nbuf The pointer to the net buffer to be cloned. - @return Pointer to the cloned net buffer, or NULL if the - allocation failed due to resource limit. + @return The pointer to the cloned net buffer, or NULL if the + allocation failed due to resource limitations. **/ NET_BUF * @@ -1431,13 +1698,13 @@ NetbufClone ( The duplicated net buffer will allocate its own memory to hold the data of the source net buffer. - @param[in] Nbuf Pointer to the net buffer to be duplicated from. - @param[in, out] Duplicate Pointer to the net buffer to duplicate to, if - NULL a new net buffer is allocated. - @param[in] HeadSpace Length of the head space to reserve. + @param[in] Nbuf The pointer to the net buffer to be duplicated from. + @param[in, out] Duplicate The pointer to the net buffer to duplicate to. If + NULL, a new net buffer is allocated. + @param[in] HeadSpace The length of the head space to reserve. - @return Pointer to the duplicated net buffer, or NULL if - the allocation failed due to resource limit. + @return The pointer to the duplicated net buffer, or NULL if + the allocation failed due to resource limitations. **/ NET_BUF * @@ -1453,16 +1720,16 @@ NetbufDuplicate ( Offset. A new NET_BUF structure will be created but the associated data in NET_VECTOR - is shared. This function exists to do IP packet fragmentation. + is shared. This function exists to perform IP packet fragmentation. - @param[in] Nbuf Pointer to the net buffer to be extracted. + @param[in] Nbuf The pointer to the net buffer to be extracted. @param[in] Offset Starting point of the data to be included in the new net buffer. - @param[in] Len Bytes of data to be included in the new net buffer. - @param[in] HeadSpace Bytes of head space to reserve for protocol header. + @param[in] Len The bytes of data to be included in the new net buffer. + @param[in] HeadSpace The bytes of the head space to reserve for the protocol header. - @return Pointer to the cloned net buffer, or NULL if the - allocation failed due to resource limit. + @return The pointer to the cloned net buffer, or NULL if the + allocation failed due to resource limitations. **/ NET_BUF * @@ -1478,11 +1745,11 @@ NetbufGetFragment ( Reserve some space in the header room of the net buffer. Upon allocation, all the space is in the tail room of the buffer. Call this - function to move some space to the header room. This function is quite limited + function to move space to the header room. This function is quite limited in that it can only reserve space from the first block of an empty NET_BUF not - built from the external. But it should be enough for the network stack. + built from the external. However, it should be enough for the network stack. - @param[in, out] Nbuf Pointer to the net buffer. + @param[in, out] Nbuf The pointer to the net buffer. @param[in] Len The length of buffer to be reserved from the header. **/ @@ -1496,13 +1763,13 @@ NetbufReserve ( /** Allocate Len bytes of space from the header or tail of the buffer. - @param[in, out] Nbuf Pointer to the net buffer. + @param[in, out] Nbuf The pointer to the net buffer. @param[in] Len The length of the buffer to be allocated. - @param[in] FromHead The flag to indicate whether reserve the data + @param[in] FromHead The flag to indicate whether to reserve the data from head (TRUE) or tail (FALSE). - @return Pointer to the first byte of the allocated buffer, - or NULL if there is no sufficient space. + @return The pointer to the first byte of the allocated buffer, + or NULL, if there is no sufficient space. **/ UINT8* @@ -1514,14 +1781,14 @@ NetbufAllocSpace ( ); /** - Trim Len bytes from the header or tail of the net buffer. + Trim Len bytes from the header or the tail of the net buffer. - @param[in, out] Nbuf Pointer to the net buffer. + @param[in, out] Nbuf The pointer to the net buffer. @param[in] Len The length of the data to be trimmed. - @param[in] FromHead The flag to indicate whether trim data from head - (TRUE) or tail (FALSE). + @param[in] FromHead The flag to indicate whether trim data is from the + head (TRUE) or the tail (FALSE). - @return Length of the actually trimmed data, which may be less + @return The length of the actual trimmed data, which may be less than Len if the TotalSize of Nbuf is less than Len. **/ @@ -1539,9 +1806,9 @@ NetbufTrim ( The Len bytes of data may cross several fragments of the net buffer. - @param[in] Nbuf Pointer to the net buffer. + @param[in] Nbuf The pointer to the net buffer. @param[in] Offset The sequence number of the first byte to copy. - @param[in] Len Length of the data to copy. + @param[in] Len The length of the data to copy. @param[in] Dest The destination of the data to copy to. @return The length of the actual copied data, or 0 if the offset @@ -1565,16 +1832,16 @@ NetbufCopy ( and existing HeadLen bytes of header, but the external blocks are shared by the net buffer to avoid data copying. - @param[in] ExtFragment Pointer to the data block. + @param[in] ExtFragment The pointer to the data block. @param[in] ExtNum The number of the data blocks. @param[in] HeadSpace The head space to be reserved. @param[in] HeadLen The length of the protocol header. The function pulls this amount of data into a linear block. - @param[in] ExtFree Pointer to the caller-provided free function. + @param[in] ExtFree The pointer to the caller-provided free function. @param[in] Arg The argument passed to ExtFree when ExtFree is called. - @return Pointer to the net buffer built from the data blocks, + @return The pointer to the net buffer built from the data blocks, or NULL if the allocation failed due to resource limit. @@ -1594,13 +1861,13 @@ NetbufFromExt ( Build a fragment table to contain the fragments in the net buffer. This is the opposite operation of the NetbufFromExt. - @param[in] Nbuf Point to the net buffer. - @param[in, out] ExtFragment Pointer to the data block. + @param[in] Nbuf Points to the net buffer. + @param[in, out] ExtFragment The pointer to the data block. @param[in, out] ExtNum The number of the data blocks. @retval EFI_BUFFER_TOO_SMALL The number of non-empty blocks is bigger than ExtNum. - @retval EFI_SUCCESS Fragment table is built successfully. + @retval EFI_SUCCESS The fragment table was built successfully. **/ EFI_STATUS @@ -1614,17 +1881,17 @@ NetbufBuildExt ( /** Build a net buffer from a list of net buffers. - All the fragments will be collected from the list of NEW_BUF and then a new + All the fragments will be collected from the list of NEW_BUF, and then a new net buffer will be created through NetbufFromExt. @param[in] BufList A List of the net buffer. @param[in] HeadSpace The head space to be reserved. @param[in] HeaderLen The length of the protocol header. The function pulls this amount of data into a linear block. - @param[in] ExtFree Pointer to the caller provided free function. + @param[in] ExtFree The pointer to the caller provided free function. @param[in] Arg The argument passed to ExtFree when ExtFree is called. - @return Pointer to the net buffer built from the list of net + @return The pointer to the net buffer built from the list of net buffers. **/ @@ -1641,7 +1908,7 @@ NetbufFromBufList ( /** Free a list of net buffers. - @param[in, out] Head Pointer to the head of linked net buffers. + @param[in, out] Head The pointer to the head of linked net buffers. **/ VOID @@ -1653,7 +1920,7 @@ NetbufFreeList ( /** Initiate the net buffer queue. - @param[in, out] NbufQue Pointer to the net buffer queue to be initialized. + @param[in, out] NbufQue The pointer to the net buffer queue to be initialized. **/ VOID @@ -1665,7 +1932,7 @@ NetbufQueInit ( /** Allocate and initialize a net buffer queue. - @return Pointer to the allocated net buffer queue, or NULL if the + @return The pointer to the allocated net buffer queue, or NULL if the allocation failed due to resource limit. **/ @@ -1682,7 +1949,7 @@ NetbufQueAlloc ( free operation isn't performed until the reference count of the net buffer queue is decreased to 0. - @param[in] NbufQue Pointer to the net buffer queue to be freed. + @param[in] NbufQue The pointer to the net buffer queue to be freed. **/ VOID @@ -1694,9 +1961,9 @@ NetbufQueFree ( /** Remove a net buffer from the head in the specific queue and return it. - @param[in, out] NbufQue Pointer to the net buffer queue. + @param[in, out] NbufQue The pointer to the net buffer queue. - @return Pointer to the net buffer removed from the specific queue, + @return The pointer to the net buffer removed from the specific queue, or NULL if there is no net buffer in the specific queue. **/ @@ -1709,8 +1976,8 @@ NetbufQueRemove ( /** Append a net buffer to the net buffer queue. - @param[in, out] NbufQue Pointer to the net buffer queue. - @param[in, out] Nbuf Pointer to the net buffer to be appended. + @param[in, out] NbufQue The pointer to the net buffer queue. + @param[in, out] Nbuf The pointer to the net buffer to be appended. **/ VOID @@ -1724,12 +1991,12 @@ NetbufQueAppend ( Copy Len bytes of data from the net buffer queue at the specific offset to the destination memory. - The copying operation is the same as NetbufCopy but applies to the net buffer + The copying operation is the same as NetbufCopy, but applies to the net buffer queue instead of the net buffer. - @param[in] NbufQue Pointer to the net buffer queue. + @param[in] NbufQue The pointer to the net buffer queue. @param[in] Offset The sequence number of the first byte to copy. - @param[in] Len Length of the data to copy. + @param[in] Len The length of the data to copy. @param[out] Dest The destination of the data to copy to. @return The length of the actual copied data, or 0 if the offset @@ -1746,14 +2013,14 @@ NetbufQueCopy ( ); /** - Trim Len bytes of data from the queue header and release any net buffer - that is trimmed wholely. + Trim Len bytes of data from the buffer queue and free any net buffer + that is completely trimmed. The trimming operation is the same as NetbufTrim but applies to the net buffer queue instead of the net buffer. - @param[in, out] NbufQue Pointer to the net buffer queue. - @param[in] Len Length of the data to trim. + @param[in, out] NbufQue The pointer to the net buffer queue. + @param[in] Len The length of the data to trim. @return The actual length of the data trimmed. @@ -1769,7 +2036,7 @@ NetbufQueTrim ( /** Flush the net buffer queue. - @param[in, out] NbufQue Pointer to the queue to be flushed. + @param[in, out] NbufQue The pointer to the queue to be flushed. **/ VOID @@ -1781,8 +2048,8 @@ NetbufQueFlush ( /** Compute the checksum for a bulk of data. - @param[in] Bulk Pointer to the data. - @param[in] Len Length of the data, in bytes. + @param[in] Bulk The pointer to the data. + @param[in] Len The length of the data, in bytes. @return The computed checksum. @@ -1813,7 +2080,7 @@ NetAddChecksum ( /** Compute the checksum for a NET_BUF. - @param[in] Nbuf Pointer to the net buffer. + @param[in] Nbuf The pointer to the net buffer. @return The computed checksum. @@ -1847,7 +2114,7 @@ NetPseudoHeadChecksum ( ); /** - Compute the checksum for TCP6/UDP6 pseudo header. + Compute the checksum for the TCP6/UDP6 pseudo header. Src and Dst are in network byte order, and Len is in host byte order. @@ -1860,10 +2127,63 @@ NetPseudoHeadChecksum ( **/ UINT16 +EFIAPI NetIp6PseudoHeadChecksum ( IN EFI_IPv6_ADDRESS *Src, IN EFI_IPv6_ADDRESS *Dst, IN UINT8 NextHeader, IN UINT32 Len ); + +/** + The function frees the net buffer which allocated by the IP protocol. It releases + only the net buffer and doesn't call the external free function. + + This function should be called after finishing the process of mIpSec->ProcessExt() + for outbound traffic. The (EFI_IPSEC2_PROTOCOL)->ProcessExt() allocates a new + buffer for the ESP, so there needs a function to free the old net buffer. + + @param[in] Nbuf The network buffer to be freed. + +**/ +VOID +NetIpSecNetbufFree ( + NET_BUF *Nbuf + ); + +/** + This function obtains the system guid from the smbios table. + + @param[out] SystemGuid The pointer of the returned system guid. + + @retval EFI_SUCCESS Successfully obtained the system guid. + @retval EFI_NOT_FOUND Did not find the SMBIOS table. + +**/ +EFI_STATUS +EFIAPI +NetLibGetSystemGuid ( + OUT EFI_GUID *SystemGuid + ); + +/** + Create Dns QName according the queried domain name. + QName is a domain name represented as a sequence of labels, + where each label consists of a length octet followed by that + number of octets. The QName terminates with the zero + length octet for the null label of the root. Caller should + take responsibility to free the buffer in returned pointer. + + @param DomainName The pointer to the queried domain name string. + + @retval NULL Failed to fill QName. + @return QName filled successfully. + +**/ +CHAR8 * +EFIAPI +NetLibCreateDnsQName ( + IN CHAR16 *DomainName + ); + #endif