Add NetworkPkg (P.UDK2010.UP3.Network.P1)

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10986 6f19259b-4bc3-4df7-8a09-765794883524
diff --git a/NetworkPkg/Ip6Dxe/Ip6Common.h b/NetworkPkg/Ip6Dxe/Ip6Common.h
new file mode 100644
index 0000000..c3755f4
--- /dev/null
+++ b/NetworkPkg/Ip6Dxe/Ip6Common.h
@@ -0,0 +1,338 @@
+/** @file

+  Common definition and functions for IP6 driver.

+

+  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>

+

+  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

+  http://opensource.org/licenses/bsd-license.php.

+

+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

+

+**/

+

+#ifndef __EFI_IP6_COMMON_H__

+#define __EFI_IP6_COMMON_H__

+

+#define IP6_LINK_EQUAL(Mac1, Mac2) (CompareMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS)) == 0)

+

+//

+// Convert the Microsecond to second. IP transmit/receive time is

+// in the unit of microsecond. IP ticks once per second.

+//

+#define IP6_US_TO_SEC(Us)              (((Us) + 999999) / 1000000)

+

+#define IP6_ETHER_PROTO                0x86DD

+

+#define IP6_MAC_LEN                    6

+#define IP6_IF_ID_LEN                  8

+

+#define IP6_INTERFACE_LOCAL_SCOPE      1

+#define IP6_LINK_LOCAL_SCOPE           2

+#define IP6_SITE_LOCAL_SCOPE           5

+

+#define IP6_INFINIT_LIFETIME           0xFFFFFFFF

+

+#define IP6_HOP_LIMIT                  255

+//

+// Make it to 64 since all 54 bits are zero.

+//

+#define IP6_LINK_LOCAL_PREFIX_LENGTH   64

+

+#define IP6_TIMER_INTERVAL_IN_MS       100

+#define IP6_ONE_SECOND_IN_MS           1000

+

+//

+// The packet is received as link level broadcast/multicast/promiscuous.

+//

+#define IP6_LINK_BROADCAST             0x00000001

+#define IP6_LINK_MULTICAST             0x00000002

+#define IP6_LINK_PROMISC               0x00000004

+

+#define IP6_U_BIT                      0x02

+

+typedef enum {

+  Ip6Promiscuous                     = 1,

+  Ip6Unicast,

+  Ip6Multicast,

+  Ip6AnyCast

+} IP6_ADDRESS_TYPE;

+

+typedef struct _IP6_INTERFACE    IP6_INTERFACE;

+typedef struct _IP6_PROTOCOL     IP6_PROTOCOL;

+typedef struct _IP6_SERVICE      IP6_SERVICE;

+typedef struct _IP6_ADDRESS_INFO IP6_ADDRESS_INFO;

+

+/**

+  Build a array of EFI_IP6_ADDRESS_INFO to be returned to the caller. The number

+  of EFI_IP6_ADDRESS_INFO is also returned. If AddressList is NULL,

+  only the address count is returned.

+

+  @param[in]  IpSb              The IP6 service binding instance.

+  @param[out] AddressCount      The number of returned addresses.

+  @param[out] AddressList       The pointer to the array of EFI_IP6_ADDRESS_INFO.

+                                This is an optional parameter.

+

+

+  @retval EFI_SUCCESS           The address array is successfully build

+  @retval EFI_OUT_OF_RESOURCES  Failed to allocate the memory for the address info.

+  @retval EFI_INVALID_PARAMETER Any input parameter is invalid.

+

+**/

+EFI_STATUS

+Ip6BuildEfiAddressList (

+  IN IP6_SERVICE            *IpSb,

+  OUT UINT32                *AddressCount,

+  OUT EFI_IP6_ADDRESS_INFO  **AddressList OPTIONAL

+  );

+

+/**

+  Generate the multicast addresses identify the group of all IPv6 nodes or IPv6

+  routers defined in RFC4291.

+

+  All Nodes Addresses: FF01::1, FF02::1.

+  All Router Addresses: FF01::2, FF02::2, FF05::2.

+

+  @param[in]  Router            If TRUE, generate all routers addresses,

+                                else generate all node addresses.

+  @param[in]  Scope             interface-local(1), link-local(2), or site-local(5)

+  @param[out] Ip6Addr           The generated multicast address.

+

+  @retval EFI_INVALID_PARAMETER Any input parameter is invalid.

+  @retval EFI_SUCCESS           The address is generated.

+

+**/

+EFI_STATUS

+Ip6SetToAllNodeMulticast (

+  IN  BOOLEAN          Router,

+  IN  UINT8            Scope,

+  OUT EFI_IPv6_ADDRESS *Ip6Addr

+  );

+

+/**

+  This function converts MAC address to 64 bits interface ID according to RFC4291

+  and returns the interface ID. Currently only 48-bit MAC address is supported by

+  this function.

+

+  @param[in, out]  IpSb      The IP6 service binding instance.

+

+  @retval          NULL      The operation fails.

+  @return                    Pointer to the generated interface ID.

+

+**/

+UINT8 *

+Ip6CreateInterfaceID (

+  IN OUT IP6_SERVICE         *IpSb

+  );

+

+/**

+  This function creates link-local address from interface identifier. The

+  interface identifier is normally created from MAC address. It might be manually

+  configured by administrator if the link-local address created from MAC address

+  is a duplicate address.

+

+  @param[in, out]  IpSb      The IP6 service binding instance.

+

+  @retval          NULL      If the operation fails.

+  @return                    The generated Link Local address, in network order.

+

+**/

+EFI_IPv6_ADDRESS *

+Ip6CreateLinkLocalAddr (

+  IN OUT IP6_SERVICE         *IpSb

+  );

+

+/**

+  Compute the solicited-node multicast address for an unicast or anycast address,

+  by taking the low-order 24 bits of this address, and appending those bits to

+  the prefix FF02:0:0:0:0:1:FF00::/104.

+

+  @param  Ip6Addr               The unicast or anycast address, in network order.

+  @param  MulticastAddr         The generated solicited-node multicast address,

+                                in network order.

+

+**/

+VOID

+Ip6CreateSNMulticastAddr (

+  IN EFI_IPv6_ADDRESS  *Ip6Addr,

+  OUT EFI_IPv6_ADDRESS *MulticastAddr

+  );

+

+/**

+  Check whether the incoming Ipv6 address is a solicited-node multicast address.

+

+  @param[in]  Ip6               Ip6 address, in network order.

+

+  @retval TRUE                  Yes, solicited-node multicast address

+  @retval FALSE                 No

+

+**/

+BOOLEAN

+Ip6IsSNMulticastAddr (

+  IN EFI_IPv6_ADDRESS *Ip6

+  );

+

+/**

+  Check whether the incoming IPv6 address is one of the maintained address in

+  the IP6 service binding instance.

+

+  @param[in]  IpSb              Points to a IP6 service binding instance

+  @param[in]  Address           The IP6 address to be checked.

+  @param[out] Interface         If not NULL, output the IP6 interface which

+                                maintains the Address.

+  @param[out] AddressInfo       If not NULL, output the IP6 address information

+                                of the Address.

+

+  @retval TRUE                  Yes, it is one of the maintained addresses.

+  @retval FALSE                 No, it is not one of the maintained addresses.

+

+**/

+BOOLEAN

+Ip6IsOneOfSetAddress (

+  IN  IP6_SERVICE           *IpSb,

+  IN  EFI_IPv6_ADDRESS      *Address,

+  OUT IP6_INTERFACE         **Interface   OPTIONAL,

+  OUT IP6_ADDRESS_INFO      **AddressInfo OPTIONAL

+  );

+

+/**

+  Check whether the incoming MAC address is valid.

+

+  @param[in]  IpSb              Points to a IP6 service binding instance.

+  @param[in]  LinkAddress       The MAC address.

+

+  @retval TRUE                  Yes, it is valid.

+  @retval FALSE                 No, it is not valid.

+

+**/

+BOOLEAN

+Ip6IsValidLinkAddress (

+  IN  IP6_SERVICE      *IpSb,

+  IN  EFI_MAC_ADDRESS  *LinkAddress

+  );

+

+

+/**

+  Copy the PrefixLength bits from Src to Dest.

+

+  @param[out] Dest              A pointer to the buffer to copy to.

+  @param[in]  Src               A pointer to the buffer to copy from.

+  @param[in]  PrefixLength      The number of bits to copy.

+

+**/

+VOID

+Ip6CopyAddressByPrefix (

+  OUT EFI_IPv6_ADDRESS *Dest,

+  IN  EFI_IPv6_ADDRESS *Src,

+  IN  UINT8            PrefixLength

+  );

+

+/**

+  Insert a node IP6_ADDRESS_INFO to an IP6 interface.

+

+  @param[in, out]  IpIf             Points to an IP6 interface.

+  @param[in]       AddrInfo         Points to an IP6_ADDRESS_INFO.

+

+**/

+VOID

+Ip6AddAddr (

+  IN OUT IP6_INTERFACE *IpIf,

+  IN IP6_ADDRESS_INFO  *AddrInfo

+  );

+

+/**

+  Remove the IPv6 address from the address list node points to IP6_ADDRESS_INFO.

+

+  This function removes the matching IPv6 addresses from the address list and

+  adjusts the address count of the address list. If IpSb is not NULL, this function

+  calls Ip6LeaveGroup to see whether it should call Mnp->Groups() to remove the

+  its solicited-node multicast MAC address from the filter list and sends out

+  a Multicast Listener Done. If Prefix is NULL, all address in the address list

+  will be removed. If Prefix is not NULL, the address that matching the Prefix

+  with PrefixLength in the address list will be removed.

+

+  @param[in]       IpSb             NULL or points to IP6 service binding instance.

+  @param[in, out]  AddressList      address list array

+  @param[in, out]  AddressCount     the count of addresses in address list array

+  @param[in]       Prefix           NULL or an IPv6 address prefix

+  @param[in]       PrefixLength     the length of Prefix

+

+  @retval    EFI_SUCCESS            The operation completed successfully.

+  @retval    EFI_NOT_FOUND          The address matching the Prefix with PrefixLength

+                                    cannot be found in address list.

+  @retval    EFI_INVALID_PARAMETER  Any input parameter is invalid.

+

+**/

+EFI_STATUS

+Ip6RemoveAddr (

+  IN IP6_SERVICE       *IpSb          OPTIONAL,

+  IN OUT LIST_ENTRY    *AddressList,

+  IN OUT UINT32        *AddressCount,

+  IN EFI_IPv6_ADDRESS  *Prefix        OPTIONAL,

+  IN UINT8             PrefixLength

+  );

+

+/**

+  Set the Ip6 variable data.

+

+  @param[in]  IpSb              Points to an IP6 service binding instance

+

+  @retval EFI_OUT_OF_RESOURCES  There are not enough resources to set the variable.

+  @retval other                 Set variable failed.

+

+**/

+EFI_STATUS

+Ip6SetVariableData (

+  IN IP6_SERVICE  *IpSb

+  );

+

+/**

+  Clear the variable and free the resource.

+

+  @param[in]  IpSb                  Ip6 service binding instance.

+

+**/

+VOID

+Ip6ClearVariableData (

+  IN IP6_SERVICE  *IpSb

+  );

+

+/**

+  Get the MAC address for a multicast IP address. Call

+  Mnp's McastIpToMac to find the MAC address instead of

+  hard-coding the NIC to be Ethernet.

+

+  @param[in]  Mnp                   The Mnp instance to get the MAC address.

+  @param[in]  Multicast             The multicast IP address to translate.

+  @param[out] Mac                   The buffer to hold the translated address.

+

+  @retval EFI_SUCCESS               The multicast IP is successfully

+                                    translated to a multicast MAC address.

+  @retval Other                     The address is not converted because an error occurred.

+

+**/

+EFI_STATUS

+Ip6GetMulticastMac (

+  IN  EFI_MANAGED_NETWORK_PROTOCOL *Mnp,

+  IN  EFI_IPv6_ADDRESS             *Multicast,

+  OUT EFI_MAC_ADDRESS              *Mac

+  );

+

+/**

+  Convert the multibyte field in IP header's byter order.

+  In spite of its name, it can also be used to convert from

+  host to network byte order.

+

+  @param[in, out]  Head                  The IP head to convert.

+

+  @return Point to the converted IP head.

+

+**/

+EFI_IP6_HEADER *

+Ip6NtohHead (

+  IN OUT EFI_IP6_HEADER *Head

+  );

+

+#endif