NetworkPkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the NetworkPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Maciej Rabeda <maciej.rabeda@linux.intel.com>
This commit is contained in:
committed by
mergify[bot]
parent
2f88bd3a12
commit
d1050b9dff
@@ -132,17 +132,17 @@ Ip6ComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6ComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol.
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIp6ComponentName = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIp6ComponentName = {
|
||||
Ip6ComponentNameGetDriverName,
|
||||
Ip6ComponentNameGetControllerName,
|
||||
"eng"
|
||||
@@ -152,12 +152,12 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIp6ComponentName =
|
||||
// EFI Component Name 2 Protocol.
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIp6ComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Ip6ComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Ip6ComponentNameGetControllerName,
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)Ip6ComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)Ip6ComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIp6DriverNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIp6DriverNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
L"IP6 Network Service Driver"
|
||||
@@ -168,7 +168,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIp6DriverNameTable[
|
||||
}
|
||||
};
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gIp6ControllerNameTable = NULL;
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gIp6ControllerNameTable = NULL;
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user-readable name of the driver.
|
||||
@@ -218,13 +218,12 @@ Ip6ComponentNameGetDriverName (
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
mIp6DriverNameTable,
|
||||
DriverName,
|
||||
(BOOLEAN) (This == &gIp6ComponentName)
|
||||
);
|
||||
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
mIp6DriverNameTable,
|
||||
DriverName,
|
||||
(BOOLEAN)(This == &gIp6ComponentName)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -239,14 +238,14 @@ Ip6ComponentNameGetDriverName (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UpdateName (
|
||||
IN EFI_IP6_PROTOCOL *Ip6
|
||||
IN EFI_IP6_PROTOCOL *Ip6
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CHAR16 HandleName[128];
|
||||
EFI_IP6_MODE_DATA Ip6ModeData;
|
||||
UINTN Offset;
|
||||
CHAR16 Address[sizeof"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];
|
||||
EFI_STATUS Status;
|
||||
CHAR16 HandleName[128];
|
||||
EFI_IP6_MODE_DATA Ip6ModeData;
|
||||
UINTN Offset;
|
||||
CHAR16 Address[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];
|
||||
|
||||
if (Ip6 == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -284,35 +283,37 @@ UpdateName (
|
||||
}
|
||||
|
||||
if (!EFI_ERROR (Status) && Ip6ModeData.IsStarted) {
|
||||
Status = NetLibIp6ToStr (&Ip6ModeData.ConfigData.StationAddress, Address, sizeof(Address));
|
||||
Status = NetLibIp6ToStr (&Ip6ModeData.ConfigData.StationAddress, Address, sizeof (Address));
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Offset += UnicodeSPrint (
|
||||
HandleName,
|
||||
sizeof(HandleName),
|
||||
sizeof (HandleName),
|
||||
L"IPv6(StationAddress=%s, ",
|
||||
Address
|
||||
);
|
||||
Status = NetLibIp6ToStr (&Ip6ModeData.ConfigData.DestinationAddress, Address, sizeof(Address));
|
||||
Status = NetLibIp6ToStr (&Ip6ModeData.ConfigData.DestinationAddress, Address, sizeof (Address));
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
UnicodeSPrint (
|
||||
HandleName + Offset,
|
||||
sizeof(HandleName) - Offset * sizeof (CHAR16),
|
||||
sizeof (HandleName) - Offset * sizeof (CHAR16),
|
||||
L"DestinationAddress=%s)",
|
||||
Address
|
||||
);
|
||||
} else if (!Ip6ModeData.IsStarted) {
|
||||
UnicodeSPrint (HandleName, sizeof(HandleName), L"IPv6(Not started)");
|
||||
UnicodeSPrint (HandleName, sizeof (HandleName), L"IPv6(Not started)");
|
||||
} else {
|
||||
UnicodeSPrint (HandleName, sizeof(HandleName), L"IPv6(%r)", Status);
|
||||
UnicodeSPrint (HandleName, sizeof (HandleName), L"IPv6(%r)", Status);
|
||||
}
|
||||
|
||||
if (gIp6ControllerNameTable != NULL) {
|
||||
FreeUnicodeStringTable (gIp6ControllerNameTable);
|
||||
gIp6ControllerNameTable = NULL;
|
||||
FreeUnicodeStringTable (gIp6ControllerNameTable);
|
||||
gIp6ControllerNameTable = NULL;
|
||||
}
|
||||
|
||||
Status = AddUnicodeString2 (
|
||||
@@ -406,15 +407,15 @@ UpdateName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6ComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_PROTOCOL *Ip6;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_PROTOCOL *Ip6;
|
||||
|
||||
//
|
||||
// Only provide names for child handles.
|
||||
|
@@ -101,16 +101,16 @@ Ip6BuildEfiAddressList (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SetToAllNodeMulticast (
|
||||
IN BOOLEAN Router,
|
||||
IN UINT8 Scope,
|
||||
OUT EFI_IPv6_ADDRESS *Ip6Addr
|
||||
IN BOOLEAN Router,
|
||||
IN UINT8 Scope,
|
||||
OUT EFI_IPv6_ADDRESS *Ip6Addr
|
||||
)
|
||||
{
|
||||
if (Ip6Addr == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (!Router && Scope == IP6_SITE_LOCAL_SCOPE) {
|
||||
if (!Router && (Scope == IP6_SITE_LOCAL_SCOPE)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -140,13 +140,13 @@ Ip6SetToAllNodeMulticast (
|
||||
**/
|
||||
UINT8 *
|
||||
Ip6CreateInterfaceID (
|
||||
IN OUT IP6_SERVICE *IpSb
|
||||
IN OUT IP6_SERVICE *IpSb
|
||||
)
|
||||
{
|
||||
UINT8 InterfaceId[8];
|
||||
UINT8 Byte;
|
||||
EFI_MAC_ADDRESS *MacAddr;
|
||||
UINT32 AddrLen;
|
||||
UINT8 InterfaceId[8];
|
||||
UINT8 Byte;
|
||||
EFI_MAC_ADDRESS *MacAddr;
|
||||
UINT32 AddrLen;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
@@ -155,7 +155,7 @@ Ip6CreateInterfaceID (
|
||||
//
|
||||
// Currently only IEEE 802 48-bit MACs are supported to create link local address.
|
||||
//
|
||||
if (AddrLen != IP6_MAC_LEN || IpSb->InterfaceIdLen != IP6_IF_ID_LEN) {
|
||||
if ((AddrLen != IP6_MAC_LEN) || (IpSb->InterfaceIdLen != IP6_IF_ID_LEN)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ Ip6CreateInterfaceID (
|
||||
InterfaceId[4] = 0xFE;
|
||||
CopyMem (&InterfaceId[5], &MacAddr->Addr[3], 3);
|
||||
|
||||
Byte = (UINT8) (InterfaceId[0] & IP6_U_BIT);
|
||||
Byte = (UINT8)(InterfaceId[0] & IP6_U_BIT);
|
||||
if (Byte == IP6_U_BIT) {
|
||||
InterfaceId[0] &= ~IP6_U_BIT;
|
||||
} else {
|
||||
@@ -198,7 +198,7 @@ Ip6CreateInterfaceID (
|
||||
**/
|
||||
EFI_IPv6_ADDRESS *
|
||||
Ip6CreateLinkLocalAddr (
|
||||
IN OUT IP6_SERVICE *IpSb
|
||||
IN OUT IP6_SERVICE *IpSb
|
||||
)
|
||||
{
|
||||
EFI_IPv6_ADDRESS *Ip6Addr;
|
||||
@@ -289,8 +289,8 @@ Ip6CreateLinkLocalAddr (
|
||||
**/
|
||||
VOID
|
||||
Ip6CreateSNMulticastAddr (
|
||||
IN EFI_IPv6_ADDRESS *Ip6Addr,
|
||||
OUT EFI_IPv6_ADDRESS *MulticastAddr
|
||||
IN EFI_IPv6_ADDRESS *Ip6Addr,
|
||||
OUT EFI_IPv6_ADDRESS *MulticastAddr
|
||||
)
|
||||
{
|
||||
ASSERT (Ip6Addr != NULL && MulticastAddr != NULL);
|
||||
@@ -314,8 +314,8 @@ Ip6CreateSNMulticastAddr (
|
||||
**/
|
||||
VOID
|
||||
Ip6AddAddr (
|
||||
IN OUT IP6_INTERFACE *IpIf,
|
||||
IN IP6_ADDRESS_INFO *AddrInfo
|
||||
IN OUT IP6_INTERFACE *IpIf,
|
||||
IN IP6_ADDRESS_INFO *AddrInfo
|
||||
)
|
||||
{
|
||||
InsertHeadList (&IpIf->AddressList, &AddrInfo->Link);
|
||||
@@ -335,17 +335,17 @@ Ip6AddAddr (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6DestroyChildEntryByAddr (
|
||||
IN LIST_ENTRY *Entry,
|
||||
IN VOID *Context
|
||||
IN LIST_ENTRY *Entry,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *Instance;
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
EFI_IPv6_ADDRESS *Address;
|
||||
|
||||
Instance = NET_LIST_USER_STRUCT_S (Entry, IP6_PROTOCOL, Link, IP6_PROTOCOL_SIGNATURE);
|
||||
ServiceBinding = ((IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT*) Context)->ServiceBinding;
|
||||
Address = ((IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT*) Context)->Address;
|
||||
Instance = NET_LIST_USER_STRUCT_S (Entry, IP6_PROTOCOL, Link, IP6_PROTOCOL_SIGNATURE);
|
||||
ServiceBinding = ((IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT *)Context)->ServiceBinding;
|
||||
Address = ((IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT *)Context)->Address;
|
||||
|
||||
if ((Instance->State == IP6_STATE_CONFIGED) && EFI_IP6_EQUAL (&Instance->ConfigData.StationAddress, Address)) {
|
||||
return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
|
||||
@@ -368,14 +368,14 @@ Ip6DestroyInstanceByAddress (
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *List;
|
||||
LIST_ENTRY *List;
|
||||
IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT Context;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
List = &IpSb->Children;
|
||||
List = &IpSb->Children;
|
||||
Context.ServiceBinding = &IpSb->ServiceBinding;
|
||||
Context.Address = Address;
|
||||
Context.Address = Address;
|
||||
NetDestroyLinkList (
|
||||
List,
|
||||
Ip6DestroyChildEntryByAddr,
|
||||
@@ -416,13 +416,13 @@ Ip6RemoveAddr (
|
||||
IN UINT8 PrefixLength
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
EFI_IPv6_ADDRESS SnMCastAddr;
|
||||
EFI_STATUS Status;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
EFI_IPv6_ADDRESS SnMCastAddr;
|
||||
|
||||
if (IsListEmpty (AddressList) || *AddressCount < 1 || PrefixLength > IP6_PREFIX_MAX) {
|
||||
if (IsListEmpty (AddressList) || (*AddressCount < 1) || (PrefixLength > IP6_PREFIX_MAX)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -431,10 +431,11 @@ Ip6RemoveAddr (
|
||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, AddressList) {
|
||||
AddrInfo = NET_LIST_USER_STRUCT_S (Entry, IP6_ADDRESS_INFO, Link, IP6_ADDR_INFO_SIGNATURE);
|
||||
|
||||
if (Prefix == NULL ||
|
||||
(PrefixLength == 128 && EFI_IP6_EQUAL (Prefix, &AddrInfo->Address)) ||
|
||||
(PrefixLength == AddrInfo->PrefixLength && NetIp6IsNetEqual (Prefix, &AddrInfo->Address, PrefixLength))
|
||||
) {
|
||||
if ((Prefix == NULL) ||
|
||||
((PrefixLength == 128) && EFI_IP6_EQUAL (Prefix, &AddrInfo->Address)) ||
|
||||
((PrefixLength == AddrInfo->PrefixLength) && NetIp6IsNetEqual (Prefix, &AddrInfo->Address, PrefixLength))
|
||||
)
|
||||
{
|
||||
if (IpSb != NULL) {
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
Ip6CreateSNMulticastAddr (&AddrInfo->Address, &SnMCastAddr);
|
||||
@@ -468,11 +469,11 @@ Ip6RemoveAddr (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsSNMulticastAddr (
|
||||
IN EFI_IPv6_ADDRESS *Ip6
|
||||
IN EFI_IPv6_ADDRESS *Ip6
|
||||
)
|
||||
{
|
||||
EFI_IPv6_ADDRESS Sn;
|
||||
BOOLEAN Flag;
|
||||
EFI_IPv6_ADDRESS Sn;
|
||||
BOOLEAN Flag;
|
||||
|
||||
Ip6CreateSNMulticastAddr (Ip6, &Sn);
|
||||
Flag = FALSE;
|
||||
@@ -501,16 +502,16 @@ Ip6IsSNMulticastAddr (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsOneOfSetAddress (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Address,
|
||||
OUT IP6_INTERFACE **Interface OPTIONAL,
|
||||
OUT IP6_ADDRESS_INFO **AddressInfo OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Address,
|
||||
OUT IP6_INTERFACE **Interface OPTIONAL,
|
||||
OUT IP6_ADDRESS_INFO **AddressInfo OPTIONAL
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Entry2;
|
||||
IP6_INTERFACE *IpIf;
|
||||
IP6_ADDRESS_INFO *TmpAddressInfo;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Entry2;
|
||||
IP6_INTERFACE *IpIf;
|
||||
IP6_ADDRESS_INFO *TmpAddressInfo;
|
||||
|
||||
//
|
||||
// Check link-local address first
|
||||
@@ -566,7 +567,7 @@ Ip6IsValidLinkAddress (
|
||||
IN EFI_MAC_ADDRESS *LinkAddress
|
||||
)
|
||||
{
|
||||
UINT32 Index;
|
||||
UINT32 Index;
|
||||
|
||||
//
|
||||
// TODO: might be updated later to be more acceptable.
|
||||
@@ -590,29 +591,29 @@ Ip6IsValidLinkAddress (
|
||||
**/
|
||||
VOID
|
||||
Ip6CopyAddressByPrefix (
|
||||
OUT EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN UINT8 PrefixLength
|
||||
OUT EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN UINT8 PrefixLength
|
||||
)
|
||||
{
|
||||
UINT8 Byte;
|
||||
UINT8 Bit;
|
||||
UINT8 Mask;
|
||||
UINT8 Byte;
|
||||
UINT8 Bit;
|
||||
UINT8 Mask;
|
||||
|
||||
ASSERT (Dest != NULL && Src != NULL);
|
||||
ASSERT (PrefixLength <= IP6_PREFIX_MAX);
|
||||
|
||||
Byte = (UINT8) (PrefixLength / 8);
|
||||
Bit = (UINT8) (PrefixLength % 8);
|
||||
Byte = (UINT8)(PrefixLength / 8);
|
||||
Bit = (UINT8)(PrefixLength % 8);
|
||||
|
||||
ZeroMem (Dest, sizeof (EFI_IPv6_ADDRESS));
|
||||
|
||||
CopyMem (Dest, Src, Byte);
|
||||
|
||||
if (Bit > 0) {
|
||||
Mask = (UINT8) (0xFF << (8 - Bit));
|
||||
Mask = (UINT8)(0xFF << (8 - Bit));
|
||||
ASSERT (Byte < 16);
|
||||
Dest->Addr[Byte] = (UINT8) (Src->Addr[Byte] & Mask);
|
||||
Dest->Addr[Byte] = (UINT8)(Src->Addr[Byte] & Mask);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -632,12 +633,12 @@ Ip6CopyAddressByPrefix (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6GetMulticastMac (
|
||||
IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp,
|
||||
IN EFI_IPv6_ADDRESS *Multicast,
|
||||
OUT EFI_MAC_ADDRESS *Mac
|
||||
IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp,
|
||||
IN EFI_IPv6_ADDRESS *Multicast,
|
||||
OUT EFI_MAC_ADDRESS *Mac
|
||||
)
|
||||
{
|
||||
EFI_IP_ADDRESS EfiIp;
|
||||
EFI_IP_ADDRESS EfiIp;
|
||||
|
||||
IP6_COPY_ADDRESS (&EfiIp.v6, Multicast);
|
||||
|
||||
@@ -656,7 +657,7 @@ Ip6GetMulticastMac (
|
||||
**/
|
||||
EFI_IP6_HEADER *
|
||||
Ip6NtohHead (
|
||||
IN OUT EFI_IP6_HEADER *Head
|
||||
IN OUT EFI_IP6_HEADER *Head
|
||||
)
|
||||
{
|
||||
Head->FlowLabelL = NTOHS (Head->FlowLabelL);
|
||||
@@ -664,4 +665,3 @@ Ip6NtohHead (
|
||||
|
||||
return Head;
|
||||
}
|
||||
|
||||
|
@@ -10,59 +10,59 @@
|
||||
#ifndef __EFI_IP6_COMMON_H__
|
||||
#define __EFI_IP6_COMMON_H__
|
||||
|
||||
#define IP6_LINK_EQUAL(Mac1, Mac2) (CompareMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS)) == 0)
|
||||
#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_US_TO_SEC(Us) (((Us) + 999999) / 1000000)
|
||||
|
||||
#define IP6_ETHER_PROTO 0x86DD
|
||||
#define IP6_ETHER_PROTO 0x86DD
|
||||
|
||||
#define IP6_MAC_LEN 6
|
||||
#define IP6_IF_ID_LEN 8
|
||||
#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_INTERFACE_LOCAL_SCOPE 1
|
||||
#define IP6_LINK_LOCAL_SCOPE 2
|
||||
#define IP6_SITE_LOCAL_SCOPE 5
|
||||
|
||||
#define IP6_INFINIT_LIFETIME 0xFFFFFFFF
|
||||
#define IP6_INFINIT_LIFETIME 0xFFFFFFFF
|
||||
|
||||
#define IP6_HOP_LIMIT 255
|
||||
#define IP6_HOP_LIMIT 255
|
||||
//
|
||||
// Make it to 64 since all 54 bits are zero.
|
||||
//
|
||||
#define IP6_LINK_LOCAL_PREFIX_LENGTH 64
|
||||
#define IP6_LINK_LOCAL_PREFIX_LENGTH 64
|
||||
|
||||
#define IP6_TIMER_INTERVAL_IN_MS 100
|
||||
#define IP6_ONE_SECOND_IN_MS 1000
|
||||
#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_LINK_BROADCAST 0x00000001
|
||||
#define IP6_LINK_MULTICAST 0x00000002
|
||||
#define IP6_LINK_PROMISC 0x00000004
|
||||
|
||||
#define IP6_U_BIT 0x02
|
||||
#define IP6_U_BIT 0x02
|
||||
|
||||
typedef enum {
|
||||
Ip6Promiscuous = 1,
|
||||
Ip6Promiscuous = 1,
|
||||
Ip6Unicast,
|
||||
Ip6Multicast,
|
||||
Ip6AnyCast
|
||||
} IP6_ADDRESS_TYPE;
|
||||
|
||||
typedef struct {
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
EFI_IPv6_ADDRESS *Address;
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
EFI_IPv6_ADDRESS *Address;
|
||||
} IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT;
|
||||
|
||||
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;
|
||||
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
|
||||
@@ -105,9 +105,9 @@ Ip6BuildEfiAddressList (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SetToAllNodeMulticast (
|
||||
IN BOOLEAN Router,
|
||||
IN UINT8 Scope,
|
||||
OUT EFI_IPv6_ADDRESS *Ip6Addr
|
||||
IN BOOLEAN Router,
|
||||
IN UINT8 Scope,
|
||||
OUT EFI_IPv6_ADDRESS *Ip6Addr
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -123,7 +123,7 @@ Ip6SetToAllNodeMulticast (
|
||||
**/
|
||||
UINT8 *
|
||||
Ip6CreateInterfaceID (
|
||||
IN OUT IP6_SERVICE *IpSb
|
||||
IN OUT IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -140,7 +140,7 @@ Ip6CreateInterfaceID (
|
||||
**/
|
||||
EFI_IPv6_ADDRESS *
|
||||
Ip6CreateLinkLocalAddr (
|
||||
IN OUT IP6_SERVICE *IpSb
|
||||
IN OUT IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -155,8 +155,8 @@ Ip6CreateLinkLocalAddr (
|
||||
**/
|
||||
VOID
|
||||
Ip6CreateSNMulticastAddr (
|
||||
IN EFI_IPv6_ADDRESS *Ip6Addr,
|
||||
OUT EFI_IPv6_ADDRESS *MulticastAddr
|
||||
IN EFI_IPv6_ADDRESS *Ip6Addr,
|
||||
OUT EFI_IPv6_ADDRESS *MulticastAddr
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -170,7 +170,7 @@ Ip6CreateSNMulticastAddr (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsSNMulticastAddr (
|
||||
IN EFI_IPv6_ADDRESS *Ip6
|
||||
IN EFI_IPv6_ADDRESS *Ip6
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -190,10 +190,10 @@ Ip6IsSNMulticastAddr (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsOneOfSetAddress (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Address,
|
||||
OUT IP6_INTERFACE **Interface OPTIONAL,
|
||||
OUT IP6_ADDRESS_INFO **AddressInfo OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Address,
|
||||
OUT IP6_INTERFACE **Interface OPTIONAL,
|
||||
OUT IP6_ADDRESS_INFO **AddressInfo OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -212,7 +212,6 @@ Ip6IsValidLinkAddress (
|
||||
IN EFI_MAC_ADDRESS *LinkAddress
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Copy the PrefixLength bits from Src to Dest.
|
||||
|
||||
@@ -223,9 +222,9 @@ Ip6IsValidLinkAddress (
|
||||
**/
|
||||
VOID
|
||||
Ip6CopyAddressByPrefix (
|
||||
OUT EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN UINT8 PrefixLength
|
||||
OUT EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN UINT8 PrefixLength
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -237,8 +236,8 @@ Ip6CopyAddressByPrefix (
|
||||
**/
|
||||
VOID
|
||||
Ip6AddAddr (
|
||||
IN OUT IP6_INTERFACE *IpIf,
|
||||
IN IP6_ADDRESS_INFO *AddrInfo
|
||||
IN OUT IP6_INTERFACE *IpIf,
|
||||
IN IP6_ADDRESS_INFO *AddrInfo
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -289,9 +288,9 @@ Ip6RemoveAddr (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6GetMulticastMac (
|
||||
IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp,
|
||||
IN EFI_IPv6_ADDRESS *Multicast,
|
||||
OUT EFI_MAC_ADDRESS *Mac
|
||||
IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp,
|
||||
IN EFI_IPv6_ADDRESS *Multicast,
|
||||
OUT EFI_MAC_ADDRESS *Mac
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -306,7 +305,7 @@ Ip6GetMulticastMac (
|
||||
**/
|
||||
EFI_IP6_HEADER *
|
||||
Ip6NtohHead (
|
||||
IN OUT EFI_IP6_HEADER *Head
|
||||
IN OUT EFI_IP6_HEADER *Head
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -10,7 +10,7 @@
|
||||
|
||||
#include "Ip6Impl.h"
|
||||
|
||||
LIST_ENTRY mIp6ConfigInstanceList = {&mIp6ConfigInstanceList, &mIp6ConfigInstanceList};
|
||||
LIST_ENTRY mIp6ConfigInstanceList = { &mIp6ConfigInstanceList, &mIp6ConfigInstanceList };
|
||||
|
||||
/**
|
||||
The event process routine when the DHCPv6 service binding protocol is installed
|
||||
@@ -42,15 +42,15 @@ Ip6ConfigOnPolicyChanged (
|
||||
IN EFI_IP6_CONFIG_POLICY NewPolicy
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Entry2;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_INTERFACE *IpIf;
|
||||
IP6_DAD_ENTRY *DadEntry;
|
||||
IP6_DELAY_JOIN_LIST *DelayNode;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
IP6_PROTOCOL *Instance;
|
||||
BOOLEAN Recovery;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Entry2;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_INTERFACE *IpIf;
|
||||
IP6_DAD_ENTRY *DadEntry;
|
||||
IP6_DELAY_JOIN_LIST *DelayNode;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
IP6_PROTOCOL *Instance;
|
||||
BOOLEAN Recovery;
|
||||
|
||||
Recovery = FALSE;
|
||||
|
||||
@@ -73,14 +73,14 @@ Ip6ConfigOnPolicyChanged (
|
||||
Ip6CreatePrefixListEntry (
|
||||
IpSb,
|
||||
TRUE,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
IP6_LINK_LOCAL_PREFIX_LENGTH,
|
||||
&IpSb->LinkLocalAddr
|
||||
);
|
||||
}
|
||||
|
||||
if (!IsListEmpty (&IpSb->DefaultInterface->AddressList) && IpSb->DefaultInterface->AddressCount > 0) {
|
||||
if (!IsListEmpty (&IpSb->DefaultInterface->AddressList) && (IpSb->DefaultInterface->AddressCount > 0)) {
|
||||
//
|
||||
// If any IPv6 children (Instance) in configured state and use global unicast address, it will be
|
||||
// destroyed in Ip6RemoveAddr() function later. Then, the upper layer driver's Stop() function will be
|
||||
@@ -114,7 +114,7 @@ Ip6ConfigOnPolicyChanged (
|
||||
0
|
||||
);
|
||||
|
||||
if (IpSb->Controller != NULL && Recovery) {
|
||||
if ((IpSb->Controller != NULL) && Recovery) {
|
||||
//
|
||||
// ConnectController() to recover the upper layer network stacks.
|
||||
//
|
||||
@@ -122,7 +122,6 @@ Ip6ConfigOnPolicyChanged (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NET_LIST_FOR_EACH (Entry, &IpSb->Interfaces) {
|
||||
//
|
||||
// remove all pending delay node and DAD entries for the global addresses.
|
||||
@@ -158,7 +157,7 @@ Ip6ConfigOnPolicyChanged (
|
||||
//
|
||||
// delay 1 second
|
||||
//
|
||||
IpSb->Ticks = (UINT32) IP6_GET_TICKS (IP6_ONE_SECOND_IN_MS);
|
||||
IpSb->Ticks = (UINT32)IP6_GET_TICKS (IP6_ONE_SECOND_IN_MS);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,7 +215,7 @@ Ip6ConfigStartStatefulAutoConfig (
|
||||
&gEfiDhcp6ServiceBindingProtocolGuid,
|
||||
TPL_CALLBACK,
|
||||
Ip6ConfigOnDhcp6SbInstalled,
|
||||
(VOID *) Instance,
|
||||
(VOID *)Instance,
|
||||
&Instance->Registration
|
||||
);
|
||||
}
|
||||
@@ -233,7 +232,7 @@ Ip6ConfigStartStatefulAutoConfig (
|
||||
Status = gBS->OpenProtocol (
|
||||
Instance->Dhcp6Handle,
|
||||
&gEfiDhcp6ProtocolGuid,
|
||||
(VOID **) &Instance->Dhcp6,
|
||||
(VOID **)&Instance->Dhcp6,
|
||||
IpSb->Image,
|
||||
IpSb->Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@@ -247,13 +246,13 @@ Ip6ConfigStartStatefulAutoConfig (
|
||||
// Set the exta options to send. Here we only want the option request option
|
||||
// with DNS SERVERS.
|
||||
//
|
||||
Oro = (EFI_DHCP6_PACKET_OPTION *) OptBuf;
|
||||
Oro->OpCode = HTONS (DHCP6_OPT_ORO);
|
||||
Oro->OpLen = HTONS (2);
|
||||
*((UINT16 *) &Oro->Data[0]) = HTONS (DHCP6_OPT_DNS_SERVERS);
|
||||
OptList[0] = Oro;
|
||||
Oro = (EFI_DHCP6_PACKET_OPTION *)OptBuf;
|
||||
Oro->OpCode = HTONS (DHCP6_OPT_ORO);
|
||||
Oro->OpLen = HTONS (2);
|
||||
*((UINT16 *)&Oro->Data[0]) = HTONS (DHCP6_OPT_DNS_SERVERS);
|
||||
OptList[0] = Oro;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
if (!OtherInfoOnly) {
|
||||
//
|
||||
@@ -273,13 +272,11 @@ Ip6ConfigStartStatefulAutoConfig (
|
||||
Status = Dhcp6->Configure (Dhcp6, &Dhcp6CfgData);
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
|
||||
if (IpSb->LinkLocalOk) {
|
||||
Status = Dhcp6->Start (Dhcp6);
|
||||
} else {
|
||||
IpSb->Dhcp6NeedStart = TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
//
|
||||
@@ -306,7 +303,6 @@ Ip6ConfigStartStatefulAutoConfig (
|
||||
} else {
|
||||
IpSb->Dhcp6NeedInfoRequest = TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return Status;
|
||||
@@ -323,12 +319,12 @@ Ip6ConfigStartStatefulAutoConfig (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6ConfigSignalEvent (
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Arg
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Arg
|
||||
)
|
||||
{
|
||||
gBS->SignalEvent ((EFI_EVENT) Item->Key);
|
||||
gBS->SignalEvent ((EFI_EVENT)Item->Key);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@@ -389,7 +385,7 @@ Ip6ConfigReadConfigData (
|
||||
&VarSize,
|
||||
Variable
|
||||
);
|
||||
if (EFI_ERROR (Status) || (UINT16) (~NetblockChecksum ((UINT8 *) Variable, (UINT32) VarSize)) != 0) {
|
||||
if (EFI_ERROR (Status) || ((UINT16)(~NetblockChecksum ((UINT8 *)Variable, (UINT32)VarSize)) != 0)) {
|
||||
//
|
||||
// GetVariable error or the variable is corrupted.
|
||||
//
|
||||
@@ -402,13 +398,13 @@ Ip6ConfigReadConfigData (
|
||||
Instance->IaId = Variable->IaId;
|
||||
|
||||
for (Index = 0; Index < Variable->DataRecordCount; Index++) {
|
||||
|
||||
CopyMem (&DataRecord, &Variable->DataRecord[Index], sizeof (DataRecord));
|
||||
|
||||
DataItem = &Instance->DataItem[DataRecord.DataType];
|
||||
if (DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED) &&
|
||||
(DataItem->DataSize != DataRecord.DataSize)
|
||||
) {
|
||||
)
|
||||
{
|
||||
//
|
||||
// Perhaps a corrupted data record...
|
||||
//
|
||||
@@ -433,7 +429,7 @@ Ip6ConfigReadConfigData (
|
||||
}
|
||||
}
|
||||
|
||||
Data = (CHAR8 *) Variable + DataRecord.Offset;
|
||||
Data = (CHAR8 *)Variable + DataRecord.Offset;
|
||||
CopyMem (DataItem->Data.Ptr, Data, DataRecord.DataSize);
|
||||
|
||||
DataItem->DataSize = DataRecord.DataSize;
|
||||
@@ -496,10 +492,8 @@ Ip6ConfigWriteConfigData (
|
||||
VarSize = sizeof (IP6_CONFIG_VARIABLE) - sizeof (IP6_CONFIG_DATA_RECORD);
|
||||
|
||||
for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {
|
||||
|
||||
DataItem = &Instance->DataItem[Index];
|
||||
if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_VOLATILE) && !EFI_ERROR (DataItem->Status)) {
|
||||
|
||||
VarSize += sizeof (IP6_CONFIG_DATA_RECORD) + DataItem->DataSize;
|
||||
}
|
||||
}
|
||||
@@ -510,28 +504,26 @@ Ip6ConfigWriteConfigData (
|
||||
}
|
||||
|
||||
Variable->IaId = Instance->IaId;
|
||||
Heap = (CHAR8 *) Variable + VarSize;
|
||||
Heap = (CHAR8 *)Variable + VarSize;
|
||||
Variable->DataRecordCount = 0;
|
||||
|
||||
for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {
|
||||
|
||||
DataItem = &Instance->DataItem[Index];
|
||||
if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_VOLATILE) && !EFI_ERROR (DataItem->Status)) {
|
||||
|
||||
Heap -= DataItem->DataSize;
|
||||
CopyMem (Heap, DataItem->Data.Ptr, DataItem->DataSize);
|
||||
|
||||
DataRecord = &Variable->DataRecord[Variable->DataRecordCount];
|
||||
DataRecord->DataType = (EFI_IP6_CONFIG_DATA_TYPE) Index;
|
||||
DataRecord->DataSize = (UINT32) DataItem->DataSize;
|
||||
DataRecord->Offset = (UINT16) (Heap - (CHAR8 *) Variable);
|
||||
DataRecord->DataType = (EFI_IP6_CONFIG_DATA_TYPE)Index;
|
||||
DataRecord->DataSize = (UINT32)DataItem->DataSize;
|
||||
DataRecord->Offset = (UINT16)(Heap - (CHAR8 *)Variable);
|
||||
|
||||
Variable->DataRecordCount++;
|
||||
}
|
||||
}
|
||||
|
||||
Variable->Checksum = 0;
|
||||
Variable->Checksum = (UINT16) ~NetblockChecksum ((UINT8 *) Variable, (UINT32) VarSize);
|
||||
Variable->Checksum = (UINT16) ~NetblockChecksum ((UINT8 *)Variable, (UINT32)VarSize);
|
||||
|
||||
Status = gRT->SetVariable (
|
||||
VarName,
|
||||
@@ -597,20 +589,20 @@ Ip6ConfigGetIfInfo (
|
||||
//
|
||||
// Copy the fixed size part of the interface info.
|
||||
//
|
||||
Item = &Instance->DataItem[Ip6ConfigDataTypeInterfaceInfo];
|
||||
IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *) Data;
|
||||
Item = &Instance->DataItem[Ip6ConfigDataTypeInterfaceInfo];
|
||||
IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *)Data;
|
||||
CopyMem (IfInfo, Item->Data.Ptr, sizeof (EFI_IP6_CONFIG_INTERFACE_INFO));
|
||||
|
||||
//
|
||||
// AddressInfo
|
||||
//
|
||||
IfInfo->AddressInfo = (EFI_IP6_ADDRESS_INFO *) (IfInfo + 1);
|
||||
IfInfo->AddressInfo = (EFI_IP6_ADDRESS_INFO *)(IfInfo + 1);
|
||||
Ip6BuildEfiAddressList (IpSb, &IfInfo->AddressInfoCount, &IfInfo->AddressInfo);
|
||||
|
||||
//
|
||||
// RouteTable
|
||||
//
|
||||
IfInfo->RouteTable = (EFI_IP6_ROUTE_TABLE *) (IfInfo->AddressInfo + IfInfo->AddressInfoCount);
|
||||
IfInfo->RouteTable = (EFI_IP6_ROUTE_TABLE *)(IfInfo->AddressInfo + IfInfo->AddressInfoCount);
|
||||
Ip6BuildEfiRouteTable (IpSb->RouteTable, &IfInfo->RouteCount, &IfInfo->RouteTable);
|
||||
|
||||
if (IfInfo->AddressInfoCount == 0) {
|
||||
@@ -657,7 +649,7 @@ Ip6ConfigSetAltIfId (
|
||||
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeAltInterfaceId];
|
||||
OldIfId = DataItem->Data.AltIfId;
|
||||
NewIfId = (EFI_IP6_CONFIG_INTERFACE_ID *) Data;
|
||||
NewIfId = (EFI_IP6_CONFIG_INTERFACE_ID *)Data;
|
||||
|
||||
CopyMem (OldIfId, NewIfId, DataSize);
|
||||
DataItem->Status = EFI_SUCCESS;
|
||||
@@ -696,33 +688,34 @@ Ip6ConfigSetPolicy (
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
NewPolicy = *((EFI_IP6_CONFIG_POLICY *) Data);
|
||||
NewPolicy = *((EFI_IP6_CONFIG_POLICY *)Data);
|
||||
|
||||
if (NewPolicy > Ip6ConfigPolicyAutomatic) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (NewPolicy == Instance->Policy) {
|
||||
|
||||
return EFI_ABORTED;
|
||||
} else {
|
||||
//
|
||||
// Clean the ManualAddress, Gateway and DnsServers, shrink the variable
|
||||
// data size, and fire up all the related events.
|
||||
//
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
|
||||
if (DataItem->Data.Ptr != NULL) {
|
||||
FreePool (DataItem->Data.Ptr);
|
||||
}
|
||||
|
||||
DataItem->Data.Ptr = NULL;
|
||||
DataItem->DataSize = 0;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
NetMapIterate (&DataItem->EventMap, Ip6ConfigSignalEvent, NULL);
|
||||
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];
|
||||
if (DataItem->Data.Ptr != NULL) {
|
||||
FreePool (DataItem->Data.Ptr);
|
||||
}
|
||||
|
||||
DataItem->Data.Ptr = NULL;
|
||||
DataItem->DataSize = 0;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
@@ -784,12 +777,10 @@ Ip6ConfigSetDadXmits (
|
||||
|
||||
OldDadXmits = Instance->DataItem[Ip6ConfigDataTypeDupAddrDetectTransmits].Data.DadXmits;
|
||||
|
||||
if ((*(UINT32 *) Data) == OldDadXmits->DupAddrDetectTransmits) {
|
||||
|
||||
if ((*(UINT32 *)Data) == OldDadXmits->DupAddrDetectTransmits) {
|
||||
return EFI_ABORTED;
|
||||
} else {
|
||||
|
||||
OldDadXmits->DupAddrDetectTransmits = *((UINT32 *) Data);
|
||||
OldDadXmits->DupAddrDetectTransmits = *((UINT32 *)Data);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -820,7 +811,7 @@ Ip6ManualAddrDadCallback (
|
||||
UINTN DadFailCount;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
Instance = (IP6_CONFIG_INSTANCE *) Context;
|
||||
Instance = (IP6_CONFIG_INSTANCE *)Context;
|
||||
NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);
|
||||
Item = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
|
||||
ManualAddr = NULL;
|
||||
@@ -872,20 +863,20 @@ Ip6ManualAddrDadCallback (
|
||||
// Part of addresses are detected to be duplicates, so update the
|
||||
// data with those passed.
|
||||
//
|
||||
PassedAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) AllocatePool (Item->DataSize);
|
||||
PassedAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *)AllocatePool (Item->DataSize);
|
||||
ASSERT (PassedAddr != NULL);
|
||||
|
||||
Item->Data.Ptr = PassedAddr;
|
||||
Item->Status = EFI_SUCCESS;
|
||||
|
||||
while (!NetMapIsEmpty (&Instance->DadPassedMap)) {
|
||||
ManualAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) NetMapRemoveHead (&Instance->DadPassedMap, NULL);
|
||||
ManualAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *)NetMapRemoveHead (&Instance->DadPassedMap, NULL);
|
||||
CopyMem (PassedAddr, ManualAddr, sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS));
|
||||
|
||||
PassedAddr++;
|
||||
}
|
||||
|
||||
ASSERT ((UINTN) PassedAddr - (UINTN) Item->Data.Ptr == Item->DataSize);
|
||||
ASSERT ((UINTN)PassedAddr - (UINTN)Item->Data.Ptr == Item->DataSize);
|
||||
}
|
||||
} else {
|
||||
//
|
||||
@@ -991,16 +982,16 @@ Ip6ConfigSetManualAddress (
|
||||
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
|
||||
|
||||
if (Data != NULL && DataSize != 0) {
|
||||
if ((Data != NULL) && (DataSize != 0)) {
|
||||
NewAddressCount = DataSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS);
|
||||
NewAddress = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) Data;
|
||||
NewAddress = (EFI_IP6_CONFIG_MANUAL_ADDRESS *)Data;
|
||||
|
||||
for (Index1 = 0; Index1 < NewAddressCount; Index1++, NewAddress++) {
|
||||
|
||||
if (NetIp6IsLinkLocalAddr (&NewAddress->Address) ||
|
||||
!NetIp6IsValidUnicast (&NewAddress->Address) ||
|
||||
(NewAddress->PrefixLength > 128)
|
||||
) {
|
||||
)
|
||||
{
|
||||
//
|
||||
// make sure the IPv6 address is unicast and not link-local address &&
|
||||
// the prefix length is valid.
|
||||
@@ -1014,7 +1005,6 @@ Ip6ConfigSetManualAddress (
|
||||
// Any two addresses in the array can't be equal.
|
||||
//
|
||||
if (EFI_IP6_EQUAL (&TmpAddress->Address, &NewAddress->Address)) {
|
||||
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
@@ -1032,7 +1022,7 @@ Ip6ConfigSetManualAddress (
|
||||
NET_LIST_FOR_EACH (Entry2, &IpIf->AddressList) {
|
||||
CurrentAddrInfo = NET_LIST_USER_STRUCT_S (Entry2, IP6_ADDRESS_INFO, Link, IP6_ADDR_INFO_SIGNATURE);
|
||||
|
||||
Copy = AllocateCopyPool (sizeof (IP6_ADDRESS_INFO), CurrentAddrInfo);
|
||||
Copy = AllocateCopyPool (sizeof (IP6_ADDRESS_INFO), CurrentAddrInfo);
|
||||
if (Copy == NULL) {
|
||||
break;
|
||||
}
|
||||
@@ -1059,6 +1049,7 @@ Ip6ConfigSetManualAddress (
|
||||
if (DataItem->Data.Ptr != NULL) {
|
||||
FreePool (DataItem->Data.Ptr);
|
||||
}
|
||||
|
||||
DataItem->Data.Ptr = NewAddress;
|
||||
DataItem->DataSize = DataSize;
|
||||
DataItem->Status = EFI_NOT_READY;
|
||||
@@ -1066,7 +1057,7 @@ Ip6ConfigSetManualAddress (
|
||||
//
|
||||
// Trigger DAD, it's an asynchronous process.
|
||||
//
|
||||
IsUpdated = FALSE;
|
||||
IsUpdated = FALSE;
|
||||
|
||||
for (Index1 = 0; Index1 < NewAddressCount; Index1++, NewAddress++) {
|
||||
if (Ip6IsOneOfSetAddress (IpSb, &NewAddress->Address, NULL, &CurrentAddrInfo)) {
|
||||
@@ -1113,7 +1104,7 @@ Ip6ConfigSetManualAddress (
|
||||
// Save the prefix length.
|
||||
//
|
||||
CurrentAddrInfo->PrefixLength = NewAddress->PrefixLength;
|
||||
IsUpdated = TRUE;
|
||||
IsUpdated = TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1129,8 +1120,8 @@ Ip6ConfigSetManualAddress (
|
||||
Ip6CreatePrefixListEntry (
|
||||
IpSb,
|
||||
TRUE,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
NewAddress->PrefixLength,
|
||||
&NewAddress->Address
|
||||
);
|
||||
@@ -1156,8 +1147,8 @@ Ip6ConfigSetManualAddress (
|
||||
&NewAddress->Address,
|
||||
NewAddress->IsAnycast,
|
||||
NewAddress->PrefixLength,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
Ip6ManualAddrDadCallback,
|
||||
Instance
|
||||
);
|
||||
@@ -1230,6 +1221,7 @@ Ip6ConfigSetManualAddress (
|
||||
if (DataItem->Data.Ptr != NULL) {
|
||||
FreePool (DataItem->Data.Ptr);
|
||||
}
|
||||
|
||||
DataItem->Data.Ptr = NULL;
|
||||
DataItem->DataSize = 0;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
@@ -1243,8 +1235,8 @@ Ip6ConfigSetManualAddress (
|
||||
Ip6CreatePrefixListEntry (
|
||||
IpSb,
|
||||
TRUE,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
IP6_LINK_LOCAL_PREFIX_LENGTH,
|
||||
&IpSb->LinkLocalAddr
|
||||
);
|
||||
@@ -1330,13 +1322,13 @@ Ip6ConfigSetGateway (
|
||||
IP6_DEFAULT_ROUTER *DefaultRouter;
|
||||
VOID *Tmp;
|
||||
|
||||
OldGateway = NULL;
|
||||
NewGateway = NULL;
|
||||
Item = NULL;
|
||||
DefaultRouter = NULL;
|
||||
Tmp = NULL;
|
||||
OneRemoved = FALSE;
|
||||
OneAdded = FALSE;
|
||||
OldGateway = NULL;
|
||||
NewGateway = NULL;
|
||||
Item = NULL;
|
||||
DefaultRouter = NULL;
|
||||
Tmp = NULL;
|
||||
OneRemoved = FALSE;
|
||||
OneAdded = FALSE;
|
||||
|
||||
if ((DataSize != 0) && (DataSize % sizeof (EFI_IPv6_ADDRESS) != 0)) {
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
@@ -1362,13 +1354,11 @@ Ip6ConfigSetGateway (
|
||||
}
|
||||
}
|
||||
|
||||
if (Data != NULL && DataSize != 0) {
|
||||
NewGateway = (EFI_IPv6_ADDRESS *) Data;
|
||||
if ((Data != NULL) && (DataSize != 0)) {
|
||||
NewGateway = (EFI_IPv6_ADDRESS *)Data;
|
||||
NewGatewayCount = DataSize / sizeof (EFI_IPv6_ADDRESS);
|
||||
for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {
|
||||
|
||||
if (!NetIp6IsValidUnicast (NewGateway + Index1)) {
|
||||
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -1389,7 +1379,6 @@ Ip6ConfigSetGateway (
|
||||
}
|
||||
|
||||
for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {
|
||||
|
||||
DefaultRouter = Ip6FindDefaultRouter (IpSb, NewGateway + Index1);
|
||||
if (DefaultRouter == NULL) {
|
||||
Ip6CreateDefaultRouter (IpSb, NewGateway + Index1, IP6_INF_ROUTER_LIFETIME);
|
||||
@@ -1401,11 +1390,11 @@ Ip6ConfigSetGateway (
|
||||
Item->Status = EFI_SUCCESS;
|
||||
return EFI_ABORTED;
|
||||
} else {
|
||||
|
||||
if (Tmp != NULL) {
|
||||
if (Item->Data.Ptr != NULL) {
|
||||
FreePool (Item->Data.Ptr);
|
||||
}
|
||||
|
||||
Item->Data.Ptr = Tmp;
|
||||
}
|
||||
|
||||
@@ -1421,6 +1410,7 @@ Ip6ConfigSetGateway (
|
||||
if (Item->Data.Ptr != NULL) {
|
||||
FreePool (Item->Data.Ptr);
|
||||
}
|
||||
|
||||
Item->Data.Ptr = NULL;
|
||||
Item->DataSize = 0;
|
||||
Item->Status = EFI_NOT_FOUND;
|
||||
@@ -1483,8 +1473,8 @@ Ip6ConfigSetDnsServer (
|
||||
|
||||
Item = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];
|
||||
|
||||
if (Data != NULL && DataSize != 0) {
|
||||
NewDns = (EFI_IPv6_ADDRESS *) Data;
|
||||
if ((Data != NULL) && (DataSize != 0)) {
|
||||
NewDns = (EFI_IPv6_ADDRESS *)Data;
|
||||
OldDns = Item->Data.DnsServers;
|
||||
NewDnsCount = DataSize / sizeof (EFI_IPv6_ADDRESS);
|
||||
OldDnsCount = Item->DataSize / sizeof (EFI_IPv6_ADDRESS);
|
||||
@@ -1500,7 +1490,6 @@ Ip6ConfigSetDnsServer (
|
||||
}
|
||||
|
||||
for (NewIndex = 0; NewIndex < NewDnsCount; NewIndex++) {
|
||||
|
||||
if (!NetIp6IsValidUnicast (NewDns + NewIndex)) {
|
||||
//
|
||||
// The dns server address must be unicast.
|
||||
@@ -1508,6 +1497,7 @@ Ip6ConfigSetDnsServer (
|
||||
if (Tmp != NULL) {
|
||||
FreePool (Tmp);
|
||||
}
|
||||
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -1544,6 +1534,7 @@ Ip6ConfigSetDnsServer (
|
||||
if (Item->Data.Ptr != NULL) {
|
||||
FreePool (Item->Data.Ptr);
|
||||
}
|
||||
|
||||
Item->Data.Ptr = Tmp;
|
||||
}
|
||||
|
||||
@@ -1551,13 +1542,14 @@ Ip6ConfigSetDnsServer (
|
||||
Item->DataSize = DataSize;
|
||||
Item->Status = EFI_SUCCESS;
|
||||
}
|
||||
} else {
|
||||
} else {
|
||||
//
|
||||
// DataSize is 0 and Data is NULL, clean up the DnsServer address.
|
||||
//
|
||||
if (Item->Data.Ptr != NULL) {
|
||||
FreePool (Item->Data.Ptr);
|
||||
}
|
||||
|
||||
Item->Data.Ptr = NULL;
|
||||
Item->DataSize = 0;
|
||||
Item->Status = EFI_NOT_FOUND;
|
||||
@@ -1585,7 +1577,7 @@ Ip6ConfigInitIfInfo (
|
||||
sizeof (IfInfo->Name),
|
||||
L"eth%d",
|
||||
IpSb->Ip6ConfigInstance.IfIndex
|
||||
);
|
||||
);
|
||||
|
||||
IfInfo->IfType = IpSb->SnpMode.IfType;
|
||||
IfInfo->HwAddressSize = IpSb->SnpMode.HwAddressSize;
|
||||
@@ -1607,9 +1599,9 @@ Ip6ConfigInitIfInfo (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ConfigParseDhcpReply (
|
||||
IN EFI_DHCP6_PROTOCOL *Dhcp6,
|
||||
IN OUT IP6_CONFIG_INSTANCE *Instance,
|
||||
IN EFI_DHCP6_PACKET *Reply
|
||||
IN EFI_DHCP6_PROTOCOL *Dhcp6,
|
||||
IN OUT IP6_CONFIG_INSTANCE *Instance,
|
||||
IN EFI_DHCP6_PACKET *Reply
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -1669,7 +1661,7 @@ Ip6ConfigParseDhcpReply (
|
||||
//
|
||||
// Validate the DnsServers: whether they are unicast addresses.
|
||||
//
|
||||
DnsServer = (EFI_IPv6_ADDRESS *) OptList[Index]->Data;
|
||||
DnsServer = (EFI_IPv6_ADDRESS *)OptList[Index]->Data;
|
||||
for (Index2 = 0; Index2 < Length / sizeof (EFI_IPv6_ADDRESS); Index2++) {
|
||||
if (!NetIp6IsValidUnicast (DnsServer)) {
|
||||
Status = EFI_NOT_READY;
|
||||
@@ -1728,7 +1720,7 @@ Ip6ConfigSetStatefulAddrCallback (
|
||||
{
|
||||
IP6_CONFIG_INSTANCE *Instance;
|
||||
|
||||
Instance = (IP6_CONFIG_INSTANCE *) Context;
|
||||
Instance = (IP6_CONFIG_INSTANCE *)Context;
|
||||
NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);
|
||||
|
||||
//
|
||||
@@ -1769,6 +1761,7 @@ Ip6ConfigSetStatefulAddrCallback (
|
||||
if (Instance->DeclineAddress != NULL) {
|
||||
FreePool (Instance->DeclineAddress);
|
||||
}
|
||||
|
||||
Instance->DeclineAddress = NULL;
|
||||
Instance->DeclineAddressCount = 0;
|
||||
}
|
||||
@@ -1788,25 +1781,25 @@ Ip6ConfigOnDhcp6Event (
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_CONFIG_INSTANCE *Instance;
|
||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||
EFI_STATUS Status;
|
||||
EFI_DHCP6_MODE_DATA Dhcp6ModeData;
|
||||
EFI_DHCP6_IA *Ia;
|
||||
EFI_DHCP6_IA_ADDRESS *IaAddr;
|
||||
UINT32 Index;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
IP6_INTERFACE *IpIf;
|
||||
IP6_CONFIG_INSTANCE *Instance;
|
||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||
EFI_STATUS Status;
|
||||
EFI_DHCP6_MODE_DATA Dhcp6ModeData;
|
||||
EFI_DHCP6_IA *Ia;
|
||||
EFI_DHCP6_IA_ADDRESS *IaAddr;
|
||||
UINT32 Index;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
IP6_INTERFACE *IpIf;
|
||||
|
||||
Instance = (IP6_CONFIG_INSTANCE *) Context;
|
||||
Instance = (IP6_CONFIG_INSTANCE *)Context;
|
||||
|
||||
if ((Instance->Policy != Ip6ConfigPolicyAutomatic) || Instance->OtherInfoOnly) {
|
||||
//
|
||||
// IPv6 is not operating in the automatic policy now or
|
||||
// the DHCPv6 information request message exchange is aborted.
|
||||
//
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1816,7 +1809,7 @@ Ip6ConfigOnDhcp6Event (
|
||||
|
||||
Status = Dhcp6->GetModeData (Dhcp6, &Dhcp6ModeData, NULL);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
|
||||
@@ -1828,16 +1821,16 @@ Ip6ConfigOnDhcp6Event (
|
||||
FreePool (Instance->DeclineAddress);
|
||||
}
|
||||
|
||||
Instance->DeclineAddress = (EFI_IPv6_ADDRESS *) AllocatePool (Ia->IaAddressCount * sizeof (EFI_IPv6_ADDRESS));
|
||||
Instance->DeclineAddress = (EFI_IPv6_ADDRESS *)AllocatePool (Ia->IaAddressCount * sizeof (EFI_IPv6_ADDRESS));
|
||||
if (Instance->DeclineAddress == NULL) {
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
Instance->FailedIaAddressCount = Ia->IaAddressCount;
|
||||
Instance->DeclineAddressCount = 0;
|
||||
Instance->DeclineAddressCount = 0;
|
||||
|
||||
for (Index = 0; Index < Ia->IaAddressCount; Index++, IaAddr++) {
|
||||
if (Ia->IaAddress[Index].ValidLifetime != 0 && Ia->State == Dhcp6Bound) {
|
||||
if ((Ia->IaAddress[Index].ValidLifetime != 0) && (Ia->State == Dhcp6Bound)) {
|
||||
//
|
||||
// Set this address, either it's a new address or with updated lifetimes.
|
||||
// An appropriate prefix length will be set.
|
||||
@@ -1908,7 +1901,7 @@ Ip6ConfigOnDhcp6Reply (
|
||||
IN EFI_DHCP6_PACKET *Packet
|
||||
)
|
||||
{
|
||||
return Ip6ConfigParseDhcpReply (This, (IP6_CONFIG_INSTANCE *) Context, Packet);
|
||||
return Ip6ConfigParseDhcpReply (This, (IP6_CONFIG_INSTANCE *)Context, Packet);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1928,13 +1921,13 @@ Ip6ConfigOnDhcp6SbInstalled (
|
||||
{
|
||||
IP6_CONFIG_INSTANCE *Instance;
|
||||
|
||||
Instance = (IP6_CONFIG_INSTANCE *) Context;
|
||||
Instance = (IP6_CONFIG_INSTANCE *)Context;
|
||||
|
||||
if ((Instance->Dhcp6Handle != NULL) || (Instance->Policy != Ip6ConfigPolicyAutomatic)) {
|
||||
//
|
||||
// The DHCP6 child is already created or the policy is no longer AUTOMATIC.
|
||||
//
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
Ip6ConfigStartStatefulAutoConfig (Instance, Instance->OtherInfoOnly);
|
||||
@@ -1990,10 +1983,10 @@ Ip6ConfigOnDhcp6SbInstalled (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6ConfigSetData (
|
||||
IN EFI_IP6_CONFIG_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA_TYPE DataType,
|
||||
IN UINTN DataSize,
|
||||
IN VOID *Data
|
||||
IN EFI_IP6_CONFIG_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA_TYPE DataType,
|
||||
IN UINTN DataSize,
|
||||
IN VOID *Data
|
||||
)
|
||||
{
|
||||
EFI_TPL OldTpl;
|
||||
@@ -2001,7 +1994,7 @@ EfiIp6ConfigSetData (
|
||||
IP6_CONFIG_INSTANCE *Instance;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
if ((This == NULL) || (Data == NULL && DataSize != 0) || (Data != NULL && DataSize == 0)) {
|
||||
if ((This == NULL) || ((Data == NULL) && (DataSize != 0)) || ((Data != NULL) && (DataSize == 0))) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -2021,14 +2014,12 @@ EfiIp6ConfigSetData (
|
||||
|
||||
Status = Instance->DataItem[DataType].Status;
|
||||
if (Status != EFI_NOT_READY) {
|
||||
|
||||
if (Instance->DataItem[DataType].SetData == NULL) {
|
||||
//
|
||||
// This type of data is readonly.
|
||||
//
|
||||
Status = EFI_WRITE_PROTECTED;
|
||||
} else {
|
||||
|
||||
Status = Instance->DataItem[DataType].SetData (Instance, DataSize, Data);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
@@ -2098,10 +2089,10 @@ EfiIp6ConfigSetData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6ConfigGetData (
|
||||
IN EFI_IP6_CONFIG_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA_TYPE DataType,
|
||||
IN OUT UINTN *DataSize,
|
||||
IN VOID *Data OPTIONAL
|
||||
IN EFI_IP6_CONFIG_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA_TYPE DataType,
|
||||
IN OUT UINTN *DataSize,
|
||||
IN VOID *Data OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_TPL OldTpl;
|
||||
@@ -2122,11 +2113,9 @@ EfiIp6ConfigGetData (
|
||||
Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);
|
||||
DataItem = &Instance->DataItem[DataType];
|
||||
|
||||
Status = Instance->DataItem[DataType].Status;
|
||||
Status = Instance->DataItem[DataType].Status;
|
||||
if (!EFI_ERROR (Status)) {
|
||||
|
||||
if (DataItem->GetData != NULL) {
|
||||
|
||||
Status = DataItem->GetData (Instance, DataSize, Data);
|
||||
} else if (*DataSize < Instance->DataItem[DataType].DataSize) {
|
||||
//
|
||||
@@ -2135,7 +2124,6 @@ EfiIp6ConfigGetData (
|
||||
*DataSize = Instance->DataItem[DataType].DataSize;
|
||||
Status = EFI_BUFFER_TOO_SMALL;
|
||||
} else {
|
||||
|
||||
*DataSize = Instance->DataItem[DataType].DataSize;
|
||||
CopyMem (Data, Instance->DataItem[DataType].Data.Ptr, *DataSize);
|
||||
}
|
||||
@@ -2171,9 +2159,9 @@ EfiIp6ConfigGetData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6ConfigRegisterDataNotify (
|
||||
IN EFI_IP6_CONFIG_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA_TYPE DataType,
|
||||
IN EFI_EVENT Event
|
||||
IN EFI_IP6_CONFIG_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA_TYPE DataType,
|
||||
IN EFI_EVENT Event
|
||||
)
|
||||
{
|
||||
EFI_TPL OldTpl;
|
||||
@@ -2190,26 +2178,22 @@ EfiIp6ConfigRegisterDataNotify (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
|
||||
Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);
|
||||
EventMap = &Instance->DataItem[DataType].EventMap;
|
||||
Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);
|
||||
EventMap = &Instance->DataItem[DataType].EventMap;
|
||||
|
||||
//
|
||||
// Check whether this event is already registered for this DataType.
|
||||
//
|
||||
Item = NetMapFindKey (EventMap, Event);
|
||||
if (Item == NULL) {
|
||||
|
||||
Status = NetMapInsertTail (EventMap, Event, NULL);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
Status = EFI_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
@@ -2236,9 +2220,9 @@ EfiIp6ConfigRegisterDataNotify (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6ConfigUnregisterDataNotify (
|
||||
IN EFI_IP6_CONFIG_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA_TYPE DataType,
|
||||
IN EFI_EVENT Event
|
||||
IN EFI_IP6_CONFIG_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA_TYPE DataType,
|
||||
IN EFI_EVENT Event
|
||||
)
|
||||
{
|
||||
EFI_TPL OldTpl;
|
||||
@@ -2260,11 +2244,9 @@ EfiIp6ConfigUnregisterDataNotify (
|
||||
|
||||
Item = NetMapFindKey (&Instance->DataItem[DataType].EventMap, Event);
|
||||
if (Item != NULL) {
|
||||
|
||||
NetMapRemoveItem (&Instance->DataItem[DataType].EventMap, Item, NULL);
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
|
||||
Status = EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -2357,24 +2339,24 @@ Ip6ConfigInitInstance (
|
||||
Instance->Policy = Ip6ConfigPolicyManual;
|
||||
SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED);
|
||||
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeDupAddrDetectTransmits];
|
||||
DataItem->SetData = Ip6ConfigSetDadXmits;
|
||||
DataItem->Data.Ptr = &Instance->DadXmits;
|
||||
DataItem->DataSize = sizeof (Instance->DadXmits);
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeDupAddrDetectTransmits];
|
||||
DataItem->SetData = Ip6ConfigSetDadXmits;
|
||||
DataItem->Data.Ptr = &Instance->DadXmits;
|
||||
DataItem->DataSize = sizeof (Instance->DadXmits);
|
||||
Instance->DadXmits.DupAddrDetectTransmits = IP6_CONFIG_DEFAULT_DAD_XMITS;
|
||||
SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED);
|
||||
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
|
||||
DataItem->SetData = Ip6ConfigSetManualAddress;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
|
||||
DataItem->SetData = Ip6ConfigSetManualAddress;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];
|
||||
DataItem->SetData = Ip6ConfigSetGateway;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];
|
||||
DataItem->SetData = Ip6ConfigSetGateway;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];
|
||||
DataItem->SetData = Ip6ConfigSetDnsServer;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];
|
||||
DataItem->SetData = Ip6ConfigSetDnsServer;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
|
||||
//
|
||||
// Create the event used for DHCP.
|
||||
@@ -2388,7 +2370,7 @@ Ip6ConfigInitInstance (
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Instance->Configured = TRUE;
|
||||
Instance->Configured = TRUE;
|
||||
|
||||
//
|
||||
// Try to read the config data from NV variable.
|
||||
@@ -2415,7 +2397,6 @@ Ip6ConfigInitInstance (
|
||||
Instance->Ip6Config.RegisterDataNotify = EfiIp6ConfigRegisterDataNotify;
|
||||
Instance->Ip6Config.UnregisterDataNotify = EfiIp6ConfigUnregisterDataNotify;
|
||||
|
||||
|
||||
//
|
||||
// Publish the IP6 configuration form
|
||||
//
|
||||
@@ -2441,11 +2422,10 @@ Ip6ConfigCleanInstance (
|
||||
}
|
||||
|
||||
if (!Instance->Configured) {
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Instance->Dhcp6Handle != NULL) {
|
||||
|
||||
Ip6ConfigDestroyDhcp6 (Instance);
|
||||
}
|
||||
|
||||
@@ -2460,13 +2440,13 @@ Ip6ConfigCleanInstance (
|
||||
NetMapClean (&Instance->DadFailedMap);
|
||||
|
||||
for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {
|
||||
|
||||
DataItem = &Instance->DataItem[Index];
|
||||
|
||||
if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED)) {
|
||||
if (DataItem->Data.Ptr != NULL) {
|
||||
FreePool (DataItem->Data.Ptr);
|
||||
}
|
||||
|
||||
DataItem->Data.Ptr = NULL;
|
||||
DataItem->DataSize = 0;
|
||||
}
|
||||
@@ -2493,9 +2473,9 @@ Ip6ConfigDestroyDhcp6 (
|
||||
IN OUT IP6_CONFIG_INSTANCE *Instance
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_STATUS Status;
|
||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_STATUS Status;
|
||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||
|
||||
Dhcp6 = Instance->Dhcp6;
|
||||
ASSERT (Dhcp6 != NULL);
|
||||
@@ -2530,4 +2510,3 @@ Ip6ConfigDestroyDhcp6 (
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@@ -10,17 +10,17 @@
|
||||
#ifndef __IP6_CONFIG_IMPL_H__
|
||||
#define __IP6_CONFIG_IMPL_H__
|
||||
|
||||
#define IP6_CONFIG_INSTANCE_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'C')
|
||||
#define IP6_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'F', 'C', 'I')
|
||||
#define IP6_CONFIG_VARIABLE_ATTRIBUTE (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS)
|
||||
#define IP6_CONFIG_INSTANCE_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'C')
|
||||
#define IP6_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'F', 'C', 'I')
|
||||
#define IP6_CONFIG_VARIABLE_ATTRIBUTE (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS)
|
||||
|
||||
#define IP6_CONFIG_DEFAULT_DAD_XMITS 1
|
||||
#define IP6_CONFIG_DEFAULT_DAD_XMITS 1
|
||||
|
||||
#define DATA_ATTRIB_SIZE_FIXED 0x1
|
||||
#define DATA_ATTRIB_VOLATILE 0x2
|
||||
#define DATA_ATTRIB_SIZE_FIXED 0x1
|
||||
#define DATA_ATTRIB_VOLATILE 0x2
|
||||
|
||||
#define DATA_ATTRIB_SET(Attrib, Bits) (BOOLEAN)((Attrib) & (Bits))
|
||||
#define SET_DATA_ATTRIB(Attrib, Bits) ((Attrib) |= (Bits))
|
||||
#define DATA_ATTRIB_SET(Attrib, Bits) (BOOLEAN)((Attrib) & (Bits))
|
||||
#define SET_DATA_ATTRIB(Attrib, Bits) ((Attrib) |= (Bits))
|
||||
|
||||
typedef struct _IP6_CONFIG_INSTANCE IP6_CONFIG_INSTANCE;
|
||||
|
||||
@@ -31,7 +31,6 @@ typedef struct _IP6_CONFIG_INSTANCE IP6_CONFIG_INSTANCE;
|
||||
IP6_CONFIG_INSTANCE_SIGNATURE \
|
||||
)
|
||||
|
||||
|
||||
#define IP6_CONFIG_INSTANCE_FROM_FORM_CALLBACK(Callback) \
|
||||
CR ((Callback), \
|
||||
IP6_CONFIG_INSTANCE, \
|
||||
@@ -99,30 +98,30 @@ EFI_STATUS
|
||||
);
|
||||
|
||||
typedef union {
|
||||
VOID *Ptr;
|
||||
EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
|
||||
EFI_IP6_CONFIG_INTERFACE_ID *AltIfId;
|
||||
EFI_IP6_CONFIG_POLICY *Policy;
|
||||
EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS *DadXmits;
|
||||
EFI_IP6_CONFIG_MANUAL_ADDRESS *ManualAddress;
|
||||
EFI_IPv6_ADDRESS *Gateway;
|
||||
EFI_IPv6_ADDRESS *DnsServers;
|
||||
VOID *Ptr;
|
||||
EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
|
||||
EFI_IP6_CONFIG_INTERFACE_ID *AltIfId;
|
||||
EFI_IP6_CONFIG_POLICY *Policy;
|
||||
EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS *DadXmits;
|
||||
EFI_IP6_CONFIG_MANUAL_ADDRESS *ManualAddress;
|
||||
EFI_IPv6_ADDRESS *Gateway;
|
||||
EFI_IPv6_ADDRESS *DnsServers;
|
||||
} IP6_CONFIG_DATA;
|
||||
|
||||
typedef struct {
|
||||
IP6_CONFIG_SET_DATA SetData;
|
||||
IP6_CONFIG_GET_DATA GetData;
|
||||
EFI_STATUS Status;
|
||||
UINT8 Attribute;
|
||||
NET_MAP EventMap;
|
||||
IP6_CONFIG_DATA Data;
|
||||
UINTN DataSize;
|
||||
IP6_CONFIG_SET_DATA SetData;
|
||||
IP6_CONFIG_GET_DATA GetData;
|
||||
EFI_STATUS Status;
|
||||
UINT8 Attribute;
|
||||
NET_MAP EventMap;
|
||||
IP6_CONFIG_DATA Data;
|
||||
UINTN DataSize;
|
||||
} IP6_CONFIG_DATA_ITEM;
|
||||
|
||||
typedef struct {
|
||||
UINT16 Offset;
|
||||
UINT32 DataSize;
|
||||
EFI_IP6_CONFIG_DATA_TYPE DataType;
|
||||
UINT16 Offset;
|
||||
UINT32 DataSize;
|
||||
EFI_IP6_CONFIG_DATA_TYPE DataType;
|
||||
} IP6_CONFIG_DATA_RECORD;
|
||||
|
||||
#pragma pack(1)
|
||||
@@ -142,69 +141,69 @@ typedef struct {
|
||||
// EFI_IPv6_ADDRESS DnsServers[];
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 IaId;
|
||||
UINT16 Checksum;
|
||||
UINT16 DataRecordCount;
|
||||
IP6_CONFIG_DATA_RECORD DataRecord[1];
|
||||
UINT32 IaId;
|
||||
UINT16 Checksum;
|
||||
UINT16 DataRecordCount;
|
||||
IP6_CONFIG_DATA_RECORD DataRecord[1];
|
||||
} IP6_CONFIG_VARIABLE;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
typedef struct {
|
||||
LIST_ENTRY Link;
|
||||
EFI_IP6_ADDRESS_INFO AddrInfo;
|
||||
LIST_ENTRY Link;
|
||||
EFI_IP6_ADDRESS_INFO AddrInfo;
|
||||
} IP6_ADDRESS_INFO_ENTRY;
|
||||
|
||||
typedef struct {
|
||||
EFI_IP6_CONFIG_POLICY Policy; ///< manual or automatic
|
||||
EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS DadTransmitCount; ///< dad transmits count
|
||||
EFI_IP6_CONFIG_INTERFACE_ID InterfaceId; ///< alternative interface id
|
||||
LIST_ENTRY ManualAddress; ///< IP addresses
|
||||
UINT32 ManualAddressCount; ///< IP addresses count
|
||||
LIST_ENTRY GatewayAddress; ///< Gateway address
|
||||
UINT32 GatewayAddressCount; ///< Gateway address count
|
||||
LIST_ENTRY DnsAddress; ///< DNS server address
|
||||
UINT32 DnsAddressCount; ///< DNS server address count
|
||||
EFI_IP6_CONFIG_POLICY Policy; ///< manual or automatic
|
||||
EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS DadTransmitCount; ///< dad transmits count
|
||||
EFI_IP6_CONFIG_INTERFACE_ID InterfaceId; ///< alternative interface id
|
||||
LIST_ENTRY ManualAddress; ///< IP addresses
|
||||
UINT32 ManualAddressCount; ///< IP addresses count
|
||||
LIST_ENTRY GatewayAddress; ///< Gateway address
|
||||
UINT32 GatewayAddressCount; ///< Gateway address count
|
||||
LIST_ENTRY DnsAddress; ///< DNS server address
|
||||
UINT32 DnsAddressCount; ///< DNS server address count
|
||||
} IP6_CONFIG_NVDATA;
|
||||
|
||||
typedef struct _IP6_FORM_CALLBACK_INFO {
|
||||
UINT32 Signature;
|
||||
EFI_HANDLE ChildHandle;
|
||||
EFI_HII_CONFIG_ACCESS_PROTOCOL HiiConfigAccess;
|
||||
EFI_DEVICE_PATH_PROTOCOL *HiiVendorDevicePath;
|
||||
EFI_HII_HANDLE RegisteredHandle;
|
||||
UINT32 Signature;
|
||||
EFI_HANDLE ChildHandle;
|
||||
EFI_HII_CONFIG_ACCESS_PROTOCOL HiiConfigAccess;
|
||||
EFI_DEVICE_PATH_PROTOCOL *HiiVendorDevicePath;
|
||||
EFI_HII_HANDLE RegisteredHandle;
|
||||
} IP6_FORM_CALLBACK_INFO;
|
||||
|
||||
struct _IP6_CONFIG_INSTANCE {
|
||||
UINT32 Signature;
|
||||
BOOLEAN Configured;
|
||||
LIST_ENTRY Link;
|
||||
UINT16 IfIndex;
|
||||
UINT32 Signature;
|
||||
BOOLEAN Configured;
|
||||
LIST_ENTRY Link;
|
||||
UINT16 IfIndex;
|
||||
|
||||
EFI_IP6_CONFIG_INTERFACE_INFO InterfaceInfo;
|
||||
EFI_IP6_CONFIG_INTERFACE_ID AltIfId;
|
||||
EFI_IP6_CONFIG_POLICY Policy;
|
||||
EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS DadXmits;
|
||||
EFI_IP6_CONFIG_INTERFACE_INFO InterfaceInfo;
|
||||
EFI_IP6_CONFIG_INTERFACE_ID AltIfId;
|
||||
EFI_IP6_CONFIG_POLICY Policy;
|
||||
EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS DadXmits;
|
||||
|
||||
IP6_CONFIG_DATA_ITEM DataItem[Ip6ConfigDataTypeMaximum];
|
||||
NET_MAP DadFailedMap;
|
||||
NET_MAP DadPassedMap;
|
||||
IP6_CONFIG_DATA_ITEM DataItem[Ip6ConfigDataTypeMaximum];
|
||||
NET_MAP DadFailedMap;
|
||||
NET_MAP DadPassedMap;
|
||||
|
||||
EFI_IP6_CONFIG_PROTOCOL Ip6Config;
|
||||
EFI_IP6_CONFIG_PROTOCOL Ip6Config;
|
||||
|
||||
EFI_EVENT Dhcp6SbNotifyEvent;
|
||||
VOID *Registration;
|
||||
EFI_HANDLE Dhcp6Handle;
|
||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||
BOOLEAN OtherInfoOnly;
|
||||
UINT32 IaId;
|
||||
EFI_EVENT Dhcp6Event;
|
||||
UINT32 FailedIaAddressCount;
|
||||
EFI_IPv6_ADDRESS *DeclineAddress;
|
||||
UINT32 DeclineAddressCount;
|
||||
EFI_EVENT Dhcp6SbNotifyEvent;
|
||||
VOID *Registration;
|
||||
EFI_HANDLE Dhcp6Handle;
|
||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||
BOOLEAN OtherInfoOnly;
|
||||
UINT32 IaId;
|
||||
EFI_EVENT Dhcp6Event;
|
||||
UINT32 FailedIaAddressCount;
|
||||
EFI_IPv6_ADDRESS *DeclineAddress;
|
||||
UINT32 DeclineAddressCount;
|
||||
|
||||
IP6_FORM_CALLBACK_INFO CallbackInfo;
|
||||
IP6_CONFIG_NVDATA Ip6NvData;
|
||||
IP6_FORM_CALLBACK_INFO CallbackInfo;
|
||||
IP6_CONFIG_NVDATA Ip6NvData;
|
||||
};
|
||||
|
||||
/**
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -16,10 +16,10 @@
|
||||
extern UINT8 Ip6ConfigBin[];
|
||||
extern UINT8 Ip6DxeStrings[];
|
||||
|
||||
#define IP6_ETHERNET L"Ethernet"
|
||||
#define IP6_EXPERIMENTAL_ETHERNET L"Experimental Ethernet"
|
||||
#define IP6_ADDRESS_DELIMITER L' '
|
||||
#define IP6_LINK_LOCAL_PREFIX L"FE80::"
|
||||
#define IP6_ETHERNET L"Ethernet"
|
||||
#define IP6_EXPERIMENTAL_ETHERNET L"Experimental Ethernet"
|
||||
#define IP6_ADDRESS_DELIMITER L' '
|
||||
#define IP6_LINK_LOCAL_PREFIX L"FE80::"
|
||||
|
||||
typedef enum {
|
||||
Ip6InterfaceTypeEthernet = 1,
|
||||
@@ -45,7 +45,7 @@ typedef enum {
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ConfigFormInit (
|
||||
IN OUT IP6_CONFIG_INSTANCE *Instance
|
||||
IN OUT IP6_CONFIG_INSTANCE *Instance
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -56,7 +56,7 @@ Ip6ConfigFormInit (
|
||||
**/
|
||||
VOID
|
||||
Ip6ConfigFormUnload (
|
||||
IN OUT IP6_CONFIG_INSTANCE *Instance
|
||||
IN OUT IP6_CONFIG_INSTANCE *Instance
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -10,7 +10,7 @@
|
||||
|
||||
#include "Ip6Impl.h"
|
||||
|
||||
EFI_DRIVER_BINDING_PROTOCOL gIp6DriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gIp6DriverBinding = {
|
||||
Ip6DriverBindingSupported,
|
||||
Ip6DriverBindingStart,
|
||||
Ip6DriverBindingStop,
|
||||
@@ -35,13 +35,14 @@ IpSec2InstalledCallback (
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Test if protocol was even found.
|
||||
// Notification function will be called at least once.
|
||||
//
|
||||
Status = gBS->LocateProtocol (&gEfiIpSec2ProtocolGuid, NULL, (VOID **)&mIpSec);
|
||||
if (Status == EFI_SUCCESS && mIpSec != NULL) {
|
||||
if ((Status == EFI_SUCCESS) && (mIpSec != NULL)) {
|
||||
//
|
||||
// Close the event so it does not get called again.
|
||||
//
|
||||
@@ -69,11 +70,11 @@ IpSec2InstalledCallback (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6DriverEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
VOID *Registration;
|
||||
VOID *Registration;
|
||||
|
||||
EfiCreateProtocolNotifyEvent (
|
||||
&gEfiIpSec2ProtocolGuid,
|
||||
@@ -142,14 +143,14 @@ Ip6DriverBindingSupported (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6CleanService (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS AllNodes;
|
||||
IP6_NEIGHBOR_ENTRY *NeighborCache;
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS AllNodes;
|
||||
IP6_NEIGHBOR_ENTRY *NeighborCache;
|
||||
|
||||
IpSb->State = IP6_SERVICE_DESTROY;
|
||||
IpSb->State = IP6_SERVICE_DESTROY;
|
||||
|
||||
if (IpSb->Timer != NULL) {
|
||||
gBS->SetTimer (IpSb->Timer, TimerCancel, 0);
|
||||
@@ -207,11 +208,11 @@ Ip6CleanService (
|
||||
IpSb->Mnp->Cancel (IpSb->Mnp, NULL);
|
||||
IpSb->Mnp->Configure (IpSb->Mnp, NULL);
|
||||
gBS->CloseProtocol (
|
||||
IpSb->MnpChildHandle,
|
||||
&gEfiManagedNetworkProtocolGuid,
|
||||
IpSb->Image,
|
||||
IpSb->Controller
|
||||
);
|
||||
IpSb->MnpChildHandle,
|
||||
&gEfiManagedNetworkProtocolGuid,
|
||||
IpSb->Image,
|
||||
IpSb->Controller
|
||||
);
|
||||
|
||||
IpSb->Mnp = NULL;
|
||||
}
|
||||
@@ -256,9 +257,9 @@ Ip6CleanService (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6CreateService (
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
OUT IP6_SERVICE **Service
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
OUT IP6_SERVICE **Service
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
@@ -286,60 +287,60 @@ Ip6CreateService (
|
||||
IpSb->ServiceBinding.DestroyChild = Ip6ServiceBindingDestroyChild;
|
||||
IpSb->State = IP6_SERVICE_UNSTARTED;
|
||||
|
||||
IpSb->NumChildren = 0;
|
||||
IpSb->NumChildren = 0;
|
||||
InitializeListHead (&IpSb->Children);
|
||||
|
||||
InitializeListHead (&IpSb->Interfaces);
|
||||
IpSb->DefaultInterface = NULL;
|
||||
IpSb->RouteTable = NULL;
|
||||
IpSb->DefaultInterface = NULL;
|
||||
IpSb->RouteTable = NULL;
|
||||
|
||||
IpSb->RecvRequest.Signature = IP6_LINK_RX_SIGNATURE;
|
||||
IpSb->RecvRequest.CallBack = NULL;
|
||||
IpSb->RecvRequest.Context = NULL;
|
||||
MnpToken = &IpSb->RecvRequest.MnpToken;
|
||||
MnpToken->Event = NULL;
|
||||
MnpToken->Status = EFI_NOT_READY;
|
||||
MnpToken->Packet.RxData = NULL;
|
||||
IpSb->RecvRequest.Signature = IP6_LINK_RX_SIGNATURE;
|
||||
IpSb->RecvRequest.CallBack = NULL;
|
||||
IpSb->RecvRequest.Context = NULL;
|
||||
MnpToken = &IpSb->RecvRequest.MnpToken;
|
||||
MnpToken->Event = NULL;
|
||||
MnpToken->Status = EFI_NOT_READY;
|
||||
MnpToken->Packet.RxData = NULL;
|
||||
|
||||
Ip6CreateAssembleTable (&IpSb->Assemble);
|
||||
|
||||
IpSb->MldCtrl.Mldv1QuerySeen = 0;
|
||||
IpSb->MldCtrl.Mldv1QuerySeen = 0;
|
||||
InitializeListHead (&IpSb->MldCtrl.Groups);
|
||||
|
||||
ZeroMem (&IpSb->LinkLocalAddr, sizeof (EFI_IPv6_ADDRESS));
|
||||
IpSb->LinkLocalOk = FALSE;
|
||||
IpSb->LinkLocalDadFail = FALSE;
|
||||
IpSb->Dhcp6NeedStart = FALSE;
|
||||
IpSb->Dhcp6NeedInfoRequest = FALSE;
|
||||
IpSb->LinkLocalOk = FALSE;
|
||||
IpSb->LinkLocalDadFail = FALSE;
|
||||
IpSb->Dhcp6NeedStart = FALSE;
|
||||
IpSb->Dhcp6NeedInfoRequest = FALSE;
|
||||
|
||||
IpSb->CurHopLimit = IP6_HOP_LIMIT;
|
||||
IpSb->LinkMTU = IP6_MIN_LINK_MTU;
|
||||
IpSb->BaseReachableTime = IP6_REACHABLE_TIME;
|
||||
IpSb->CurHopLimit = IP6_HOP_LIMIT;
|
||||
IpSb->LinkMTU = IP6_MIN_LINK_MTU;
|
||||
IpSb->BaseReachableTime = IP6_REACHABLE_TIME;
|
||||
Ip6UpdateReachableTime (IpSb);
|
||||
//
|
||||
// RFC4861 RETRANS_TIMER: 1,000 milliseconds
|
||||
//
|
||||
IpSb->RetransTimer = IP6_RETRANS_TIMER;
|
||||
IpSb->RetransTimer = IP6_RETRANS_TIMER;
|
||||
|
||||
IpSb->RoundRobin = 0;
|
||||
IpSb->RoundRobin = 0;
|
||||
|
||||
InitializeListHead (&IpSb->NeighborTable);
|
||||
InitializeListHead (&IpSb->DefaultRouterList);
|
||||
InitializeListHead (&IpSb->OnlinkPrefix);
|
||||
InitializeListHead (&IpSb->AutonomousPrefix);
|
||||
|
||||
IpSb->InterfaceIdLen = IP6_IF_ID_LEN;
|
||||
IpSb->InterfaceId = NULL;
|
||||
IpSb->InterfaceIdLen = IP6_IF_ID_LEN;
|
||||
IpSb->InterfaceId = NULL;
|
||||
|
||||
IpSb->RouterAdvertiseReceived = FALSE;
|
||||
IpSb->SolicitTimer = IP6_MAX_RTR_SOLICITATIONS;
|
||||
IpSb->Ticks = 0;
|
||||
IpSb->RouterAdvertiseReceived = FALSE;
|
||||
IpSb->SolicitTimer = IP6_MAX_RTR_SOLICITATIONS;
|
||||
IpSb->Ticks = 0;
|
||||
|
||||
IpSb->Image = ImageHandle;
|
||||
IpSb->Controller = Controller;
|
||||
IpSb->Image = ImageHandle;
|
||||
IpSb->Controller = Controller;
|
||||
|
||||
IpSb->MnpChildHandle = NULL;
|
||||
IpSb->Mnp = NULL;
|
||||
IpSb->MnpChildHandle = NULL;
|
||||
IpSb->Mnp = NULL;
|
||||
|
||||
Config = &IpSb->MnpConfigData;
|
||||
Config->ReceivedQueueTimeoutValue = 0;
|
||||
@@ -355,12 +356,12 @@ Ip6CreateService (
|
||||
|
||||
ZeroMem (&IpSb->SnpMode, sizeof (EFI_SIMPLE_NETWORK_MODE));
|
||||
|
||||
IpSb->Timer = NULL;
|
||||
IpSb->FasterTimer = NULL;
|
||||
IpSb->Timer = NULL;
|
||||
IpSb->FasterTimer = NULL;
|
||||
|
||||
ZeroMem (&IpSb->Ip6ConfigInstance, sizeof (IP6_CONFIG_INSTANCE));
|
||||
|
||||
IpSb->MacString = NULL;
|
||||
IpSb->MacString = NULL;
|
||||
|
||||
//
|
||||
// Create various resources. First create the route table, timer
|
||||
@@ -408,7 +409,7 @@ Ip6CreateService (
|
||||
Status = gBS->OpenProtocol (
|
||||
IpSb->MnpChildHandle,
|
||||
&gEfiManagedNetworkProtocolGuid,
|
||||
(VOID **) (&IpSb->Mnp),
|
||||
(VOID **)(&IpSb->Mnp),
|
||||
ImageHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@@ -434,6 +435,7 @@ Ip6CreateService (
|
||||
//
|
||||
IpSb->MaxPacketSize -= NET_VLAN_TAG_LEN;
|
||||
}
|
||||
|
||||
IpSb->OldMaxPacketSize = IpSb->MaxPacketSize;
|
||||
|
||||
//
|
||||
@@ -489,7 +491,6 @@ ON_ERROR:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Start this driver on ControllerHandle.
|
||||
|
||||
@@ -511,10 +512,10 @@ Ip6DriverBindingStart (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;
|
||||
IP6_CONFIG_DATA_ITEM *DataItem;
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;
|
||||
IP6_CONFIG_DATA_ITEM *DataItem;
|
||||
|
||||
IpSb = NULL;
|
||||
Ip6Cfg = NULL;
|
||||
@@ -544,7 +545,7 @@ Ip6DriverBindingStart (
|
||||
|
||||
ASSERT (IpSb != NULL);
|
||||
|
||||
Ip6Cfg = &IpSb->Ip6ConfigInstance.Ip6Config;
|
||||
Ip6Cfg = &IpSb->Ip6ConfigInstance.Ip6Config;
|
||||
|
||||
//
|
||||
// Install the Ip6ServiceBinding Protocol onto ControllerHandle
|
||||
@@ -581,7 +582,7 @@ Ip6DriverBindingStart (
|
||||
DataItem->DataSize,
|
||||
DataItem->Data.Ptr
|
||||
);
|
||||
if (Status == EFI_INVALID_PARAMETER || Status == EFI_BAD_BUFFER_SIZE) {
|
||||
if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_BAD_BUFFER_SIZE)) {
|
||||
//
|
||||
// Clean the invalid ManualAddress configuration.
|
||||
//
|
||||
@@ -606,7 +607,7 @@ Ip6DriverBindingStart (
|
||||
DataItem->DataSize,
|
||||
DataItem->Data.Ptr
|
||||
);
|
||||
if (Status == EFI_INVALID_PARAMETER || Status == EFI_BAD_BUFFER_SIZE) {
|
||||
if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_BAD_BUFFER_SIZE)) {
|
||||
//
|
||||
// Clean the invalid Gateway configuration.
|
||||
//
|
||||
@@ -688,8 +689,8 @@ FREE_SERVICE:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6DestroyChildEntryInHandleBuffer (
|
||||
IN LIST_ENTRY *Entry,
|
||||
IN VOID *Context
|
||||
IN LIST_ENTRY *Entry,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
@@ -697,14 +698,14 @@ Ip6DestroyChildEntryInHandleBuffer (
|
||||
UINTN NumberOfChildren;
|
||||
EFI_HANDLE *ChildHandleBuffer;
|
||||
|
||||
if (Entry == NULL || Context == NULL) {
|
||||
if ((Entry == NULL) || (Context == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
IpInstance = NET_LIST_USER_STRUCT_S (Entry, IP6_PROTOCOL, Link, IP6_PROTOCOL_SIGNATURE);
|
||||
ServiceBinding = ((IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding;
|
||||
NumberOfChildren = ((IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren;
|
||||
ChildHandleBuffer = ((IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer;
|
||||
IpInstance = NET_LIST_USER_STRUCT_S (Entry, IP6_PROTOCOL, Link, IP6_PROTOCOL_SIGNATURE);
|
||||
ServiceBinding = ((IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->ServiceBinding;
|
||||
NumberOfChildren = ((IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->NumberOfChildren;
|
||||
ChildHandleBuffer = ((IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->ChildHandleBuffer;
|
||||
|
||||
if (!NetIsInHandleBuffer (IpInstance->Handle, NumberOfChildren, ChildHandleBuffer)) {
|
||||
return EFI_SUCCESS;
|
||||
@@ -736,14 +737,14 @@ Ip6DriverBindingStop (
|
||||
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_HANDLE NicHandle;
|
||||
EFI_STATUS Status;
|
||||
LIST_ENTRY *List;
|
||||
INTN State;
|
||||
BOOLEAN IsDhcp6;
|
||||
IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_HANDLE NicHandle;
|
||||
EFI_STATUS Status;
|
||||
LIST_ENTRY *List;
|
||||
INTN State;
|
||||
BOOLEAN IsDhcp6;
|
||||
IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
||||
|
||||
IsDhcp6 = FALSE;
|
||||
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);
|
||||
@@ -759,7 +760,7 @@ Ip6DriverBindingStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
NicHandle,
|
||||
&gEfiIp6ServiceBindingProtocolGuid,
|
||||
(VOID **) &ServiceBinding,
|
||||
(VOID **)&ServiceBinding,
|
||||
This->DriverBindingHandle,
|
||||
NicHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -778,18 +779,18 @@ Ip6DriverBindingStop (
|
||||
//
|
||||
// NumberOfChildren is not zero, destroy the IP6 children instances in ChildHandleBuffer.
|
||||
//
|
||||
List = &IpSb->Children;
|
||||
List = &IpSb->Children;
|
||||
Context.ServiceBinding = ServiceBinding;
|
||||
Context.NumberOfChildren = NumberOfChildren;
|
||||
Context.ChildHandleBuffer = ChildHandleBuffer;
|
||||
Status = NetDestroyLinkList (
|
||||
List,
|
||||
Ip6DestroyChildEntryInHandleBuffer,
|
||||
&Context,
|
||||
NULL
|
||||
);
|
||||
Status = NetDestroyLinkList (
|
||||
List,
|
||||
Ip6DestroyChildEntryInHandleBuffer,
|
||||
&Context,
|
||||
NULL
|
||||
);
|
||||
} else if (IsListEmpty (&IpSb->Children)) {
|
||||
State = IpSb->State;
|
||||
State = IpSb->State;
|
||||
Status = Ip6CleanService (IpSb);
|
||||
if (EFI_ERROR (Status)) {
|
||||
IpSb->State = State;
|
||||
@@ -813,7 +814,6 @@ Exit:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Creates a child handle with a set of I/O services.
|
||||
|
||||
@@ -836,17 +836,17 @@ Ip6ServiceBindingCreateChild (
|
||||
IN EFI_HANDLE *ChildHandle
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
VOID *Mnp;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
VOID *Mnp;
|
||||
|
||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
IpSb = IP6_SERVICE_FROM_PROTOCOL (This);
|
||||
IpSb = IP6_SERVICE_FROM_PROTOCOL (This);
|
||||
|
||||
if (IpSb->LinkLocalDadFail) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
@@ -881,7 +881,7 @@ Ip6ServiceBindingCreateChild (
|
||||
Status = gBS->OpenProtocol (
|
||||
IpSb->MnpChildHandle,
|
||||
&gEfiManagedNetworkProtocolGuid,
|
||||
(VOID **) &Mnp,
|
||||
(VOID **)&Mnp,
|
||||
gIp6DriverBinding.DriverBindingHandle,
|
||||
IpInstance->Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@@ -910,7 +910,6 @@ Ip6ServiceBindingCreateChild (
|
||||
ON_ERROR:
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
||||
Ip6CleanProtocol (IpInstance);
|
||||
|
||||
FreePool (IpInstance);
|
||||
@@ -942,11 +941,11 @@ Ip6ServiceBindingDestroyChild (
|
||||
IN EFI_HANDLE ChildHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_IP6_PROTOCOL *Ip6;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_IP6_PROTOCOL *Ip6;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -955,12 +954,12 @@ Ip6ServiceBindingDestroyChild (
|
||||
//
|
||||
// Retrieve the private context data structures
|
||||
//
|
||||
IpSb = IP6_SERVICE_FROM_PROTOCOL (This);
|
||||
IpSb = IP6_SERVICE_FROM_PROTOCOL (This);
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandle,
|
||||
&gEfiIp6ProtocolGuid,
|
||||
(VOID **) &Ip6,
|
||||
(VOID **)&Ip6,
|
||||
gIp6DriverBinding.DriverBindingHandle,
|
||||
ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
|
@@ -10,16 +10,16 @@
|
||||
#ifndef __EFI_IP6_DRIVER_H__
|
||||
#define __EFI_IP6_DRIVER_H__
|
||||
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gIp6DriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gIp6ComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gIp6ComponentName2;
|
||||
extern EFI_UNICODE_STRING_TABLE *gIp6ControllerNameTable;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gIp6DriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gIp6ComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gIp6ComponentName2;
|
||||
extern EFI_UNICODE_STRING_TABLE *gIp6ControllerNameTable;
|
||||
|
||||
typedef struct {
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
UINTN NumberOfChildren;
|
||||
EFI_HANDLE *ChildHandleBuffer;
|
||||
}IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
UINTN NumberOfChildren;
|
||||
EFI_HANDLE *ChildHandleBuffer;
|
||||
} IP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
|
||||
|
||||
/**
|
||||
Clean up an IP6 service binding instance. It releases all
|
||||
@@ -36,7 +36,7 @@ typedef struct {
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6CleanService (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
//
|
||||
@@ -61,8 +61,8 @@ Ip6CleanService (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6DriverEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
);
|
||||
|
||||
//
|
||||
|
@@ -10,8 +10,7 @@
|
||||
|
||||
#include "Ip6Impl.h"
|
||||
|
||||
EFI_IP6_ICMP_TYPE mIp6SupportedIcmp[23] = {
|
||||
|
||||
EFI_IP6_ICMP_TYPE mIp6SupportedIcmp[23] = {
|
||||
{
|
||||
ICMP_V6_DEST_UNREACHABLE,
|
||||
ICMP_V6_NO_ROUTE_TO_DEST
|
||||
@@ -127,15 +126,15 @@ EFI_IP6_ICMP_TYPE mIp6SupportedIcmp[23] = {
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6IcmpReplyEcho (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_ICMP_INFORMATION_HEAD *Icmp;
|
||||
NET_BUF *Data;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_HEADER ReplyHead;
|
||||
IP6_ICMP_INFORMATION_HEAD *Icmp;
|
||||
NET_BUF *Data;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_HEADER ReplyHead;
|
||||
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
//
|
||||
@@ -153,7 +152,7 @@ Ip6IcmpReplyEcho (
|
||||
// use specific destination. See RFC1122. SRR/RR option
|
||||
// update is omitted.
|
||||
//
|
||||
Icmp = (IP6_ICMP_INFORMATION_HEAD *) NetbufGetByte (Data, 0, NULL);
|
||||
Icmp = (IP6_ICMP_INFORMATION_HEAD *)NetbufGetByte (Data, 0, NULL);
|
||||
if (Icmp == NULL) {
|
||||
NetbufFree (Data);
|
||||
goto Exit;
|
||||
@@ -169,9 +168,9 @@ Ip6IcmpReplyEcho (
|
||||
//
|
||||
ZeroMem (&ReplyHead, sizeof (EFI_IP6_HEADER));
|
||||
|
||||
ReplyHead.PayloadLength = HTONS ((UINT16) (Packet->TotalSize));
|
||||
ReplyHead.NextHeader = IP6_ICMP;
|
||||
ReplyHead.HopLimit = IpSb->CurHopLimit;
|
||||
ReplyHead.PayloadLength = HTONS ((UINT16)(Packet->TotalSize));
|
||||
ReplyHead.NextHeader = IP6_ICMP;
|
||||
ReplyHead.HopLimit = IpSb->CurHopLimit;
|
||||
IP6_COPY_ADDRESS (&ReplyHead.DestinationAddress, &Head->SourceAddress);
|
||||
|
||||
if (Ip6IsOneOfSetAddress (IpSb, &Head->DestinationAddress, NULL, NULL)) {
|
||||
@@ -218,17 +217,17 @@ Exit:
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessPacketTooBig (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_ICMP_ERROR_HEAD Icmp;
|
||||
UINT32 Mtu;
|
||||
IP6_ROUTE_ENTRY *RouteEntry;
|
||||
EFI_IPv6_ADDRESS *DestAddress;
|
||||
IP6_ICMP_ERROR_HEAD Icmp;
|
||||
UINT32 Mtu;
|
||||
IP6_ROUTE_ENTRY *RouteEntry;
|
||||
EFI_IPv6_ADDRESS *DestAddress;
|
||||
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);
|
||||
Mtu = NTOHL (Icmp.Fourth);
|
||||
DestAddress = &Icmp.IpHead.DestinationAddress;
|
||||
|
||||
@@ -280,12 +279,12 @@ Ip6ProcessPacketTooBig (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessIcmpError (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_ICMP_ERROR_HEAD Icmp;
|
||||
IP6_ICMP_ERROR_HEAD Icmp;
|
||||
|
||||
//
|
||||
// Check the validity of the packet
|
||||
@@ -294,7 +293,7 @@ Ip6ProcessIcmpError (
|
||||
goto DROP;
|
||||
}
|
||||
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);
|
||||
if (Icmp.Head.Type == ICMP_V6_PACKET_TOO_BIG) {
|
||||
return Ip6ProcessPacketTooBig (IpSb, Head, Packet);
|
||||
}
|
||||
@@ -329,55 +328,56 @@ DROP:
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessIcmpInformation (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_ICMP_INFORMATION_HEAD Icmp;
|
||||
EFI_STATUS Status;
|
||||
IP6_ICMP_INFORMATION_HEAD Icmp;
|
||||
EFI_STATUS Status;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
NET_CHECK_SIGNATURE (Packet, NET_BUF_SIGNATURE);
|
||||
ASSERT (Head != NULL);
|
||||
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
|
||||
switch (Icmp.Head.Type) {
|
||||
case ICMP_V6_ECHO_REQUEST:
|
||||
//
|
||||
// If ICMPv6 echo, reply it
|
||||
//
|
||||
if (Icmp.Head.Code == 0) {
|
||||
Status = Ip6IcmpReplyEcho (IpSb, Head, Packet);
|
||||
}
|
||||
break;
|
||||
case ICMP_V6_LISTENER_QUERY:
|
||||
Status = Ip6ProcessMldQuery (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_LISTENER_REPORT:
|
||||
case ICMP_V6_LISTENER_REPORT_2:
|
||||
Status = Ip6ProcessMldReport (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_NEIGHBOR_SOLICIT:
|
||||
Status = Ip6ProcessNeighborSolicit (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_NEIGHBOR_ADVERTISE:
|
||||
Status = Ip6ProcessNeighborAdvertise (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_ROUTER_ADVERTISE:
|
||||
Status = Ip6ProcessRouterAdvertise (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_REDIRECT:
|
||||
Status = Ip6ProcessRedirect (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_ECHO_REPLY:
|
||||
Status = Ip6Demultiplex (IpSb, Head, Packet);
|
||||
break;
|
||||
default:
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
break;
|
||||
case ICMP_V6_ECHO_REQUEST:
|
||||
//
|
||||
// If ICMPv6 echo, reply it
|
||||
//
|
||||
if (Icmp.Head.Code == 0) {
|
||||
Status = Ip6IcmpReplyEcho (IpSb, Head, Packet);
|
||||
}
|
||||
|
||||
break;
|
||||
case ICMP_V6_LISTENER_QUERY:
|
||||
Status = Ip6ProcessMldQuery (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_LISTENER_REPORT:
|
||||
case ICMP_V6_LISTENER_REPORT_2:
|
||||
Status = Ip6ProcessMldReport (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_NEIGHBOR_SOLICIT:
|
||||
Status = Ip6ProcessNeighborSolicit (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_NEIGHBOR_ADVERTISE:
|
||||
Status = Ip6ProcessNeighborAdvertise (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_ROUTER_ADVERTISE:
|
||||
Status = Ip6ProcessRouterAdvertise (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_REDIRECT:
|
||||
Status = Ip6ProcessRedirect (IpSb, Head, Packet);
|
||||
break;
|
||||
case ICMP_V6_ECHO_REPLY:
|
||||
Status = Ip6Demultiplex (IpSb, Head, Packet);
|
||||
break;
|
||||
default:
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
||||
return Status;
|
||||
@@ -400,14 +400,14 @@ Ip6ProcessIcmpInformation (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6IcmpHandle (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_ICMP_HEAD Icmp;
|
||||
UINT16 PseudoCheckSum;
|
||||
UINT16 CheckSum;
|
||||
IP6_ICMP_HEAD Icmp;
|
||||
UINT16 PseudoCheckSum;
|
||||
UINT16 CheckSum;
|
||||
|
||||
//
|
||||
// Check the validity of the incoming packet.
|
||||
@@ -416,7 +416,7 @@ Ip6IcmpHandle (
|
||||
goto DROP;
|
||||
}
|
||||
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);
|
||||
|
||||
//
|
||||
// Make sure checksum is valid.
|
||||
@@ -458,28 +458,28 @@ DROP:
|
||||
**/
|
||||
VOID
|
||||
Ip6GetPrefix (
|
||||
IN UINT8 PrefixLength,
|
||||
IN OUT EFI_IPv6_ADDRESS *Prefix
|
||||
IN UINT8 PrefixLength,
|
||||
IN OUT EFI_IPv6_ADDRESS *Prefix
|
||||
)
|
||||
{
|
||||
UINT8 Byte;
|
||||
UINT8 Bit;
|
||||
UINT8 Mask;
|
||||
UINT8 Value;
|
||||
UINT8 Byte;
|
||||
UINT8 Bit;
|
||||
UINT8 Mask;
|
||||
UINT8 Value;
|
||||
|
||||
ASSERT ((Prefix != NULL) && (PrefixLength < IP6_PREFIX_MAX));
|
||||
|
||||
if (PrefixLength == 0) {
|
||||
ZeroMem (Prefix, sizeof (EFI_IPv6_ADDRESS));
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
if (PrefixLength >= IP6_PREFIX_MAX) {
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
Byte = (UINT8) (PrefixLength / 8);
|
||||
Bit = (UINT8) (PrefixLength % 8);
|
||||
Byte = (UINT8)(PrefixLength / 8);
|
||||
Bit = (UINT8)(PrefixLength % 8);
|
||||
Value = Prefix->Addr[Byte];
|
||||
|
||||
if (Byte > 0) {
|
||||
@@ -487,10 +487,9 @@ Ip6GetPrefix (
|
||||
}
|
||||
|
||||
if (Bit > 0) {
|
||||
Mask = (UINT8) (0xFF << (8 - Bit));
|
||||
Prefix->Addr[Byte] = (UINT8) (Value & Mask);
|
||||
Mask = (UINT8)(0xFF << (8 - Bit));
|
||||
Prefix->Addr[Byte] = (UINT8)(Value & Mask);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -505,13 +504,13 @@ Ip6GetPrefix (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsAnycast (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress
|
||||
)
|
||||
{
|
||||
IP6_PREFIX_LIST_ENTRY *PrefixEntry;
|
||||
EFI_IPv6_ADDRESS Prefix;
|
||||
BOOLEAN Flag;
|
||||
IP6_PREFIX_LIST_ENTRY *PrefixEntry;
|
||||
EFI_IPv6_ADDRESS Prefix;
|
||||
BOOLEAN Flag;
|
||||
|
||||
ZeroMem (&Prefix, sizeof (EFI_IPv6_ADDRESS));
|
||||
|
||||
@@ -563,21 +562,21 @@ Ip6IsAnycast (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SendIcmpError (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress,
|
||||
IN UINT8 Type,
|
||||
IN UINT8 Code,
|
||||
IN UINT32 *Pointer OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress,
|
||||
IN UINT8 Type,
|
||||
IN UINT8 Code,
|
||||
IN UINT32 *Pointer OPTIONAL
|
||||
)
|
||||
{
|
||||
UINT32 PacketLen;
|
||||
NET_BUF *ErrorMsg;
|
||||
UINT16 PayloadLen;
|
||||
EFI_IP6_HEADER Head;
|
||||
IP6_ICMP_INFORMATION_HEAD *IcmpHead;
|
||||
UINT8 *ErrorBody;
|
||||
UINT32 PacketLen;
|
||||
NET_BUF *ErrorMsg;
|
||||
UINT16 PayloadLen;
|
||||
EFI_IP6_HEADER Head;
|
||||
IP6_ICMP_INFORMATION_HEAD *IcmpHead;
|
||||
UINT8 *ErrorBody;
|
||||
|
||||
if (DestinationAddress == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -592,24 +591,25 @@ Ip6SendIcmpError (
|
||||
if (NetIp6IsUnspecifiedAddr (DestinationAddress) ||
|
||||
IP6_IS_MULTICAST (DestinationAddress) ||
|
||||
Ip6IsAnycast (IpSb, DestinationAddress)
|
||||
) {
|
||||
)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
case ICMP_V6_DEST_UNREACHABLE:
|
||||
case ICMP_V6_TIME_EXCEEDED:
|
||||
break;
|
||||
case ICMP_V6_DEST_UNREACHABLE:
|
||||
case ICMP_V6_TIME_EXCEEDED:
|
||||
break;
|
||||
|
||||
case ICMP_V6_PARAMETER_PROBLEM:
|
||||
if (Pointer == NULL) {
|
||||
case ICMP_V6_PARAMETER_PROBLEM:
|
||||
if (Pointer == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
PacketLen = sizeof (IP6_ICMP_ERROR_HEAD) + Packet->TotalSize;
|
||||
@@ -623,16 +623,16 @@ Ip6SendIcmpError (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
PayloadLen = (UINT16) (PacketLen - sizeof (EFI_IP6_HEADER));
|
||||
PayloadLen = (UINT16)(PacketLen - sizeof (EFI_IP6_HEADER));
|
||||
|
||||
//
|
||||
// Create the basic IPv6 header.
|
||||
//
|
||||
ZeroMem (&Head, sizeof (EFI_IP6_HEADER));
|
||||
|
||||
Head.PayloadLength = HTONS (PayloadLen);
|
||||
Head.NextHeader = IP6_ICMP;
|
||||
Head.HopLimit = IpSb->CurHopLimit;
|
||||
Head.PayloadLength = HTONS (PayloadLen);
|
||||
Head.NextHeader = IP6_ICMP;
|
||||
Head.HopLimit = IpSb->CurHopLimit;
|
||||
|
||||
if (SourceAddress != NULL) {
|
||||
IP6_COPY_ADDRESS (&Head.SourceAddress, SourceAddress);
|
||||
@@ -647,7 +647,7 @@ Ip6SendIcmpError (
|
||||
//
|
||||
// Fill in the ICMP error message head
|
||||
//
|
||||
IcmpHead = (IP6_ICMP_INFORMATION_HEAD *) NetbufAllocSpace (ErrorMsg, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);
|
||||
IcmpHead = (IP6_ICMP_INFORMATION_HEAD *)NetbufAllocSpace (ErrorMsg, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);
|
||||
if (IcmpHead == NULL) {
|
||||
NetbufFree (ErrorMsg);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@@ -665,7 +665,7 @@ Ip6SendIcmpError (
|
||||
// Fill in the ICMP error message body
|
||||
//
|
||||
PayloadLen -= sizeof (IP6_ICMP_INFORMATION_HEAD);
|
||||
ErrorBody = NetbufAllocSpace (ErrorMsg, PayloadLen, FALSE);
|
||||
ErrorBody = NetbufAllocSpace (ErrorMsg, PayloadLen, FALSE);
|
||||
if (ErrorBody != NULL) {
|
||||
ZeroMem (ErrorBody, PayloadLen);
|
||||
NetbufCopy (Packet, 0, PayloadLen, ErrorBody);
|
||||
@@ -676,4 +676,3 @@ Ip6SendIcmpError (
|
||||
//
|
||||
return Ip6Output (IpSb, NULL, NULL, ErrorMsg, &Head, NULL, 0, Ip6SysPacketSent, NULL);
|
||||
}
|
||||
|
||||
|
@@ -10,18 +10,17 @@
|
||||
#ifndef __EFI_IP6_ICMP_H__
|
||||
#define __EFI_IP6_ICMP_H__
|
||||
|
||||
#define ICMP_V6_DEFAULT_CODE 0
|
||||
#define ICMP_V6_DEFAULT_CODE 0
|
||||
|
||||
#define ICMP_V6_ERROR_MAX 127
|
||||
#define ICMP_V6_ERROR_MAX 127
|
||||
|
||||
//
|
||||
// ICMPv6 message classes, each class of ICMPv6 message shares
|
||||
// a common message format. INVALID_MESSAGE is only a flag.
|
||||
//
|
||||
#define ICMP_V6_INVALID_MESSAGE 0
|
||||
#define ICMP_V6_ERROR_MESSAGE 1
|
||||
#define ICMP_V6_INFORMATION_MESSAGE 2
|
||||
|
||||
#define ICMP_V6_INVALID_MESSAGE 0
|
||||
#define ICMP_V6_ERROR_MESSAGE 1
|
||||
#define ICMP_V6_INFORMATION_MESSAGE 2
|
||||
|
||||
extern EFI_IP6_ICMP_TYPE mIp6SupportedIcmp[];
|
||||
|
||||
@@ -42,9 +41,9 @@ extern EFI_IP6_ICMP_TYPE mIp6SupportedIcmp[];
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6IcmpHandle (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -59,8 +58,8 @@ Ip6IcmpHandle (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsAnycast (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -89,14 +88,13 @@ Ip6IsAnycast (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SendIcmpError (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress,
|
||||
IN UINT8 Type,
|
||||
IN UINT8 Code,
|
||||
IN UINT32 *Pointer OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress,
|
||||
IN UINT8 Type,
|
||||
IN UINT8 Code,
|
||||
IN UINT32 *Pointer OPTIONAL
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -19,8 +19,8 @@
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6OnFrameSent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -37,11 +37,11 @@ Ip6OnFrameSent (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6CancelInstanceFrame (
|
||||
IN IP6_LINK_TX_TOKEN *Frame,
|
||||
IN VOID *Context
|
||||
IN IP6_LINK_TX_TOKEN *Frame,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
if (Frame->IpInstance == (IP6_PROTOCOL *) Context) {
|
||||
if (Frame->IpInstance == (IP6_PROTOCOL *)Context) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -73,14 +73,14 @@ Ip6CancelInstanceFrame (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SetAddress (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Addr,
|
||||
IN BOOLEAN IsAnycast,
|
||||
IN UINT8 PrefixLength,
|
||||
IN UINT32 ValidLifetime,
|
||||
IN UINT32 PreferredLifetime,
|
||||
IN IP6_DAD_CALLBACK DadCallback OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Addr,
|
||||
IN BOOLEAN IsAnycast,
|
||||
IN UINT8 PrefixLength,
|
||||
IN UINT32 ValidLifetime,
|
||||
IN UINT32 PreferredLifetime,
|
||||
IN IP6_DAD_CALLBACK DadCallback OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
@@ -109,12 +109,12 @@ Ip6SetAddress (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
AddressInfo = (IP6_ADDRESS_INFO *) AllocatePool (sizeof (IP6_ADDRESS_INFO));
|
||||
AddressInfo = (IP6_ADDRESS_INFO *)AllocatePool (sizeof (IP6_ADDRESS_INFO));
|
||||
if (AddressInfo == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
AddressInfo->Signature = IP6_ADDR_INFO_SIGNATURE;
|
||||
AddressInfo->Signature = IP6_ADDR_INFO_SIGNATURE;
|
||||
IP6_COPY_ADDRESS (&AddressInfo->Address, Ip6Addr);
|
||||
AddressInfo->IsAnycast = IsAnycast;
|
||||
AddressInfo->PrefixLength = PrefixLength;
|
||||
@@ -158,24 +158,23 @@ Ip6SetAddress (
|
||||
AddressInfo->PrefixLength = IP6_LINK_LOCAL_PREFIX_LENGTH;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Node should delay joining the solicited-node multicast address by a random delay
|
||||
// between 0 and MAX_RTR_SOLICITATION_DELAY (1 second).
|
||||
// Thus queue the address to be processed in Duplicate Address Detection module
|
||||
// after the delay time (in milliseconds).
|
||||
//
|
||||
Delay = (UINT64) NET_RANDOM (NetRandomInitSeed ());
|
||||
Delay = (UINT64)NET_RANDOM (NetRandomInitSeed ());
|
||||
Delay = MultU64x32 (Delay, IP6_ONE_SECOND_IN_MS);
|
||||
Delay = RShiftU64 (Delay, 32);
|
||||
|
||||
DelayNode = (IP6_DELAY_JOIN_LIST *) AllocatePool (sizeof (IP6_DELAY_JOIN_LIST));
|
||||
DelayNode = (IP6_DELAY_JOIN_LIST *)AllocatePool (sizeof (IP6_DELAY_JOIN_LIST));
|
||||
if (DelayNode == NULL) {
|
||||
FreePool (AddressInfo);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
DelayNode->DelayTime = (UINT32) (DivU64x32 (Delay, IP6_TIMER_INTERVAL_IN_MS));
|
||||
DelayNode->DelayTime = (UINT32)(DivU64x32 (Delay, IP6_TIMER_INTERVAL_IN_MS));
|
||||
DelayNode->Interface = Interface;
|
||||
DelayNode->AddressInfo = AddressInfo;
|
||||
DelayNode->DadCallback = DadCallback;
|
||||
@@ -197,13 +196,13 @@ Ip6SetAddress (
|
||||
**/
|
||||
IP6_INTERFACE *
|
||||
Ip6CreateInterface (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN LinkLocal
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN LinkLocal
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
IP6_INTERFACE *Interface;
|
||||
EFI_IPv6_ADDRESS *Ip6Addr;
|
||||
EFI_STATUS Status;
|
||||
IP6_INTERFACE *Interface;
|
||||
EFI_IPv6_ADDRESS *Ip6Addr;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
@@ -212,27 +211,27 @@ Ip6CreateInterface (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Interface->Signature = IP6_INTERFACE_SIGNATURE;
|
||||
Interface->RefCnt = 1;
|
||||
Interface->Signature = IP6_INTERFACE_SIGNATURE;
|
||||
Interface->RefCnt = 1;
|
||||
|
||||
InitializeListHead (&Interface->AddressList);
|
||||
Interface->AddressCount = 0;
|
||||
Interface->Configured = FALSE;
|
||||
Interface->AddressCount = 0;
|
||||
Interface->Configured = FALSE;
|
||||
|
||||
Interface->Service = IpSb;
|
||||
Interface->Controller = IpSb->Controller;
|
||||
Interface->Image = IpSb->Image;
|
||||
Interface->Service = IpSb;
|
||||
Interface->Controller = IpSb->Controller;
|
||||
Interface->Image = IpSb->Image;
|
||||
|
||||
InitializeListHead (&Interface->ArpQues);
|
||||
InitializeListHead (&Interface->SentFrames);
|
||||
|
||||
Interface->DupAddrDetect = IpSb->Ip6ConfigInstance.DadXmits.DupAddrDetectTransmits;
|
||||
Interface->DupAddrDetect = IpSb->Ip6ConfigInstance.DadXmits.DupAddrDetectTransmits;
|
||||
InitializeListHead (&Interface->DupAddrDetectList);
|
||||
|
||||
InitializeListHead (&Interface->DelayJoinList);
|
||||
|
||||
InitializeListHead (&Interface->IpInstances);
|
||||
Interface->PromiscRecv = FALSE;
|
||||
Interface->PromiscRecv = FALSE;
|
||||
|
||||
if (!LinkLocal) {
|
||||
return Interface;
|
||||
@@ -254,8 +253,8 @@ Ip6CreateInterface (
|
||||
Ip6Addr,
|
||||
FALSE,
|
||||
IP6_LINK_LOCAL_PREFIX_LENGTH,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
(UINT32)IP6_INFINIT_LIFETIME,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
@@ -288,12 +287,12 @@ ON_ERROR:
|
||||
**/
|
||||
VOID
|
||||
Ip6CleanInterface (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL
|
||||
)
|
||||
{
|
||||
IP6_DAD_ENTRY *Duplicate;
|
||||
IP6_DELAY_JOIN_LIST *Delay;
|
||||
IP6_DAD_ENTRY *Duplicate;
|
||||
IP6_DELAY_JOIN_LIST *Delay;
|
||||
|
||||
NET_CHECK_SIGNATURE (Interface, IP6_INTERFACE_SIGNATURE);
|
||||
ASSERT (Interface->RefCnt > 0);
|
||||
@@ -352,11 +351,11 @@ Ip6CleanInterface (
|
||||
**/
|
||||
IP6_LINK_TX_TOKEN *
|
||||
Ip6CreateLinkTxToken (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN VOID *Context
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_MANAGED_NETWORK_COMPLETION_TOKEN *MnpToken;
|
||||
@@ -381,8 +380,8 @@ Ip6CreateLinkTxToken (
|
||||
ZeroMem (&Token->DstMac, sizeof (EFI_MAC_ADDRESS));
|
||||
IP6_COPY_LINK_ADDRESS (&Token->SrcMac, &Interface->Service->SnpMode.CurrentAddress);
|
||||
|
||||
MnpToken = &(Token->MnpToken);
|
||||
MnpToken->Status = EFI_NOT_READY;
|
||||
MnpToken = &(Token->MnpToken);
|
||||
MnpToken->Status = EFI_NOT_READY;
|
||||
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_NOTIFY_SIGNAL,
|
||||
@@ -397,8 +396,8 @@ Ip6CreateLinkTxToken (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
MnpTxData = &Token->MnpTxData;
|
||||
MnpToken->Packet.TxData = MnpTxData;
|
||||
MnpTxData = &Token->MnpTxData;
|
||||
MnpToken->Packet.TxData = MnpTxData;
|
||||
|
||||
MnpTxData->DestinationAddress = &Token->DstMac;
|
||||
MnpTxData->SourceAddress = &Token->SrcMac;
|
||||
@@ -406,10 +405,10 @@ Ip6CreateLinkTxToken (
|
||||
MnpTxData->DataLength = Packet->TotalSize;
|
||||
MnpTxData->HeaderLength = 0;
|
||||
|
||||
Count = Packet->BlockOpNum;
|
||||
Count = Packet->BlockOpNum;
|
||||
|
||||
NetbufBuildExt (Packet, (NET_FRAGMENT *) MnpTxData->FragmentTable, &Count);
|
||||
MnpTxData->FragmentCount = (UINT16)Count;
|
||||
NetbufBuildExt (Packet, (NET_FRAGMENT *)MnpTxData->FragmentTable, &Count);
|
||||
MnpTxData->FragmentCount = (UINT16)Count;
|
||||
|
||||
return Token;
|
||||
}
|
||||
@@ -423,7 +422,7 @@ Ip6CreateLinkTxToken (
|
||||
**/
|
||||
VOID
|
||||
Ip6FreeLinkTxToken (
|
||||
IN IP6_LINK_TX_TOKEN *Token
|
||||
IN IP6_LINK_TX_TOKEN *Token
|
||||
)
|
||||
{
|
||||
NET_CHECK_SIGNATURE (Token, IP6_LINK_TX_SIGNATURE);
|
||||
@@ -442,12 +441,12 @@ Ip6FreeLinkTxToken (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6RecycleFrame (
|
||||
IN VOID *Context
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_MANAGED_NETWORK_RECEIVE_DATA *RxData;
|
||||
|
||||
RxData = (EFI_MANAGED_NETWORK_RECEIVE_DATA *) Context;
|
||||
RxData = (EFI_MANAGED_NETWORK_RECEIVE_DATA *)Context;
|
||||
|
||||
gBS->SignalEvent (RxData->RecycleEvent);
|
||||
}
|
||||
@@ -466,7 +465,7 @@ Ip6RecycleFrame (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6OnFrameReceivedDpc (
|
||||
IN VOID *Context
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_MANAGED_NETWORK_COMPLETION_TOKEN *MnpToken;
|
||||
@@ -477,23 +476,22 @@ Ip6OnFrameReceivedDpc (
|
||||
UINT32 Flag;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
Token = (IP6_LINK_RX_TOKEN *) Context;
|
||||
Token = (IP6_LINK_RX_TOKEN *)Context;
|
||||
NET_CHECK_SIGNATURE (Token, IP6_LINK_RX_SIGNATURE);
|
||||
|
||||
//
|
||||
// First clear the interface's receive request in case the
|
||||
// caller wants to call Ip6ReceiveFrame in the callback.
|
||||
//
|
||||
IpSb = (IP6_SERVICE *) Token->Context;
|
||||
IpSb = (IP6_SERVICE *)Token->Context;
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
|
||||
MnpToken = &Token->MnpToken;
|
||||
MnpRxData = MnpToken->Packet.RxData;
|
||||
|
||||
if (EFI_ERROR (MnpToken->Status) || (MnpRxData == NULL)) {
|
||||
Token->CallBack (NULL, MnpToken->Status, 0, Token->Context);
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -510,7 +508,7 @@ Ip6OnFrameReceivedDpc (
|
||||
|
||||
Token->CallBack (NULL, EFI_OUT_OF_RESOURCES, 0, Token->Context);
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
Flag = (MnpRxData->BroadcastFlag ? IP6_LINK_BROADCAST : 0);
|
||||
@@ -530,8 +528,8 @@ Ip6OnFrameReceivedDpc (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6OnFrameReceived (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -553,18 +551,18 @@ Ip6OnFrameReceived (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ReceiveFrame (
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN IP6_SERVICE *IpSb
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
IP6_LINK_RX_TOKEN *Token;
|
||||
EFI_STATUS Status;
|
||||
IP6_LINK_RX_TOKEN *Token;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
Token = &IpSb->RecvRequest;
|
||||
Token->CallBack = CallBack;
|
||||
Token->Context = (VOID *) IpSb;
|
||||
Token->Context = (VOID *)IpSb;
|
||||
|
||||
Status = IpSb->Mnp->Receive (IpSb->Mnp, &Token->MnpToken);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@@ -584,22 +582,22 @@ Ip6ReceiveFrame (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6OnFrameSentDpc (
|
||||
IN VOID *Context
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_LINK_TX_TOKEN *Token;
|
||||
IP6_LINK_TX_TOKEN *Token;
|
||||
|
||||
Token = (IP6_LINK_TX_TOKEN *) Context;
|
||||
Token = (IP6_LINK_TX_TOKEN *)Context;
|
||||
NET_CHECK_SIGNATURE (Token, IP6_LINK_TX_SIGNATURE);
|
||||
|
||||
RemoveEntryList (&Token->Link);
|
||||
|
||||
Token->CallBack (
|
||||
Token->Packet,
|
||||
Token->MnpToken.Status,
|
||||
0,
|
||||
Token->Context
|
||||
);
|
||||
Token->Packet,
|
||||
Token->MnpToken.Status,
|
||||
0,
|
||||
Token->Context
|
||||
);
|
||||
|
||||
Ip6FreeLinkTxToken (Token);
|
||||
}
|
||||
@@ -614,8 +612,8 @@ Ip6OnFrameSentDpc (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6OnFrameSent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -646,20 +644,20 @@ Ip6OnFrameSent (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SendFrame (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IPv6_ADDRESS *NextHop,
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN VOID *Context
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IPv6_ADDRESS *NextHop,
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_LINK_TX_TOKEN *Token;
|
||||
EFI_STATUS Status;
|
||||
IP6_NEIGHBOR_ENTRY *NeighborCache;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_NEIGHBOR_ENTRY *ArpQue;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_LINK_TX_TOKEN *Token;
|
||||
EFI_STATUS Status;
|
||||
IP6_NEIGHBOR_ENTRY *NeighborCache;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_NEIGHBOR_ENTRY *ArpQue;
|
||||
|
||||
IpSb = Interface->Service;
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
@@ -706,21 +704,21 @@ Ip6SendFrame (
|
||||
}
|
||||
|
||||
switch (NeighborCache->State) {
|
||||
case EfiNeighborStale:
|
||||
NeighborCache->State = EfiNeighborDelay;
|
||||
NeighborCache->Ticks = (UINT32) IP6_GET_TICKS (IP6_DELAY_FIRST_PROBE_TIME);
|
||||
case EfiNeighborStale:
|
||||
NeighborCache->State = EfiNeighborDelay;
|
||||
NeighborCache->Ticks = (UINT32)IP6_GET_TICKS (IP6_DELAY_FIRST_PROBE_TIME);
|
||||
//
|
||||
// Fall through
|
||||
//
|
||||
case EfiNeighborReachable:
|
||||
case EfiNeighborDelay:
|
||||
case EfiNeighborProbe:
|
||||
IP6_COPY_LINK_ADDRESS (&Token->DstMac, &NeighborCache->LinkAddress);
|
||||
goto SendNow;
|
||||
break;
|
||||
case EfiNeighborReachable:
|
||||
case EfiNeighborDelay:
|
||||
case EfiNeighborProbe:
|
||||
IP6_COPY_LINK_ADDRESS (&Token->DstMac, &NeighborCache->LinkAddress);
|
||||
goto SendNow;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -747,7 +745,7 @@ Ip6SendFrame (
|
||||
return EFI_SUCCESS;
|
||||
|
||||
SendNow:
|
||||
//
|
||||
//
|
||||
// Insert the tx token into the SentFrames list before calling Mnp->Transmit.
|
||||
// Remove it if the returned status is not EFI_SUCCESS.
|
||||
//
|
||||
@@ -777,13 +775,13 @@ Error:
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6TimerTicking (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
IpSb = (IP6_SERVICE *) Context;
|
||||
IpSb = (IP6_SERVICE *)Context;
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
Ip6PacketTimerTicking (IpSb);
|
||||
|
@@ -10,10 +10,10 @@
|
||||
#ifndef __EFI_IP6_IF_H__
|
||||
#define __EFI_IP6_IF_H__
|
||||
|
||||
#define IP6_LINK_RX_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'R')
|
||||
#define IP6_LINK_TX_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'T')
|
||||
#define IP6_INTERFACE_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'I')
|
||||
#define IP6_ADDR_INFO_SIGNATURE SIGNATURE_32 ('I', 'P', 'A', 'I')
|
||||
#define IP6_LINK_RX_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'R')
|
||||
#define IP6_LINK_TX_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'T')
|
||||
#define IP6_INTERFACE_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'I')
|
||||
#define IP6_ADDR_INFO_SIGNATURE SIGNATURE_32 ('I', 'P', 'A', 'I')
|
||||
|
||||
//
|
||||
// This prototype is used by both receive and transmission.
|
||||
@@ -33,10 +33,10 @@
|
||||
typedef
|
||||
VOID
|
||||
(*IP6_FRAME_CALLBACK) (
|
||||
NET_BUF *Packet,
|
||||
EFI_STATUS IoStatus,
|
||||
UINT32 LinkFlag,
|
||||
VOID *Context
|
||||
NET_BUF *Packet,
|
||||
EFI_STATUS IoStatus,
|
||||
UINT32 LinkFlag,
|
||||
VOID *Context
|
||||
);
|
||||
|
||||
//
|
||||
@@ -46,10 +46,10 @@ VOID
|
||||
// Reference MNP's spec for information.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
IP6_FRAME_CALLBACK CallBack;
|
||||
VOID *Context;
|
||||
EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken;
|
||||
UINT32 Signature;
|
||||
IP6_FRAME_CALLBACK CallBack;
|
||||
VOID *Context;
|
||||
EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken;
|
||||
} IP6_LINK_RX_TOKEN;
|
||||
|
||||
//
|
||||
@@ -57,29 +57,29 @@ typedef struct {
|
||||
// Upon completion, the Callback will be called.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_FRAME_CALLBACK CallBack;
|
||||
NET_BUF *Packet;
|
||||
VOID *Context;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_FRAME_CALLBACK CallBack;
|
||||
NET_BUF *Packet;
|
||||
VOID *Context;
|
||||
|
||||
EFI_MAC_ADDRESS DstMac;
|
||||
EFI_MAC_ADDRESS SrcMac;
|
||||
EFI_MAC_ADDRESS DstMac;
|
||||
EFI_MAC_ADDRESS SrcMac;
|
||||
|
||||
EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken;
|
||||
EFI_MANAGED_NETWORK_TRANSMIT_DATA MnpTxData;
|
||||
EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken;
|
||||
EFI_MANAGED_NETWORK_TRANSMIT_DATA MnpTxData;
|
||||
} IP6_LINK_TX_TOKEN;
|
||||
|
||||
struct _IP6_ADDRESS_INFO {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
EFI_IPv6_ADDRESS Address;
|
||||
BOOLEAN IsAnycast;
|
||||
UINT8 PrefixLength;
|
||||
UINT32 ValidLifetime;
|
||||
UINT32 PreferredLifetime;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
EFI_IPv6_ADDRESS Address;
|
||||
BOOLEAN IsAnycast;
|
||||
UINT8 PrefixLength;
|
||||
UINT32 ValidLifetime;
|
||||
UINT32 PreferredLifetime;
|
||||
};
|
||||
|
||||
//
|
||||
@@ -89,50 +89,48 @@ struct _IP6_ADDRESS_INFO {
|
||||
typedef
|
||||
BOOLEAN
|
||||
(*IP6_FRAME_TO_CANCEL) (
|
||||
IP6_LINK_TX_TOKEN *Frame,
|
||||
VOID *Context
|
||||
IP6_LINK_TX_TOKEN *Frame,
|
||||
VOID *Context
|
||||
);
|
||||
|
||||
struct _IP6_INTERFACE {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
|
||||
//
|
||||
// IP address and prefix length of the interface. The fileds
|
||||
// are invalid if (Configured == FALSE)
|
||||
//
|
||||
LIST_ENTRY AddressList;
|
||||
UINT32 AddressCount;
|
||||
BOOLEAN Configured;
|
||||
LIST_ENTRY AddressList;
|
||||
UINT32 AddressCount;
|
||||
BOOLEAN Configured;
|
||||
|
||||
IP6_SERVICE *Service;
|
||||
|
||||
EFI_HANDLE Controller;
|
||||
EFI_HANDLE Image;
|
||||
IP6_SERVICE *Service;
|
||||
|
||||
EFI_HANDLE Controller;
|
||||
EFI_HANDLE Image;
|
||||
|
||||
//
|
||||
// Queues to keep the frames sent and waiting ARP request.
|
||||
//
|
||||
LIST_ENTRY ArpQues;
|
||||
LIST_ENTRY SentFrames;
|
||||
|
||||
LIST_ENTRY ArpQues;
|
||||
LIST_ENTRY SentFrames;
|
||||
|
||||
//
|
||||
// The interface's configuration variables
|
||||
//
|
||||
UINT32 DupAddrDetect;
|
||||
LIST_ENTRY DupAddrDetectList;
|
||||
LIST_ENTRY DelayJoinList;
|
||||
UINT32 DupAddrDetect;
|
||||
LIST_ENTRY DupAddrDetectList;
|
||||
LIST_ENTRY DelayJoinList;
|
||||
|
||||
//
|
||||
// All the IP instances that have the same IP/SubnetMask are linked
|
||||
// together through IpInstances. If any of the instance enables
|
||||
// promiscuous receive, PromiscRecv is true.
|
||||
//
|
||||
LIST_ENTRY IpInstances;
|
||||
BOOLEAN PromiscRecv;
|
||||
LIST_ENTRY IpInstances;
|
||||
BOOLEAN PromiscRecv;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -147,8 +145,8 @@ struct _IP6_INTERFACE {
|
||||
**/
|
||||
IP6_INTERFACE *
|
||||
Ip6CreateInterface (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN LinkLocal
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN LinkLocal
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -165,8 +163,8 @@ Ip6CreateInterface (
|
||||
**/
|
||||
VOID
|
||||
Ip6CleanInterface (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -178,7 +176,7 @@ Ip6CleanInterface (
|
||||
**/
|
||||
VOID
|
||||
Ip6FreeLinkTxToken (
|
||||
IN IP6_LINK_TX_TOKEN *Token
|
||||
IN IP6_LINK_TX_TOKEN *Token
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -191,8 +189,8 @@ Ip6FreeLinkTxToken (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6OnFrameReceived (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -208,8 +206,8 @@ Ip6OnFrameReceived (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ReceiveFrame (
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -234,12 +232,12 @@ Ip6ReceiveFrame (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SendFrame (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IPv6_ADDRESS *NextHop,
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN VOID *Context
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IPv6_ADDRESS *NextHop,
|
||||
IN IP6_FRAME_CALLBACK CallBack,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -254,8 +252,8 @@ Ip6SendFrame (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6TimerTicking (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -10,9 +10,9 @@
|
||||
|
||||
#include "Ip6Impl.h"
|
||||
|
||||
EFI_IPSEC2_PROTOCOL *mIpSec = NULL;
|
||||
EFI_IPSEC2_PROTOCOL *mIpSec = NULL;
|
||||
|
||||
EFI_IP6_PROTOCOL mEfiIp6ProtocolTemplete = {
|
||||
EFI_IP6_PROTOCOL mEfiIp6ProtocolTemplete = {
|
||||
EfiIp6GetModeData,
|
||||
EfiIp6Configure,
|
||||
EfiIp6Groups,
|
||||
@@ -44,18 +44,18 @@ EFI_IP6_PROTOCOL mEfiIp6ProtocolTemplete = {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6GetModeData (
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL,
|
||||
OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
|
||||
OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL,
|
||||
OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
|
||||
OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_INTERFACE *IpIf;
|
||||
EFI_IP6_CONFIG_DATA *Config;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_INTERFACE *IpIf;
|
||||
EFI_IP6_CONFIG_DATA *Config;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if (This == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -75,25 +75,25 @@ EfiIp6GetModeData (
|
||||
// IsStarted is "whether the EfiIp6Configure has been called".
|
||||
// IsConfigured is "whether the station address has been configured"
|
||||
//
|
||||
Ip6ModeData->IsStarted = (BOOLEAN) (IpInstance->State == IP6_STATE_CONFIGED);
|
||||
Ip6ModeData->IsStarted = (BOOLEAN)(IpInstance->State == IP6_STATE_CONFIGED);
|
||||
Ip6ModeData->MaxPacketSize = IpSb->MaxPacketSize;
|
||||
CopyMem (&Ip6ModeData->ConfigData, &IpInstance->ConfigData, sizeof (EFI_IP6_CONFIG_DATA));
|
||||
Ip6ModeData->IsConfigured = FALSE;
|
||||
Ip6ModeData->IsConfigured = FALSE;
|
||||
|
||||
Ip6ModeData->AddressCount = 0;
|
||||
Ip6ModeData->AddressList = NULL;
|
||||
Ip6ModeData->AddressCount = 0;
|
||||
Ip6ModeData->AddressList = NULL;
|
||||
|
||||
Ip6ModeData->GroupCount = IpInstance->GroupCount;
|
||||
Ip6ModeData->GroupTable = NULL;
|
||||
Ip6ModeData->GroupCount = IpInstance->GroupCount;
|
||||
Ip6ModeData->GroupTable = NULL;
|
||||
|
||||
Ip6ModeData->RouteCount = 0;
|
||||
Ip6ModeData->RouteTable = NULL;
|
||||
Ip6ModeData->RouteCount = 0;
|
||||
Ip6ModeData->RouteTable = NULL;
|
||||
|
||||
Ip6ModeData->NeighborCount = 0;
|
||||
Ip6ModeData->NeighborCache = NULL;
|
||||
|
||||
Ip6ModeData->PrefixCount = 0;
|
||||
Ip6ModeData->PrefixTable = NULL;
|
||||
Ip6ModeData->PrefixCount = 0;
|
||||
Ip6ModeData->PrefixTable = NULL;
|
||||
|
||||
Ip6ModeData->IcmpTypeCount = 23;
|
||||
Ip6ModeData->IcmpTypeList = AllocateCopyPool (
|
||||
@@ -160,6 +160,7 @@ EfiIp6GetModeData (
|
||||
goto Error;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Return the neighbor cache entries
|
||||
//
|
||||
@@ -183,7 +184,6 @@ EfiIp6GetModeData (
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -242,15 +242,16 @@ Exit:
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsValidAddress (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Ip,
|
||||
IN BOOLEAN Flag
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Ip,
|
||||
IN BOOLEAN Flag
|
||||
)
|
||||
{
|
||||
if (!NetIp6IsUnspecifiedAddr (Ip)) {
|
||||
if (!NetIp6IsValidUnicast(Ip)) {
|
||||
if (!NetIp6IsValidUnicast (Ip)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (Ip6IsOneOfSetAddress (IpSb, Ip, NULL, NULL)) {
|
||||
return Flag;
|
||||
}
|
||||
@@ -273,14 +274,14 @@ Ip6IsValidAddress (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsIllegalProtocol (
|
||||
IN UINT8 Protocol
|
||||
IN UINT8 Protocol
|
||||
)
|
||||
{
|
||||
if (Protocol == IP6_HOP_BY_HOP || Protocol == EFI_IP_PROTO_ICMP || Protocol == IP4_PROTO_IGMP) {
|
||||
if ((Protocol == IP6_HOP_BY_HOP) || (Protocol == EFI_IP_PROTO_ICMP) || (Protocol == IP4_PROTO_IGMP)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (Protocol == 41 || Protocol == 43 || Protocol == 44 || Protocol == 59 || Protocol == 60 || Protocol == 124) {
|
||||
if ((Protocol == 41) || (Protocol == 43) || (Protocol == 44) || (Protocol == 59) || (Protocol == 60) || (Protocol == 124)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -296,8 +297,8 @@ Ip6IsIllegalProtocol (
|
||||
**/
|
||||
VOID
|
||||
Ip6InitProtocol (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN OUT IP6_PROTOCOL *IpInstance
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN OUT IP6_PROTOCOL *IpInstance
|
||||
)
|
||||
{
|
||||
ASSERT ((IpSb != NULL) && (IpInstance != NULL));
|
||||
@@ -310,8 +311,8 @@ Ip6InitProtocol (
|
||||
IpInstance->GroupList = NULL;
|
||||
CopyMem (&IpInstance->Ip6Proto, &mEfiIp6ProtocolTemplete, sizeof (EFI_IP6_PROTOCOL));
|
||||
|
||||
NetMapInit (&IpInstance->RxTokens);
|
||||
NetMapInit (&IpInstance->TxTokens);
|
||||
NetMapInit (&IpInstance->RxTokens);
|
||||
NetMapInit (&IpInstance->TxTokens);
|
||||
InitializeListHead (&IpInstance->Received);
|
||||
InitializeListHead (&IpInstance->Delivered);
|
||||
|
||||
@@ -340,19 +341,19 @@ Ip6InitProtocol (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ConfigProtocol (
|
||||
IN OUT IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_CONFIG_DATA *Config
|
||||
IN OUT IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_CONFIG_DATA *Config
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_INTERFACE *IpIf;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_CONFIG_DATA *Current;
|
||||
IP6_ADDRESS_INFO *AddressInfo;
|
||||
BOOLEAN StationZero;
|
||||
BOOLEAN DestZero;
|
||||
EFI_IPv6_ADDRESS Source;
|
||||
BOOLEAN AddrOk;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_INTERFACE *IpIf;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_CONFIG_DATA *Current;
|
||||
IP6_ADDRESS_INFO *AddressInfo;
|
||||
BOOLEAN StationZero;
|
||||
BOOLEAN DestZero;
|
||||
EFI_IPv6_ADDRESS Source;
|
||||
BOOLEAN AddrOk;
|
||||
|
||||
IpSb = IpInstance->Service;
|
||||
Current = &IpInstance->ConfigData;
|
||||
@@ -419,7 +420,6 @@ Ip6ConfigProtocol (
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
NET_GET_REF (IpIf);
|
||||
IpInstance->Interface = IpIf;
|
||||
InsertTailList (&IpIf->IpInstances, &IpInstance->AddrLink);
|
||||
@@ -442,7 +442,7 @@ Ip6ConfigProtocol (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6CleanProtocol (
|
||||
IN OUT IP6_PROTOCOL *IpInstance
|
||||
IN OUT IP6_PROTOCOL *IpInstance
|
||||
)
|
||||
{
|
||||
if (EFI_ERROR (Ip6Cancel (IpInstance, NULL))) {
|
||||
@@ -459,7 +459,6 @@ Ip6CleanProtocol (
|
||||
// hasn't been called. Just leave it alone.
|
||||
//
|
||||
if (!IsListEmpty (&IpInstance->Delivered)) {
|
||||
;
|
||||
}
|
||||
|
||||
if (IpInstance->Interface != NULL) {
|
||||
@@ -470,8 +469,8 @@ Ip6CleanProtocol (
|
||||
|
||||
if (IpInstance->GroupList != NULL) {
|
||||
FreePool (IpInstance->GroupList);
|
||||
IpInstance->GroupList = NULL;
|
||||
IpInstance->GroupCount = 0;
|
||||
IpInstance->GroupList = NULL;
|
||||
IpInstance->GroupCount = 0;
|
||||
}
|
||||
|
||||
NetMapClean (&IpInstance->TxTokens);
|
||||
@@ -501,17 +500,17 @@ Ip6CleanProtocol (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ServiceConfigMnp (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN Force
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN Force
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *ProtoEntry;
|
||||
IP6_INTERFACE *IpIf;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
BOOLEAN Reconfig;
|
||||
BOOLEAN PromiscReceive;
|
||||
EFI_STATUS Status;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *ProtoEntry;
|
||||
IP6_INTERFACE *IpIf;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
BOOLEAN Reconfig;
|
||||
BOOLEAN PromiscReceive;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Reconfig = FALSE;
|
||||
PromiscReceive = FALSE;
|
||||
@@ -523,7 +522,6 @@ Ip6ServiceConfigMnp (
|
||||
// filter also.
|
||||
//
|
||||
NET_LIST_FOR_EACH (Entry, &IpSb->Interfaces) {
|
||||
|
||||
IpIf = NET_LIST_USER_STRUCT (Entry, IP6_INTERFACE, Link);
|
||||
IpIf->PromiscRecv = FALSE;
|
||||
|
||||
@@ -544,7 +542,7 @@ Ip6ServiceConfigMnp (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
Reconfig = TRUE;
|
||||
Reconfig = TRUE;
|
||||
IpSb->MnpConfigData.EnablePromiscuousReceive = PromiscReceive;
|
||||
}
|
||||
|
||||
@@ -610,15 +608,15 @@ Ip6ServiceConfigMnp (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6Configure (
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_IP6_CONFIG_DATA *Current;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_IP6_CONFIG_DATA *Current;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
//
|
||||
// First, validate the parameters
|
||||
@@ -630,13 +628,13 @@ EfiIp6Configure (
|
||||
IpInstance = IP6_INSTANCE_FROM_PROTOCOL (This);
|
||||
IpSb = IpInstance->Service;
|
||||
|
||||
if (IpSb->LinkLocalDadFail && Ip6ConfigData != NULL) {
|
||||
if (IpSb->LinkLocalDadFail && (Ip6ConfigData != NULL)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
|
||||
//
|
||||
// Validate the configuration first.
|
||||
@@ -646,8 +644,9 @@ EfiIp6Configure (
|
||||
// Check whether the station address is valid.
|
||||
//
|
||||
if (!Ip6IsValidAddress (IpSb, &Ip6ConfigData->StationAddress, TRUE)) {
|
||||
goto Exit;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
//
|
||||
// Check whether the default protocol is valid.
|
||||
//
|
||||
@@ -744,16 +743,16 @@ EfiIp6Groups (
|
||||
IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
if ((This == NULL) || (JoinFlag && GroupAddress == NULL)) {
|
||||
if ((This == NULL) || (JoinFlag && (GroupAddress == NULL))) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (GroupAddress != NULL && !IP6_IS_MULTICAST (GroupAddress)) {
|
||||
if ((GroupAddress != NULL) && !IP6_IS_MULTICAST (GroupAddress)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -764,7 +763,7 @@ EfiIp6Groups (
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
|
||||
if (IpInstance->State != IP6_STATE_CONFIGED) {
|
||||
Status = EFI_NOT_STARTED;
|
||||
@@ -824,17 +823,17 @@ ON_EXIT:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6Routes (
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN BOOLEAN DeleteRoute,
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN BOOLEAN DeleteRoute,
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
if ((This == NULL) || (PrefixLength > IP6_PREFIX_MAX)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -855,7 +854,7 @@ EfiIp6Routes (
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (!DeleteRoute && (Destination == NULL || GatewayAddress == NULL)) {
|
||||
if (!DeleteRoute && ((Destination == NULL) || (GatewayAddress == NULL))) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -866,7 +865,8 @@ EfiIp6Routes (
|
||||
|
||||
if (!NetIp6IsUnspecifiedAddr (GatewayAddress) &&
|
||||
!NetIp6IsNetEqual (GatewayAddress, &IpInstance->ConfigData.StationAddress, PrefixLength)
|
||||
) {
|
||||
)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
@@ -935,20 +935,20 @@ EfiIp6Routes (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6Neighbors (
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN BOOLEAN DeleteFlag,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||
IN UINT32 Timeout,
|
||||
IN BOOLEAN Override
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN BOOLEAN DeleteFlag,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||
IN UINT32 Timeout,
|
||||
IN BOOLEAN Override
|
||||
)
|
||||
{
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
if (This == NULL || TargetIp6Address == NULL) {
|
||||
if ((This == NULL) || (TargetIp6Address == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -1011,18 +1011,18 @@ Exit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6TokenExist (
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Context
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_IP6_COMPLETION_TOKEN *Token;
|
||||
EFI_IP6_COMPLETION_TOKEN *TokenInItem;
|
||||
|
||||
Token = (EFI_IP6_COMPLETION_TOKEN *) Context;
|
||||
TokenInItem = (EFI_IP6_COMPLETION_TOKEN *) Item->Key;
|
||||
Token = (EFI_IP6_COMPLETION_TOKEN *)Context;
|
||||
TokenInItem = (EFI_IP6_COMPLETION_TOKEN *)Item->Key;
|
||||
|
||||
if (Token == TokenInItem || Token->Event == TokenInItem->Event) {
|
||||
if ((Token == TokenInItem) || (Token->Event == TokenInItem->Event)) {
|
||||
return EFI_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
@@ -1041,29 +1041,29 @@ Ip6TokenExist (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6TxTokenValid (
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token
|
||||
)
|
||||
{
|
||||
EFI_IP6_TRANSMIT_DATA *TxData;
|
||||
UINT32 Index;
|
||||
UINT32 DataLength;
|
||||
EFI_IP6_TRANSMIT_DATA *TxData;
|
||||
UINT32 Index;
|
||||
UINT32 DataLength;
|
||||
|
||||
if (Token == NULL || Token->Event == NULL) {
|
||||
if ((Token == NULL) || (Token->Event == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
TxData = Token->Packet.TxData;
|
||||
|
||||
if (TxData == NULL || (TxData->ExtHdrsLength != 0 && TxData->ExtHdrs == NULL)) {
|
||||
if ((TxData == NULL) || ((TxData->ExtHdrsLength != 0) && (TxData->ExtHdrs == NULL))) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (TxData->FragmentCount == 0 || TxData->DataLength == 0) {
|
||||
if ((TxData->FragmentCount == 0) || (TxData->DataLength == 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
for (DataLength = 0, Index = 0; Index < TxData->FragmentCount; Index++) {
|
||||
if (TxData->FragmentTable[Index].FragmentLength == 0 || TxData->FragmentTable[Index].FragmentBuffer == NULL) {
|
||||
if ((TxData->FragmentTable[Index].FragmentLength == 0) || (TxData->FragmentTable[Index].FragmentBuffer == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -1115,13 +1115,13 @@ Ip6TxTokenValid (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6FreeTxToken (
|
||||
IN VOID *Context
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
NET_MAP_ITEM *Item;
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
NET_MAP_ITEM *Item;
|
||||
|
||||
Wrap = (IP6_TXTOKEN_WRAP *) Context;
|
||||
Wrap = (IP6_TXTOKEN_WRAP *)Context;
|
||||
|
||||
//
|
||||
// Signal IpSecRecycleEvent to inform IPsec free the memory
|
||||
@@ -1152,7 +1152,6 @@ Ip6FreeTxToken (
|
||||
FreePool (Wrap);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
The callback function to Ip6Output to update the transmit status.
|
||||
|
||||
@@ -1164,19 +1163,19 @@ Ip6FreeTxToken (
|
||||
**/
|
||||
VOID
|
||||
Ip6OnPacketSent (
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN UINT32 Flag,
|
||||
IN VOID *Context
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN UINT32 Flag,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
|
||||
//
|
||||
// This is the transmission request from upper layer,
|
||||
// not the IP6 driver itself.
|
||||
//
|
||||
Wrap = (IP6_TXTOKEN_WRAP *) Context;
|
||||
Wrap = (IP6_TXTOKEN_WRAP *)Context;
|
||||
Wrap->Token->Status = IoStatus;
|
||||
|
||||
NetbufFree (Wrap->Packet);
|
||||
@@ -1241,16 +1240,16 @@ EfiIp6Transmit (
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_IP6_CONFIG_DATA *Config;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_IP6_HEADER Head;
|
||||
EFI_IP6_TRANSMIT_DATA *TxData;
|
||||
EFI_IP6_OVERRIDE_DATA *Override;
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
UINT8 *ExtHdrs;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_IP6_CONFIG_DATA *Config;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_IP6_HEADER Head;
|
||||
EFI_IP6_TRANSMIT_DATA *TxData;
|
||||
EFI_IP6_OVERRIDE_DATA *Override;
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
UINT8 *ExtHdrs;
|
||||
|
||||
//
|
||||
// Check input parameters.
|
||||
@@ -1273,7 +1272,7 @@ EfiIp6Transmit (
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
|
||||
if (IpInstance->State != IP6_STATE_CONFIGED) {
|
||||
Status = EFI_NOT_STARTED;
|
||||
@@ -1293,7 +1292,7 @@ EfiIp6Transmit (
|
||||
//
|
||||
// Build the IP header, fill in the information from ConfigData or OverrideData
|
||||
//
|
||||
ZeroMem (&Head, sizeof(EFI_IP6_HEADER));
|
||||
ZeroMem (&Head, sizeof (EFI_IP6_HEADER));
|
||||
TxData = Token->Packet.TxData;
|
||||
IP6_COPY_ADDRESS (&Head.SourceAddress, &Config->StationAddress);
|
||||
IP6_COPY_ADDRESS (&Head.DestinationAddress, &Config->DestinationAddress);
|
||||
@@ -1306,7 +1305,6 @@ EfiIp6Transmit (
|
||||
}
|
||||
|
||||
ASSERT (!NetIp6IsUnspecifiedAddr (&Config->StationAddress));
|
||||
|
||||
} else {
|
||||
//
|
||||
// StationAddress is unspecified only when ConfigData.Dest is unspecified.
|
||||
@@ -1342,15 +1340,15 @@ EfiIp6Transmit (
|
||||
Override = TxData->OverrideData;
|
||||
Head.NextHeader = Override->Protocol;
|
||||
Head.HopLimit = Override->HopLimit;
|
||||
Head.FlowLabelL = HTONS ((UINT16) Override->FlowLabel);
|
||||
Head.FlowLabelH = (UINT8) ((Override->FlowLabel >> 16) & 0x0F);
|
||||
Head.FlowLabelL = HTONS ((UINT16)Override->FlowLabel);
|
||||
Head.FlowLabelH = (UINT8)((Override->FlowLabel >> 16) & 0x0F);
|
||||
} else {
|
||||
Head.HopLimit = Config->HopLimit;
|
||||
Head.FlowLabelL = HTONS ((UINT16) Config->FlowLabel);
|
||||
Head.FlowLabelH = (UINT8) ((Config->FlowLabel >> 16) & 0x0F);
|
||||
Head.FlowLabelL = HTONS ((UINT16)Config->FlowLabel);
|
||||
Head.FlowLabelH = (UINT8)((Config->FlowLabel >> 16) & 0x0F);
|
||||
}
|
||||
|
||||
Head.PayloadLength = HTONS ((UINT16) (TxData->ExtHdrsLength + TxData->DataLength));
|
||||
Head.PayloadLength = HTONS ((UINT16)(TxData->ExtHdrsLength + TxData->DataLength));
|
||||
|
||||
//
|
||||
// OK, it survives all the validation check. Wrap the token in
|
||||
@@ -1362,18 +1360,18 @@ EfiIp6Transmit (
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Wrap->IpInstance = IpInstance;
|
||||
Wrap->Token = Token;
|
||||
Wrap->Sent = FALSE;
|
||||
Wrap->Life = IP6_US_TO_SEC (Config->TransmitTimeout);
|
||||
Wrap->Packet = NetbufFromExt (
|
||||
(NET_FRAGMENT *) TxData->FragmentTable,
|
||||
TxData->FragmentCount,
|
||||
IP6_MAX_HEADLEN,
|
||||
0,
|
||||
Ip6FreeTxToken,
|
||||
Wrap
|
||||
);
|
||||
Wrap->IpInstance = IpInstance;
|
||||
Wrap->Token = Token;
|
||||
Wrap->Sent = FALSE;
|
||||
Wrap->Life = IP6_US_TO_SEC (Config->TransmitTimeout);
|
||||
Wrap->Packet = NetbufFromExt (
|
||||
(NET_FRAGMENT *)TxData->FragmentTable,
|
||||
TxData->FragmentCount,
|
||||
IP6_MAX_HEADLEN,
|
||||
0,
|
||||
Ip6FreeTxToken,
|
||||
Wrap
|
||||
);
|
||||
|
||||
if (Wrap->Packet == NULL) {
|
||||
FreePool (Wrap);
|
||||
@@ -1397,8 +1395,8 @@ EfiIp6Transmit (
|
||||
// Allocate a new buffer to store IPv6 extension headers to avoid updating
|
||||
// the original data in EFI_IP6_COMPLETION_TOKEN.
|
||||
//
|
||||
if (TxData->ExtHdrsLength != 0 && TxData->ExtHdrs != NULL) {
|
||||
ExtHdrs = (UINT8 *) AllocateCopyPool (TxData->ExtHdrsLength, TxData->ExtHdrs);
|
||||
if ((TxData->ExtHdrsLength != 0) && (TxData->ExtHdrs != NULL)) {
|
||||
ExtHdrs = (UINT8 *)AllocateCopyPool (TxData->ExtHdrsLength, TxData->ExtHdrs);
|
||||
if (ExtHdrs == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Exit;
|
||||
@@ -1485,12 +1483,12 @@ EfiIp6Receive (
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
if (This == NULL || Token == NULL || Token->Event == NULL) {
|
||||
if ((This == NULL) || (Token == NULL) || (Token->Event == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -1540,7 +1538,6 @@ Exit:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Cancel the transmitted but not recycled packet. If a matching
|
||||
token is found, it will call Ip6CancelPacket to cancel the
|
||||
@@ -1561,15 +1558,15 @@ Exit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6CancelTxTokens (
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Context
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_IP6_COMPLETION_TOKEN *Token;
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
|
||||
Token = (EFI_IP6_COMPLETION_TOKEN *) Context;
|
||||
Token = (EFI_IP6_COMPLETION_TOKEN *)Context;
|
||||
|
||||
//
|
||||
// Return EFI_SUCCESS to check the next item in the map if
|
||||
@@ -1579,7 +1576,7 @@ Ip6CancelTxTokens (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
Wrap = (IP6_TXTOKEN_WRAP *) Item->Value;
|
||||
Wrap = (IP6_TXTOKEN_WRAP *)Item->Value;
|
||||
ASSERT (Wrap != NULL);
|
||||
|
||||
//
|
||||
@@ -1599,7 +1596,6 @@ Ip6CancelTxTokens (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Cancel the receive request. This is simple, because
|
||||
it is only enqueued in our local receive map.
|
||||
@@ -1618,15 +1614,15 @@ Ip6CancelTxTokens (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6CancelRxTokens (
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Context
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_IP6_COMPLETION_TOKEN *Token;
|
||||
EFI_IP6_COMPLETION_TOKEN *This;
|
||||
|
||||
Token = (EFI_IP6_COMPLETION_TOKEN *) Context;
|
||||
Token = (EFI_IP6_COMPLETION_TOKEN *)Context;
|
||||
This = Item->Key;
|
||||
|
||||
if ((Token != NULL) && (Token != This)) {
|
||||
@@ -1662,11 +1658,11 @@ Ip6CancelRxTokens (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6Cancel (
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// First check the transmitted packet. Ip6CancelTxTokens returns
|
||||
@@ -1713,7 +1709,6 @@ Ip6Cancel (
|
||||
// all of them are cancelled.
|
||||
//
|
||||
if (!NetMapIsEmpty (&IpInstance->TxTokens) || !NetMapIsEmpty (&IpInstance->RxTokens)) {
|
||||
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
@@ -1755,9 +1750,9 @@ EfiIp6Cancel (
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if (This == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -1807,7 +1802,7 @@ Exit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6Poll (
|
||||
IN EFI_IP6_PROTOCOL *This
|
||||
IN EFI_IP6_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
@@ -1836,6 +1831,4 @@ EfiIp6Poll (
|
||||
// the packet polled up.
|
||||
//
|
||||
return Mnp->Poll (Mnp);
|
||||
|
||||
}
|
||||
|
||||
|
@@ -54,8 +54,8 @@
|
||||
#include "Ip6ConfigNv.h"
|
||||
#include "Ip6ConfigImpl.h"
|
||||
|
||||
#define IP6_PROTOCOL_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'P')
|
||||
#define IP6_SERVICE_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'S')
|
||||
#define IP6_PROTOCOL_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'P')
|
||||
#define IP6_SERVICE_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'S')
|
||||
|
||||
//
|
||||
// The state of IP6 protocol. It starts from UNCONFIGED. if it is
|
||||
@@ -63,8 +63,8 @@
|
||||
// is called, it becomes UNCONFIGED again. If (partly) destroyed, it
|
||||
// becomes DESTROY.
|
||||
//
|
||||
#define IP6_STATE_UNCONFIGED 0
|
||||
#define IP6_STATE_CONFIGED 1
|
||||
#define IP6_STATE_UNCONFIGED 0
|
||||
#define IP6_STATE_CONFIGED 1
|
||||
|
||||
//
|
||||
// The state of IP6 service. It starts from UNSTARTED. It transits
|
||||
@@ -83,10 +83,10 @@
|
||||
#define IP6_SERVICE_FROM_PROTOCOL(Sb) \
|
||||
CR ((Sb), IP6_SERVICE, ServiceBinding, IP6_SERVICE_SIGNATURE)
|
||||
|
||||
#define IP6_NO_MAPPING(IpInstance) (!(IpInstance)->Interface->Configured)
|
||||
#define IP6_NO_MAPPING(IpInstance) (!(IpInstance)->Interface->Configured)
|
||||
|
||||
extern EFI_IPSEC2_PROTOCOL *mIpSec;
|
||||
extern BOOLEAN mIpSec2Installed;
|
||||
extern EFI_IPSEC2_PROTOCOL *mIpSec;
|
||||
extern BOOLEAN mIpSec2Installed;
|
||||
|
||||
//
|
||||
// IP6_TXTOKEN_WRAP wraps the upper layer's transmit token.
|
||||
@@ -98,17 +98,17 @@ extern BOOLEAN mIpSec2Installed;
|
||||
// user's event signalled.
|
||||
//
|
||||
typedef struct {
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_IP6_COMPLETION_TOKEN *Token;
|
||||
EFI_EVENT IpSecRecycleSignal;
|
||||
NET_BUF *Packet;
|
||||
BOOLEAN Sent;
|
||||
INTN Life;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
EFI_IP6_COMPLETION_TOKEN *Token;
|
||||
EFI_EVENT IpSecRecycleSignal;
|
||||
NET_BUF *Packet;
|
||||
BOOLEAN Sent;
|
||||
INTN Life;
|
||||
} IP6_TXTOKEN_WRAP;
|
||||
|
||||
typedef struct {
|
||||
EFI_EVENT IpSecRecycleSignal;
|
||||
NET_BUF *Packet;
|
||||
EFI_EVENT IpSecRecycleSignal;
|
||||
NET_BUF *Packet;
|
||||
} IP6_IPSEC_WRAP;
|
||||
|
||||
//
|
||||
@@ -121,123 +121,123 @@ typedef struct {
|
||||
// fragments will be freed at last.
|
||||
//
|
||||
typedef struct {
|
||||
LIST_ENTRY Link;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
NET_BUF *Packet;
|
||||
EFI_IP6_RECEIVE_DATA RxData;
|
||||
LIST_ENTRY Link;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
NET_BUF *Packet;
|
||||
EFI_IP6_RECEIVE_DATA RxData;
|
||||
} IP6_RXDATA_WRAP;
|
||||
|
||||
struct _IP6_PROTOCOL {
|
||||
UINT32 Signature;
|
||||
UINT32 Signature;
|
||||
|
||||
EFI_IP6_PROTOCOL Ip6Proto;
|
||||
EFI_HANDLE Handle;
|
||||
INTN State;
|
||||
EFI_IP6_PROTOCOL Ip6Proto;
|
||||
EFI_HANDLE Handle;
|
||||
INTN State;
|
||||
|
||||
IP6_SERVICE *Service;
|
||||
LIST_ENTRY Link; // Link to all the IP protocol from the service
|
||||
IP6_SERVICE *Service;
|
||||
LIST_ENTRY Link; // Link to all the IP protocol from the service
|
||||
|
||||
UINT8 PrefixLength; // PrefixLength of the configured station address.
|
||||
UINT8 PrefixLength; // PrefixLength of the configured station address.
|
||||
//
|
||||
// User's transmit/receive tokens, and received/delivered packets
|
||||
//
|
||||
NET_MAP RxTokens;
|
||||
NET_MAP TxTokens; // map between (User's Token, IP6_TXTOKE_WRAP)
|
||||
LIST_ENTRY Received; // Received but not delivered packet
|
||||
LIST_ENTRY Delivered; // Delivered and to be recycled packets
|
||||
EFI_LOCK RecycleLock;
|
||||
NET_MAP RxTokens;
|
||||
NET_MAP TxTokens; // map between (User's Token, IP6_TXTOKE_WRAP)
|
||||
LIST_ENTRY Received; // Received but not delivered packet
|
||||
LIST_ENTRY Delivered; // Delivered and to be recycled packets
|
||||
EFI_LOCK RecycleLock;
|
||||
|
||||
IP6_INTERFACE *Interface;
|
||||
LIST_ENTRY AddrLink; // Ip instances with the same IP address.
|
||||
IP6_INTERFACE *Interface;
|
||||
LIST_ENTRY AddrLink; // Ip instances with the same IP address.
|
||||
|
||||
EFI_IPv6_ADDRESS *GroupList; // stored in network order.
|
||||
UINT32 GroupCount;
|
||||
EFI_IPv6_ADDRESS *GroupList; // stored in network order.
|
||||
UINT32 GroupCount;
|
||||
|
||||
EFI_IP6_CONFIG_DATA ConfigData;
|
||||
BOOLEAN InDestroy;
|
||||
EFI_IP6_CONFIG_DATA ConfigData;
|
||||
BOOLEAN InDestroy;
|
||||
};
|
||||
|
||||
struct _IP6_SERVICE {
|
||||
UINT32 Signature;
|
||||
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
||||
INTN State;
|
||||
UINT32 Signature;
|
||||
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
||||
INTN State;
|
||||
|
||||
//
|
||||
// List of all the IP instances and interfaces, and default
|
||||
// interface and route table and caches.
|
||||
//
|
||||
UINTN NumChildren;
|
||||
LIST_ENTRY Children;
|
||||
UINTN NumChildren;
|
||||
LIST_ENTRY Children;
|
||||
|
||||
LIST_ENTRY Interfaces;
|
||||
LIST_ENTRY Interfaces;
|
||||
|
||||
IP6_INTERFACE *DefaultInterface;
|
||||
IP6_ROUTE_TABLE *RouteTable;
|
||||
IP6_INTERFACE *DefaultInterface;
|
||||
IP6_ROUTE_TABLE *RouteTable;
|
||||
|
||||
IP6_LINK_RX_TOKEN RecvRequest;
|
||||
IP6_LINK_RX_TOKEN RecvRequest;
|
||||
|
||||
//
|
||||
// Ip reassemble utilities and MLD data
|
||||
//
|
||||
IP6_ASSEMBLE_TABLE Assemble;
|
||||
IP6_MLD_SERVICE_DATA MldCtrl;
|
||||
IP6_ASSEMBLE_TABLE Assemble;
|
||||
IP6_MLD_SERVICE_DATA MldCtrl;
|
||||
|
||||
EFI_IPv6_ADDRESS LinkLocalAddr;
|
||||
BOOLEAN LinkLocalOk;
|
||||
BOOLEAN LinkLocalDadFail;
|
||||
BOOLEAN Dhcp6NeedStart;
|
||||
BOOLEAN Dhcp6NeedInfoRequest;
|
||||
EFI_IPv6_ADDRESS LinkLocalAddr;
|
||||
BOOLEAN LinkLocalOk;
|
||||
BOOLEAN LinkLocalDadFail;
|
||||
BOOLEAN Dhcp6NeedStart;
|
||||
BOOLEAN Dhcp6NeedInfoRequest;
|
||||
|
||||
//
|
||||
// ND data
|
||||
//
|
||||
UINT8 CurHopLimit;
|
||||
UINT32 LinkMTU;
|
||||
UINT32 BaseReachableTime;
|
||||
UINT32 ReachableTime;
|
||||
UINT32 RetransTimer;
|
||||
LIST_ENTRY NeighborTable;
|
||||
UINT8 CurHopLimit;
|
||||
UINT32 LinkMTU;
|
||||
UINT32 BaseReachableTime;
|
||||
UINT32 ReachableTime;
|
||||
UINT32 RetransTimer;
|
||||
LIST_ENTRY NeighborTable;
|
||||
|
||||
LIST_ENTRY OnlinkPrefix;
|
||||
LIST_ENTRY AutonomousPrefix;
|
||||
LIST_ENTRY OnlinkPrefix;
|
||||
LIST_ENTRY AutonomousPrefix;
|
||||
|
||||
LIST_ENTRY DefaultRouterList;
|
||||
UINT32 RoundRobin;
|
||||
LIST_ENTRY DefaultRouterList;
|
||||
UINT32 RoundRobin;
|
||||
|
||||
UINT8 InterfaceIdLen;
|
||||
UINT8 *InterfaceId;
|
||||
UINT8 InterfaceIdLen;
|
||||
UINT8 *InterfaceId;
|
||||
|
||||
BOOLEAN RouterAdvertiseReceived;
|
||||
UINT8 SolicitTimer;
|
||||
UINT32 Ticks;
|
||||
BOOLEAN RouterAdvertiseReceived;
|
||||
UINT8 SolicitTimer;
|
||||
UINT32 Ticks;
|
||||
|
||||
//
|
||||
// Low level protocol used by this service instance
|
||||
//
|
||||
EFI_HANDLE Image;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_HANDLE Image;
|
||||
EFI_HANDLE Controller;
|
||||
|
||||
EFI_HANDLE MnpChildHandle;
|
||||
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
|
||||
EFI_HANDLE MnpChildHandle;
|
||||
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
|
||||
|
||||
EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
|
||||
EFI_SIMPLE_NETWORK_MODE SnpMode;
|
||||
EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
|
||||
EFI_SIMPLE_NETWORK_MODE SnpMode;
|
||||
|
||||
EFI_EVENT Timer;
|
||||
EFI_EVENT FasterTimer;
|
||||
EFI_EVENT Timer;
|
||||
EFI_EVENT FasterTimer;
|
||||
|
||||
//
|
||||
// IPv6 Configuration Protocol instance
|
||||
//
|
||||
IP6_CONFIG_INSTANCE Ip6ConfigInstance;
|
||||
IP6_CONFIG_INSTANCE Ip6ConfigInstance;
|
||||
|
||||
//
|
||||
// The string representation of the current mac address of the
|
||||
// NIC this IP6_SERVICE works on.
|
||||
//
|
||||
CHAR16 *MacString;
|
||||
UINT32 MaxPacketSize;
|
||||
UINT32 OldMaxPacketSize;
|
||||
CHAR16 *MacString;
|
||||
UINT32 MaxPacketSize;
|
||||
UINT32 OldMaxPacketSize;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -264,7 +264,7 @@ struct _IP6_SERVICE {
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6FreeTxToken (
|
||||
IN VOID *Context
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -287,8 +287,8 @@ Ip6FreeTxToken (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ServiceConfigMnp (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN Force
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN Force
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -307,8 +307,8 @@ Ip6ServiceConfigMnp (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6Cancel (
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -320,8 +320,8 @@ Ip6Cancel (
|
||||
**/
|
||||
VOID
|
||||
Ip6InitProtocol (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN OUT IP6_PROTOCOL *IpInstance
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN OUT IP6_PROTOCOL *IpInstance
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -335,7 +335,7 @@ Ip6InitProtocol (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6CleanProtocol (
|
||||
IN OUT IP6_PROTOCOL *IpInstance
|
||||
IN OUT IP6_PROTOCOL *IpInstance
|
||||
);
|
||||
|
||||
//
|
||||
@@ -362,10 +362,10 @@ Ip6CleanProtocol (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6GetModeData (
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL,
|
||||
OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
|
||||
OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL,
|
||||
OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
|
||||
OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -418,8 +418,8 @@ EfiIp6GetModeData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6Configure (
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -507,11 +507,11 @@ EfiIp6Groups (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6Routes (
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN BOOLEAN DeleteRoute,
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN BOOLEAN DeleteRoute,
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -563,12 +563,12 @@ EfiIp6Routes (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6Neighbors (
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN BOOLEAN DeleteFlag,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||
IN UINT32 Timeout,
|
||||
IN BOOLEAN Override
|
||||
IN EFI_IP6_PROTOCOL *This,
|
||||
IN BOOLEAN DeleteFlag,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||
IN UINT32 Timeout,
|
||||
IN BOOLEAN Override
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -742,7 +742,7 @@ EfiIp6Cancel (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiIp6Poll (
|
||||
IN EFI_IP6_PROTOCOL *This
|
||||
IN EFI_IP6_PROTOCOL *This
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -24,12 +24,12 @@
|
||||
**/
|
||||
IP6_ASSEMBLE_ENTRY *
|
||||
Ip6CreateAssembleEntry (
|
||||
IN EFI_IPv6_ADDRESS *Dst,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN UINT32 Id
|
||||
IN EFI_IPv6_ADDRESS *Dst,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN UINT32 Id
|
||||
)
|
||||
{
|
||||
IP6_ASSEMBLE_ENTRY *Assemble;
|
||||
IP6_ASSEMBLE_ENTRY *Assemble;
|
||||
|
||||
Assemble = AllocatePool (sizeof (IP6_ASSEMBLE_ENTRY));
|
||||
if (Assemble == NULL) {
|
||||
@@ -40,8 +40,8 @@ Ip6CreateAssembleEntry (
|
||||
IP6_COPY_ADDRESS (&Assemble->Src, Src);
|
||||
InitializeListHead (&Assemble->Fragments);
|
||||
|
||||
Assemble->Id = Id;
|
||||
Assemble->Life = IP6_FRAGMENT_LIFE + 1;
|
||||
Assemble->Id = Id;
|
||||
Assemble->Life = IP6_FRAGMENT_LIFE + 1;
|
||||
|
||||
Assemble->TotalLen = 0;
|
||||
Assemble->CurLen = 0;
|
||||
@@ -60,12 +60,12 @@ Ip6CreateAssembleEntry (
|
||||
**/
|
||||
VOID
|
||||
Ip6FreeAssembleEntry (
|
||||
IN IP6_ASSEMBLE_ENTRY *Assemble
|
||||
IN IP6_ASSEMBLE_ENTRY *Assemble
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
NET_BUF *Fragment;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
NET_BUF *Fragment;
|
||||
|
||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &Assemble->Fragments) {
|
||||
Fragment = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
|
||||
@@ -92,10 +92,10 @@ Ip6FreeAssembleEntry (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6OnFreeFragments (
|
||||
IN VOID *Arg
|
||||
IN VOID *Arg
|
||||
)
|
||||
{
|
||||
Ip6FreeAssembleEntry ((IP6_ASSEMBLE_ENTRY *) Arg);
|
||||
Ip6FreeAssembleEntry ((IP6_ASSEMBLE_ENTRY *)Arg);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,33 +109,33 @@ Ip6OnFreeFragments (
|
||||
**/
|
||||
VOID
|
||||
Ip6TrimPacket (
|
||||
IN OUT NET_BUF *Packet,
|
||||
IN INTN Start,
|
||||
IN INTN End
|
||||
IN OUT NET_BUF *Packet,
|
||||
IN INTN Start,
|
||||
IN INTN End
|
||||
)
|
||||
{
|
||||
IP6_CLIP_INFO *Info;
|
||||
INTN Len;
|
||||
IP6_CLIP_INFO *Info;
|
||||
INTN Len;
|
||||
|
||||
Info = IP6_GET_CLIP_INFO (Packet);
|
||||
|
||||
ASSERT (Info->Start + Info->Length == Info->End);
|
||||
ASSERT ((Info->Start < End) && (Start < Info->End));
|
||||
|
||||
if (Info->Start < Start) {
|
||||
if (Info->Start < Start) {
|
||||
Len = Start - Info->Start;
|
||||
|
||||
NetbufTrim (Packet, (UINT32) Len, NET_BUF_HEAD);
|
||||
Info->Start = (UINT32) Start;
|
||||
Info->Length -= (UINT32) Len;
|
||||
NetbufTrim (Packet, (UINT32)Len, NET_BUF_HEAD);
|
||||
Info->Start = (UINT32)Start;
|
||||
Info->Length -= (UINT32)Len;
|
||||
}
|
||||
|
||||
if (End < Info->End) {
|
||||
Len = End - Info->End;
|
||||
|
||||
NetbufTrim (Packet, (UINT32) Len, NET_BUF_TAIL);
|
||||
Info->End = (UINT32) End;
|
||||
Info->Length -= (UINT32) Len;
|
||||
NetbufTrim (Packet, (UINT32)Len, NET_BUF_TAIL);
|
||||
Info->End = (UINT32)End;
|
||||
Info->Length -= (UINT32)Len;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,26 +156,26 @@ Ip6TrimPacket (
|
||||
**/
|
||||
NET_BUF *
|
||||
Ip6Reassemble (
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table,
|
||||
IN NET_BUF *Packet
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
EFI_IP6_HEADER *Head;
|
||||
IP6_CLIP_INFO *This;
|
||||
IP6_CLIP_INFO *Node;
|
||||
IP6_ASSEMBLE_ENTRY *Assemble;
|
||||
IP6_ASSEMBLE_ENTRY *Entry;
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *Prev;
|
||||
LIST_ENTRY *Cur;
|
||||
NET_BUF *Fragment;
|
||||
NET_BUF *TmpPacket;
|
||||
NET_BUF *NewPacket;
|
||||
NET_BUF *Duplicate;
|
||||
UINT8 *DupHead;
|
||||
INTN Index;
|
||||
UINT16 UnFragmentLen;
|
||||
UINT8 *NextHeader;
|
||||
EFI_IP6_HEADER *Head;
|
||||
IP6_CLIP_INFO *This;
|
||||
IP6_CLIP_INFO *Node;
|
||||
IP6_ASSEMBLE_ENTRY *Assemble;
|
||||
IP6_ASSEMBLE_ENTRY *Entry;
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *Prev;
|
||||
LIST_ENTRY *Cur;
|
||||
NET_BUF *Fragment;
|
||||
NET_BUF *TmpPacket;
|
||||
NET_BUF *NewPacket;
|
||||
NET_BUF *Duplicate;
|
||||
UINT8 *DupHead;
|
||||
INTN Index;
|
||||
UINT16 UnFragmentLen;
|
||||
UINT8 *NextHeader;
|
||||
|
||||
Head = Packet->Ip.Ip6;
|
||||
This = IP6_GET_CLIP_INFO (Packet);
|
||||
@@ -185,16 +185,17 @@ Ip6Reassemble (
|
||||
//
|
||||
// Find the corresponding assemble entry by (Dst, Src, Id)
|
||||
//
|
||||
Assemble = NULL;
|
||||
Index = IP6_ASSEMBLE_HASH (&Head->DestinationAddress, &Head->SourceAddress, This->Id);
|
||||
Assemble = NULL;
|
||||
Index = IP6_ASSEMBLE_HASH (&Head->DestinationAddress, &Head->SourceAddress, This->Id);
|
||||
|
||||
NET_LIST_FOR_EACH (Cur, &Table->Bucket[Index]) {
|
||||
Entry = NET_LIST_USER_STRUCT (Cur, IP6_ASSEMBLE_ENTRY, Link);
|
||||
|
||||
if (Entry->Id == This->Id &&
|
||||
if ((Entry->Id == This->Id) &&
|
||||
EFI_IP6_EQUAL (&Entry->Src, &Head->SourceAddress) &&
|
||||
EFI_IP6_EQUAL (&Entry->Dst, &Head->DestinationAddress)
|
||||
) {
|
||||
)
|
||||
{
|
||||
Assemble = Entry;
|
||||
break;
|
||||
}
|
||||
@@ -239,8 +240,8 @@ Ip6Reassemble (
|
||||
// overlaps, trim the overlapped part off THIS fragment.
|
||||
//
|
||||
if ((Prev = Cur->BackLink) != ListHead) {
|
||||
Fragment = NET_LIST_USER_STRUCT (Prev, NET_BUF, List);
|
||||
Node = IP6_GET_CLIP_INFO (Fragment);
|
||||
Fragment = NET_LIST_USER_STRUCT (Prev, NET_BUF, List);
|
||||
Node = IP6_GET_CLIP_INFO (Fragment);
|
||||
|
||||
if (This->Start < Node->End) {
|
||||
if (This->End <= Node->End) {
|
||||
@@ -331,13 +332,13 @@ Ip6Reassemble (
|
||||
//
|
||||
DupHead = NetbufGetByte (Duplicate, 0, NULL);
|
||||
ASSERT (DupHead != NULL);
|
||||
Duplicate->Ip.Ip6 = Ip6NtohHead ((EFI_IP6_HEADER *) DupHead);
|
||||
Duplicate->Ip.Ip6 = Ip6NtohHead ((EFI_IP6_HEADER *)DupHead);
|
||||
Assemble->Packet = Duplicate;
|
||||
|
||||
//
|
||||
// Adjust the unfragmentable part in first fragment
|
||||
//
|
||||
UnFragmentLen = (UINT16) (This->HeadLen - sizeof (EFI_IP6_HEADER));
|
||||
UnFragmentLen = (UINT16)(This->HeadLen - sizeof (EFI_IP6_HEADER));
|
||||
if (UnFragmentLen == 0) {
|
||||
//
|
||||
// There is not any unfragmentable extension header.
|
||||
@@ -376,7 +377,6 @@ Ip6Reassemble (
|
||||
// queue ends at the total length, all data is received.
|
||||
//
|
||||
if ((Assemble->TotalLen != 0) && (Assemble->CurLen >= Assemble->TotalLen)) {
|
||||
|
||||
RemoveEntryList (&Assemble->Link);
|
||||
|
||||
//
|
||||
@@ -385,7 +385,7 @@ Ip6Reassemble (
|
||||
// is a fake, drop it now.
|
||||
//
|
||||
Fragment = NET_LIST_USER_STRUCT (ListHead->BackLink, NET_BUF, List);
|
||||
if (IP6_GET_CLIP_INFO (Fragment)->End != (INTN) Assemble->TotalLen) {
|
||||
if (IP6_GET_CLIP_INFO (Fragment)->End != (INTN)Assemble->TotalLen) {
|
||||
Ip6FreeAssembleEntry (Assemble);
|
||||
goto Error;
|
||||
}
|
||||
@@ -441,7 +441,6 @@ Error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
The callback function for the net buffer that wraps the packet processed by
|
||||
IPsec. It releases the wrap packet and also signals IPsec to free the resources.
|
||||
@@ -452,12 +451,12 @@ Error:
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6IpSecFree (
|
||||
IN VOID *Arg
|
||||
IN VOID *Arg
|
||||
)
|
||||
{
|
||||
IP6_IPSEC_WRAP *Wrap;
|
||||
IP6_IPSEC_WRAP *Wrap;
|
||||
|
||||
Wrap = (IP6_IPSEC_WRAP *) Arg;
|
||||
Wrap = (IP6_IPSEC_WRAP *)Arg;
|
||||
|
||||
if (Wrap->IpSecRecycleSignal != NULL) {
|
||||
gBS->SignalEvent (Wrap->IpSecRecycleSignal);
|
||||
@@ -506,24 +505,25 @@ Ip6IpSecProcessPacket (
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
NET_FRAGMENT *FragmentTable;
|
||||
NET_FRAGMENT *OriginalFragmentTable;
|
||||
UINT32 FragmentCount;
|
||||
UINT32 OriginalFragmentCount;
|
||||
EFI_EVENT RecycleEvent;
|
||||
NET_BUF *Packet;
|
||||
IP6_TXTOKEN_WRAP *TxWrap;
|
||||
IP6_IPSEC_WRAP *IpSecWrap;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_HEADER *PacketHead;
|
||||
UINT8 *Buf;
|
||||
EFI_IP6_HEADER ZeroHead;
|
||||
NET_FRAGMENT *FragmentTable;
|
||||
NET_FRAGMENT *OriginalFragmentTable;
|
||||
UINT32 FragmentCount;
|
||||
UINT32 OriginalFragmentCount;
|
||||
EFI_EVENT RecycleEvent;
|
||||
NET_BUF *Packet;
|
||||
IP6_TXTOKEN_WRAP *TxWrap;
|
||||
IP6_IPSEC_WRAP *IpSecWrap;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_HEADER *PacketHead;
|
||||
UINT8 *Buf;
|
||||
EFI_IP6_HEADER ZeroHead;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
if (!mIpSec2Installed) {
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
ASSERT (mIpSec != NULL);
|
||||
|
||||
Packet = *Netbuf;
|
||||
@@ -532,7 +532,7 @@ Ip6IpSecProcessPacket (
|
||||
FragmentTable = NULL;
|
||||
PacketHead = NULL;
|
||||
Buf = NULL;
|
||||
TxWrap = (IP6_TXTOKEN_WRAP *) Context;
|
||||
TxWrap = (IP6_TXTOKEN_WRAP *)Context;
|
||||
FragmentCount = Packet->BlockOpNum;
|
||||
ZeroMem (&ZeroHead, sizeof (EFI_IP6_HEADER));
|
||||
|
||||
@@ -552,7 +552,6 @@ Ip6IpSecProcessPacket (
|
||||
IpSb->MaxPacketSize = IpSb->OldMaxPacketSize - IP6_MAX_IPSEC_HEADLEN;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Bypass all multicast inbound or outbound traffic.
|
||||
//
|
||||
@@ -570,11 +569,11 @@ Ip6IpSecProcessPacket (
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
Status = NetbufBuildExt (Packet, FragmentTable, &FragmentCount);
|
||||
Status = NetbufBuildExt (Packet, FragmentTable, &FragmentCount);
|
||||
OriginalFragmentTable = FragmentTable;
|
||||
OriginalFragmentCount = FragmentCount;
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (FragmentTable);
|
||||
goto ON_EXIT;
|
||||
}
|
||||
@@ -588,11 +587,11 @@ Ip6IpSecProcessPacket (
|
||||
mIpSec,
|
||||
IpSb->Controller,
|
||||
IP_VERSION_6,
|
||||
(VOID *) (*Head),
|
||||
(VOID *)(*Head),
|
||||
LastHead,
|
||||
(VOID **) ExtHdrs,
|
||||
(VOID **)ExtHdrs,
|
||||
ExtHdrsLen,
|
||||
(EFI_IPSEC_FRAGMENT_DATA **) (&FragmentTable),
|
||||
(EFI_IPSEC_FRAGMENT_DATA **)(&FragmentTable),
|
||||
&FragmentCount,
|
||||
Direction,
|
||||
&RecycleEvent
|
||||
@@ -607,7 +606,7 @@ Ip6IpSecProcessPacket (
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
if (OriginalFragmentCount == FragmentCount && OriginalFragmentTable == FragmentTable) {
|
||||
if ((OriginalFragmentCount == FragmentCount) && (OriginalFragmentTable == FragmentTable)) {
|
||||
//
|
||||
// For ByPass Packet
|
||||
//
|
||||
@@ -620,7 +619,7 @@ Ip6IpSecProcessPacket (
|
||||
FreePool (OriginalFragmentTable);
|
||||
}
|
||||
|
||||
if (Direction == EfiIPsecOutBound && TxWrap != NULL) {
|
||||
if ((Direction == EfiIPsecOutBound) && (TxWrap != NULL)) {
|
||||
TxWrap->IpSecRecycleSignal = RecycleEvent;
|
||||
TxWrap->Packet = NetbufFromExt (
|
||||
FragmentTable,
|
||||
@@ -632,7 +631,7 @@ Ip6IpSecProcessPacket (
|
||||
);
|
||||
if (TxWrap->Packet == NULL) {
|
||||
TxWrap->Packet = *Netbuf;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
@@ -642,11 +641,9 @@ Ip6IpSecProcessPacket (
|
||||
sizeof (IP6_CLIP_INFO)
|
||||
);
|
||||
|
||||
NetIpSecNetbufFree(Packet);
|
||||
NetIpSecNetbufFree (Packet);
|
||||
*Netbuf = TxWrap->Packet;
|
||||
|
||||
} else {
|
||||
|
||||
IpSecWrap = AllocateZeroPool (sizeof (IP6_IPSEC_WRAP));
|
||||
|
||||
if (IpSecWrap == NULL) {
|
||||
@@ -674,13 +671,12 @@ Ip6IpSecProcessPacket (
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
if (Direction == EfiIPsecInBound && 0 != CompareMem (&ZeroHead, *Head, sizeof (EFI_IP6_HEADER))) {
|
||||
|
||||
PacketHead = (EFI_IP6_HEADER *) NetbufAllocSpace (
|
||||
Packet,
|
||||
sizeof (EFI_IP6_HEADER) + *ExtHdrsLen,
|
||||
NET_BUF_HEAD
|
||||
);
|
||||
if ((Direction == EfiIPsecInBound) && (0 != CompareMem (&ZeroHead, *Head, sizeof (EFI_IP6_HEADER)))) {
|
||||
PacketHead = (EFI_IP6_HEADER *)NetbufAllocSpace (
|
||||
Packet,
|
||||
sizeof (EFI_IP6_HEADER) + *ExtHdrsLen,
|
||||
NET_BUF_HEAD
|
||||
);
|
||||
if (PacketHead == NULL) {
|
||||
*Netbuf = Packet;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
@@ -688,11 +684,11 @@ Ip6IpSecProcessPacket (
|
||||
}
|
||||
|
||||
CopyMem (PacketHead, *Head, sizeof (EFI_IP6_HEADER));
|
||||
*Head = PacketHead;
|
||||
*Head = PacketHead;
|
||||
Packet->Ip.Ip6 = PacketHead;
|
||||
|
||||
if (*ExtHdrs != NULL) {
|
||||
Buf = (UINT8 *) (PacketHead + 1);
|
||||
Buf = (UINT8 *)(PacketHead + 1);
|
||||
CopyMem (Buf, *ExtHdrs, *ExtHdrsLen);
|
||||
}
|
||||
|
||||
@@ -703,6 +699,7 @@ Ip6IpSecProcessPacket (
|
||||
sizeof (IP6_CLIP_INFO)
|
||||
);
|
||||
}
|
||||
|
||||
*Netbuf = Packet;
|
||||
}
|
||||
|
||||
@@ -733,25 +730,25 @@ ON_EXIT:
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6PreProcessPacket (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN OUT NET_BUF **Packet,
|
||||
IN UINT32 Flag,
|
||||
OUT UINT8 **Payload,
|
||||
OUT UINT8 **LastHead,
|
||||
OUT UINT32 *ExtHdrsLen,
|
||||
OUT UINT32 *UnFragmentLen,
|
||||
OUT BOOLEAN *Fragmented,
|
||||
OUT EFI_IP6_HEADER **Head
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN OUT NET_BUF **Packet,
|
||||
IN UINT32 Flag,
|
||||
OUT UINT8 **Payload,
|
||||
OUT UINT8 **LastHead,
|
||||
OUT UINT32 *ExtHdrsLen,
|
||||
OUT UINT32 *UnFragmentLen,
|
||||
OUT BOOLEAN *Fragmented,
|
||||
OUT EFI_IP6_HEADER **Head
|
||||
)
|
||||
{
|
||||
UINT16 PayloadLen;
|
||||
UINT16 TotalLen;
|
||||
UINT32 FormerHeadOffset;
|
||||
UINT32 HeadLen;
|
||||
IP6_FRAGMENT_HEADER *FragmentHead;
|
||||
UINT16 FragmentOffset;
|
||||
IP6_CLIP_INFO *Info;
|
||||
EFI_IPv6_ADDRESS Loopback;
|
||||
UINT16 PayloadLen;
|
||||
UINT16 TotalLen;
|
||||
UINT32 FormerHeadOffset;
|
||||
UINT32 HeadLen;
|
||||
IP6_FRAGMENT_HEADER *FragmentHead;
|
||||
UINT16 FragmentOffset;
|
||||
IP6_CLIP_INFO *Info;
|
||||
EFI_IPv6_ADDRESS Loopback;
|
||||
|
||||
HeadLen = 0;
|
||||
PayloadLen = 0;
|
||||
@@ -765,7 +762,7 @@ Ip6PreProcessPacket (
|
||||
//
|
||||
// Get header information of the packet.
|
||||
//
|
||||
*Head = (EFI_IP6_HEADER *) NetbufGetByte (*Packet, 0, NULL);
|
||||
*Head = (EFI_IP6_HEADER *)NetbufGetByte (*Packet, 0, NULL);
|
||||
if (*Head == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@@ -783,7 +780,8 @@ Ip6PreProcessPacket (
|
||||
ZeroMem (&Loopback, sizeof (EFI_IPv6_ADDRESS));
|
||||
Loopback.Addr[15] = 0x1;
|
||||
if ((CompareMem (&Loopback, &(*Head)->DestinationAddress, sizeof (EFI_IPv6_ADDRESS)) == 0) ||
|
||||
(NetIp6IsUnspecifiedAddr (&(*Head)->DestinationAddress))) {
|
||||
(NetIp6IsUnspecifiedAddr (&(*Head)->DestinationAddress)))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -818,17 +816,16 @@ Ip6PreProcessPacket (
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
PayloadLen = (*Head)->PayloadLength;
|
||||
|
||||
Info->Start = 0;
|
||||
Info->Length = PayloadLen;
|
||||
Info->End = Info->Start + Info->Length;
|
||||
Info->HeadLen = (UINT16) sizeof (EFI_IP6_HEADER);
|
||||
Info->HeadLen = (UINT16)sizeof (EFI_IP6_HEADER);
|
||||
Info->Status = EFI_SUCCESS;
|
||||
Info->LastFrag = FALSE;
|
||||
|
||||
TotalLen = (UINT16) (PayloadLen + sizeof (EFI_IP6_HEADER));
|
||||
TotalLen = (UINT16)(PayloadLen + sizeof (EFI_IP6_HEADER));
|
||||
|
||||
//
|
||||
// Mnp may deliver frame trailer sequence up, trim it off.
|
||||
@@ -845,7 +842,7 @@ Ip6PreProcessPacket (
|
||||
// Check the extension headers, if exist validate them
|
||||
//
|
||||
if (PayloadLen != 0) {
|
||||
*Payload = AllocatePool ((UINTN) PayloadLen);
|
||||
*Payload = AllocatePool ((UINTN)PayloadLen);
|
||||
if (*Payload == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@@ -858,24 +855,25 @@ Ip6PreProcessPacket (
|
||||
*Packet,
|
||||
&(*Head)->NextHeader,
|
||||
*Payload,
|
||||
(UINT32) PayloadLen,
|
||||
(UINT32)PayloadLen,
|
||||
TRUE,
|
||||
&FormerHeadOffset,
|
||||
LastHead,
|
||||
ExtHdrsLen,
|
||||
UnFragmentLen,
|
||||
Fragmented
|
||||
)) {
|
||||
))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
HeadLen = sizeof (EFI_IP6_HEADER) + *UnFragmentLen;
|
||||
HeadLen = sizeof (EFI_IP6_HEADER) + *UnFragmentLen;
|
||||
|
||||
if (*Fragmented) {
|
||||
//
|
||||
// Get the fragment offset from the Fragment header
|
||||
//
|
||||
FragmentHead = (IP6_FRAGMENT_HEADER *) NetbufGetByte (*Packet, HeadLen, NULL);
|
||||
FragmentHead = (IP6_FRAGMENT_HEADER *)NetbufGetByte (*Packet, HeadLen, NULL);
|
||||
if (FragmentHead == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@@ -895,10 +893,10 @@ Ip6PreProcessPacket (
|
||||
Info->NextHeader = FragmentHead->NextHeader;
|
||||
}
|
||||
|
||||
Info->HeadLen = (UINT16) HeadLen;
|
||||
HeadLen += sizeof (IP6_FRAGMENT_HEADER);
|
||||
Info->HeadLen = (UINT16)HeadLen;
|
||||
HeadLen += sizeof (IP6_FRAGMENT_HEADER);
|
||||
Info->Start = FragmentOffset;
|
||||
Info->Length = TotalLen - (UINT16) HeadLen;
|
||||
Info->Length = TotalLen - (UINT16)HeadLen;
|
||||
Info->End = Info->Start + Info->Length;
|
||||
Info->Id = FragmentHead->Identification;
|
||||
Info->FormerNextHeader = FormerHeadOffset;
|
||||
@@ -921,14 +919,14 @@ Ip6PreProcessPacket (
|
||||
//
|
||||
// Re-check the assembled packet to get the right values.
|
||||
//
|
||||
*Head = (*Packet)->Ip.Ip6;
|
||||
PayloadLen = (*Head)->PayloadLength;
|
||||
*Head = (*Packet)->Ip.Ip6;
|
||||
PayloadLen = (*Head)->PayloadLength;
|
||||
if (PayloadLen != 0) {
|
||||
if (*Payload != NULL) {
|
||||
FreePool (*Payload);
|
||||
}
|
||||
|
||||
*Payload = AllocatePool ((UINTN) PayloadLen);
|
||||
*Payload = AllocatePool ((UINTN)PayloadLen);
|
||||
if (*Payload == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@@ -941,14 +939,15 @@ Ip6PreProcessPacket (
|
||||
*Packet,
|
||||
&(*Head)->NextHeader,
|
||||
*Payload,
|
||||
(UINT32) PayloadLen,
|
||||
(UINT32)PayloadLen,
|
||||
TRUE,
|
||||
NULL,
|
||||
LastHead,
|
||||
ExtHdrsLen,
|
||||
UnFragmentLen,
|
||||
Fragmented
|
||||
)) {
|
||||
))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
@@ -975,23 +974,23 @@ Ip6PreProcessPacket (
|
||||
**/
|
||||
VOID
|
||||
Ip6AcceptFrame (
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN UINT32 Flag,
|
||||
IN VOID *Context
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN UINT32 Flag,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_IP6_HEADER *Head;
|
||||
UINT8 *Payload;
|
||||
UINT8 *LastHead;
|
||||
UINT32 UnFragmentLen;
|
||||
UINT32 ExtHdrsLen;
|
||||
BOOLEAN Fragmented;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_HEADER ZeroHead;
|
||||
IP6_SERVICE *IpSb;
|
||||
EFI_IP6_HEADER *Head;
|
||||
UINT8 *Payload;
|
||||
UINT8 *LastHead;
|
||||
UINT32 UnFragmentLen;
|
||||
UINT32 ExtHdrsLen;
|
||||
BOOLEAN Fragmented;
|
||||
EFI_STATUS Status;
|
||||
EFI_IP6_HEADER ZeroHead;
|
||||
|
||||
IpSb = (IP6_SERVICE *) Context;
|
||||
IpSb = (IP6_SERVICE *)Context;
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
Payload = NULL;
|
||||
@@ -1021,6 +1020,7 @@ Ip6AcceptFrame (
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Restart;
|
||||
}
|
||||
|
||||
//
|
||||
// After trim off, the packet is a esp/ah/udp/tcp/icmp6 net buffer,
|
||||
// and no need consider any other ahead ext headers.
|
||||
@@ -1072,15 +1072,15 @@ Ip6AcceptFrame (
|
||||
// Packet may have been changed. The ownership of the packet
|
||||
// is transferred to the packet process logic.
|
||||
//
|
||||
Head = Packet->Ip.Ip6;
|
||||
Head = Packet->Ip.Ip6;
|
||||
IP6_GET_CLIP_INFO (Packet)->Status = EFI_SUCCESS;
|
||||
|
||||
switch (*LastHead) {
|
||||
case IP6_ICMP:
|
||||
Ip6IcmpHandle (IpSb, Head, Packet);
|
||||
break;
|
||||
default:
|
||||
Ip6Demultiplex (IpSb, Head, Packet);
|
||||
case IP6_ICMP:
|
||||
Ip6IcmpHandle (IpSb, Head, Packet);
|
||||
break;
|
||||
default:
|
||||
Ip6Demultiplex (IpSb, Head, Packet);
|
||||
}
|
||||
|
||||
Packet = NULL;
|
||||
@@ -1103,7 +1103,7 @@ Drop:
|
||||
NetbufFree (Packet);
|
||||
}
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1115,10 +1115,10 @@ Drop:
|
||||
**/
|
||||
VOID
|
||||
Ip6CreateAssembleTable (
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table
|
||||
)
|
||||
{
|
||||
UINT32 Index;
|
||||
UINT32 Index;
|
||||
|
||||
for (Index = 0; Index < IP6_ASSEMLE_HASH_SIZE; Index++) {
|
||||
InitializeListHead (&Table->Bucket[Index]);
|
||||
@@ -1134,13 +1134,13 @@ Ip6CreateAssembleTable (
|
||||
**/
|
||||
VOID
|
||||
Ip6CleanAssembleTable (
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ASSEMBLE_ENTRY *Assemble;
|
||||
UINT32 Index;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ASSEMBLE_ENTRY *Assemble;
|
||||
UINT32 Index;
|
||||
|
||||
for (Index = 0; Index < IP6_ASSEMLE_HASH_SIZE; Index++) {
|
||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &Table->Bucket[Index]) {
|
||||
@@ -1152,7 +1152,6 @@ Ip6CleanAssembleTable (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
The signal handle of IP6's recycle event. It is called back
|
||||
when the upper layer releases the packet.
|
||||
@@ -1164,13 +1163,13 @@ Ip6CleanAssembleTable (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6OnRecyclePacket (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_RXDATA_WRAP *Wrap;
|
||||
IP6_RXDATA_WRAP *Wrap;
|
||||
|
||||
Wrap = (IP6_RXDATA_WRAP *) Context;
|
||||
Wrap = (IP6_RXDATA_WRAP *)Context;
|
||||
|
||||
EfiAcquireLockOrFail (&Wrap->IpInstance->RecycleLock);
|
||||
RemoveEntryList (&Wrap->Link);
|
||||
@@ -1199,13 +1198,13 @@ Ip6OnRecyclePacket (
|
||||
**/
|
||||
IP6_RXDATA_WRAP *
|
||||
Ip6WrapRxData (
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_RXDATA_WRAP *Wrap;
|
||||
EFI_IP6_RECEIVE_DATA *RxData;
|
||||
EFI_STATUS Status;
|
||||
IP6_RXDATA_WRAP *Wrap;
|
||||
EFI_IP6_RECEIVE_DATA *RxData;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Wrap = AllocatePool (IP6_RXDATA_WRAP_SIZE (Packet->BlockOpNum));
|
||||
|
||||
@@ -1215,9 +1214,9 @@ Ip6WrapRxData (
|
||||
|
||||
InitializeListHead (&Wrap->Link);
|
||||
|
||||
Wrap->IpInstance = IpInstance;
|
||||
Wrap->Packet = Packet;
|
||||
RxData = &Wrap->RxData;
|
||||
Wrap->IpInstance = IpInstance;
|
||||
Wrap->Packet = Packet;
|
||||
RxData = &Wrap->RxData;
|
||||
|
||||
ZeroMem (&RxData->TimeStamp, sizeof (EFI_TIME));
|
||||
|
||||
@@ -1239,15 +1238,15 @@ Ip6WrapRxData (
|
||||
//
|
||||
// The application expects a network byte order header.
|
||||
//
|
||||
RxData->HeaderLength = sizeof (EFI_IP6_HEADER);
|
||||
RxData->Header = (EFI_IP6_HEADER *) Ip6NtohHead (Packet->Ip.Ip6);
|
||||
RxData->DataLength = Packet->TotalSize;
|
||||
RxData->HeaderLength = sizeof (EFI_IP6_HEADER);
|
||||
RxData->Header = (EFI_IP6_HEADER *)Ip6NtohHead (Packet->Ip.Ip6);
|
||||
RxData->DataLength = Packet->TotalSize;
|
||||
|
||||
//
|
||||
// Build the fragment table to be delivered up.
|
||||
//
|
||||
RxData->FragmentCount = Packet->BlockOpNum;
|
||||
NetbufBuildExt (Packet, (NET_FRAGMENT *) RxData->FragmentTable, &RxData->FragmentCount);
|
||||
NetbufBuildExt (Packet, (NET_FRAGMENT *)RxData->FragmentTable, &RxData->FragmentCount);
|
||||
|
||||
return Wrap;
|
||||
}
|
||||
@@ -1265,19 +1264,19 @@ Ip6WrapRxData (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6InstanceFrameAcceptable (
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_ICMP_ERROR_HEAD Icmp;
|
||||
EFI_IP6_CONFIG_DATA *Config;
|
||||
IP6_CLIP_INFO *Info;
|
||||
UINT8 *Proto;
|
||||
UINT32 Index;
|
||||
UINT8 *ExtHdrs;
|
||||
UINT16 ErrMsgPayloadLen;
|
||||
UINT8 *ErrMsgPayload;
|
||||
IP6_ICMP_ERROR_HEAD Icmp;
|
||||
EFI_IP6_CONFIG_DATA *Config;
|
||||
IP6_CLIP_INFO *Info;
|
||||
UINT8 *Proto;
|
||||
UINT32 Index;
|
||||
UINT8 *ExtHdrs;
|
||||
UINT16 ErrMsgPayloadLen;
|
||||
UINT8 *ErrMsgPayload;
|
||||
|
||||
Config = &IpInstance->ConfigData;
|
||||
Proto = NULL;
|
||||
@@ -1308,14 +1307,15 @@ Ip6InstanceFrameAcceptable (
|
||||
Packet,
|
||||
&Head->NextHeader,
|
||||
ExtHdrs,
|
||||
(UINT32) Head->PayloadLength,
|
||||
(UINT32)Head->PayloadLength,
|
||||
TRUE,
|
||||
NULL,
|
||||
&Proto,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
)) {
|
||||
))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -1324,7 +1324,7 @@ Ip6InstanceFrameAcceptable (
|
||||
// invoked by its packet, like UDP.
|
||||
//
|
||||
if ((*Proto == IP6_ICMP) && (!Config->AcceptAnyProtocol) && (*Proto != Config->DefaultProtocol)) {
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);
|
||||
NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);
|
||||
|
||||
if (Icmp.Head.Type <= ICMP_V6_ERROR_MAX) {
|
||||
if (!Config->AcceptIcmpErrors) {
|
||||
@@ -1349,7 +1349,8 @@ Ip6InstanceFrameAcceptable (
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
)) {
|
||||
))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
@@ -1408,13 +1409,13 @@ Ip6InstanceFrameAcceptable (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6InstanceEnquePacket (
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_CLIP_INFO *Info;
|
||||
NET_BUF *Clone;
|
||||
IP6_CLIP_INFO *Info;
|
||||
NET_BUF *Clone;
|
||||
|
||||
//
|
||||
// Check whether the packet is acceptable to this instance.
|
||||
@@ -1440,8 +1441,8 @@ Ip6InstanceEnquePacket (
|
||||
// Set the receive time out for the assembled packet. If it expires,
|
||||
// packet will be removed from the queue.
|
||||
//
|
||||
Info = IP6_GET_CLIP_INFO (Clone);
|
||||
Info->Life = IP6_US_TO_SEC (IpInstance->ConfigData.ReceiveTimeout);
|
||||
Info = IP6_GET_CLIP_INFO (Clone);
|
||||
Info->Life = IP6_US_TO_SEC (IpInstance->ConfigData.ReceiveTimeout);
|
||||
|
||||
InsertTailList (&IpInstance->Received, &Clone->List);
|
||||
return EFI_SUCCESS;
|
||||
@@ -1463,7 +1464,7 @@ Ip6InstanceEnquePacket (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6InstanceDeliverPacket (
|
||||
IN IP6_PROTOCOL *IpInstance
|
||||
IN IP6_PROTOCOL *IpInstance
|
||||
)
|
||||
{
|
||||
EFI_IP6_COMPLETION_TOKEN *Token;
|
||||
@@ -1476,7 +1477,6 @@ Ip6InstanceDeliverPacket (
|
||||
// Deliver a packet if there are both a packet and a receive token.
|
||||
//
|
||||
while (!IsListEmpty (&IpInstance->Received) && !NetMapIsEmpty (&IpInstance->RxTokens)) {
|
||||
|
||||
Packet = NET_LIST_HEAD (&IpInstance->Received, NET_BUF, List);
|
||||
|
||||
if (!NET_BUF_SHARED (Packet)) {
|
||||
@@ -1490,7 +1490,6 @@ Ip6InstanceDeliverPacket (
|
||||
}
|
||||
|
||||
RemoveEntryList (&Packet->List);
|
||||
|
||||
} else {
|
||||
//
|
||||
// Create a duplicated packet if this packet is shared
|
||||
@@ -1506,9 +1505,9 @@ Ip6InstanceDeliverPacket (
|
||||
// headless. Trim the head off after copy. The IP head
|
||||
// may be not continuous before the data.
|
||||
//
|
||||
Head = NetbufAllocSpace (Dup, sizeof (EFI_IP6_HEADER), NET_BUF_HEAD);
|
||||
Head = NetbufAllocSpace (Dup, sizeof (EFI_IP6_HEADER), NET_BUF_HEAD);
|
||||
ASSERT (Head != NULL);
|
||||
Dup->Ip.Ip6 = (EFI_IP6_HEADER *) Head;
|
||||
Dup->Ip.Ip6 = (EFI_IP6_HEADER *)Head;
|
||||
|
||||
CopyMem (Head, Packet->Ip.Ip6, sizeof (EFI_IP6_HEADER));
|
||||
NetbufTrim (Dup, sizeof (EFI_IP6_HEADER), TRUE);
|
||||
@@ -1558,18 +1557,18 @@ Ip6InstanceDeliverPacket (
|
||||
**/
|
||||
INTN
|
||||
Ip6InterfaceEnquePacket (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet,
|
||||
IN IP6_INTERFACE *IpIf
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet,
|
||||
IN IP6_INTERFACE *IpIf
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_CLIP_INFO *Info;
|
||||
LIST_ENTRY *Entry;
|
||||
INTN Enqueued;
|
||||
INTN LocalType;
|
||||
INTN SavedType;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_CLIP_INFO *Info;
|
||||
LIST_ENTRY *Entry;
|
||||
INTN Enqueued;
|
||||
INTN LocalType;
|
||||
INTN SavedType;
|
||||
|
||||
//
|
||||
// First, check that the packet is acceptable to this interface
|
||||
@@ -1590,10 +1589,10 @@ Ip6InterfaceEnquePacket (
|
||||
// and pass the local cast type to the IP children on the
|
||||
// interface. The global cast type will be restored later.
|
||||
//
|
||||
SavedType = Info->CastType;
|
||||
Info->CastType = (UINT32) LocalType;
|
||||
SavedType = Info->CastType;
|
||||
Info->CastType = (UINT32)LocalType;
|
||||
|
||||
Enqueued = 0;
|
||||
Enqueued = 0;
|
||||
|
||||
NET_LIST_FOR_EACH (Entry, &IpIf->IpInstances) {
|
||||
IpInstance = NET_LIST_USER_STRUCT (Entry, IP6_PROTOCOL, AddrLink);
|
||||
@@ -1604,7 +1603,7 @@ Ip6InterfaceEnquePacket (
|
||||
}
|
||||
}
|
||||
|
||||
Info->CastType = (UINT32) SavedType;
|
||||
Info->CastType = (UINT32)SavedType;
|
||||
return Enqueued;
|
||||
}
|
||||
|
||||
@@ -1617,12 +1616,12 @@ Ip6InterfaceEnquePacket (
|
||||
**/
|
||||
VOID
|
||||
Ip6InterfaceDeliverPacket (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *IpIf
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *IpIf
|
||||
)
|
||||
{
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
LIST_ENTRY *Entry;
|
||||
|
||||
NET_LIST_FOR_EACH (Entry, &IpIf->IpInstances) {
|
||||
IpInstance = NET_LIST_USER_STRUCT (Entry, IP6_PROTOCOL, AddrLink);
|
||||
@@ -1650,15 +1649,14 @@ Ip6InterfaceDeliverPacket (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6Demultiplex (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_INTERFACE *IpIf;
|
||||
INTN Enqueued;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_INTERFACE *IpIf;
|
||||
INTN Enqueued;
|
||||
|
||||
//
|
||||
// Two pass delivery: first, enqueue a shared copy of the packet
|
||||
@@ -1714,14 +1712,14 @@ Ip6Demultiplex (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ip6SentPacketTicking (
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Context
|
||||
IN NET_MAP *Map,
|
||||
IN NET_MAP_ITEM *Item,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
|
||||
Wrap = (IP6_TXTOKEN_WRAP *) Item->Value;
|
||||
Wrap = (IP6_TXTOKEN_WRAP *)Item->Value;
|
||||
ASSERT (Wrap != NULL);
|
||||
|
||||
if ((Wrap->Life > 0) && (--Wrap->Life == 0)) {
|
||||
@@ -1739,17 +1737,17 @@ Ip6SentPacketTicking (
|
||||
**/
|
||||
VOID
|
||||
Ip6PacketTimerTicking (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *InstanceEntry;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_ASSEMBLE_ENTRY *Assemble;
|
||||
NET_BUF *Packet;
|
||||
IP6_CLIP_INFO *Info;
|
||||
UINT32 Index;
|
||||
LIST_ENTRY *InstanceEntry;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
IP6_ASSEMBLE_ENTRY *Assemble;
|
||||
NET_BUF *Packet;
|
||||
IP6_CLIP_INFO *Info;
|
||||
UINT32 Index;
|
||||
|
||||
//
|
||||
// First, time out the fragments. The packet's life is counting down
|
||||
@@ -1766,7 +1764,8 @@ Ip6PacketTimerTicking (
|
||||
// Time Exceeded message should be sent to the source of that fragment.
|
||||
//
|
||||
if ((Assemble->Packet != NULL) &&
|
||||
!IP6_IS_MULTICAST (&Assemble->Head->DestinationAddress)) {
|
||||
!IP6_IS_MULTICAST (&Assemble->Head->DestinationAddress))
|
||||
{
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Assemble->Packet,
|
||||
@@ -1812,4 +1811,3 @@ Ip6PacketTimerTicking (
|
||||
NetMapIterate (&IpInstance->TxTokens, Ip6SentPacketTicking, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -10,23 +10,21 @@
|
||||
#ifndef __EFI_IP6_INPUT_H__
|
||||
#define __EFI_IP6_INPUT_H__
|
||||
|
||||
#define IP6_MIN_HEADLEN 40
|
||||
#define IP6_MAX_HEADLEN 120
|
||||
#define IP6_MIN_HEADLEN 40
|
||||
#define IP6_MAX_HEADLEN 120
|
||||
///
|
||||
/// 8(ESP header) + 16(max IV) + 16(max padding) + 2(ESP tail) + 12(max ICV) = 54
|
||||
///
|
||||
#define IP6_MAX_IPSEC_HEADLEN 54
|
||||
#define IP6_MAX_IPSEC_HEADLEN 54
|
||||
|
||||
|
||||
#define IP6_ASSEMLE_HASH_SIZE 127
|
||||
#define IP6_ASSEMLE_HASH_SIZE 127
|
||||
///
|
||||
/// Lift time in seconds.
|
||||
///
|
||||
#define IP6_FRAGMENT_LIFE 60
|
||||
#define IP6_MAX_PACKET_SIZE 65535
|
||||
#define IP6_FRAGMENT_LIFE 60
|
||||
#define IP6_MAX_PACKET_SIZE 65535
|
||||
|
||||
|
||||
#define IP6_GET_CLIP_INFO(Packet) ((IP6_CLIP_INFO *) ((Packet)->ProtoData))
|
||||
#define IP6_GET_CLIP_INFO(Packet) ((IP6_CLIP_INFO *) ((Packet)->ProtoData))
|
||||
|
||||
#define IP6_ASSEMBLE_HASH(Dst, Src, Id) \
|
||||
((*((UINT32 *) (Dst)) + *((UINT32 *) (Src)) + (Id)) % IP6_ASSEMLE_HASH_SIZE)
|
||||
@@ -45,42 +43,42 @@
|
||||
// life. If it isn't consumed before Life reaches zero, the packet is released.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 LinkFlag;
|
||||
INT32 CastType;
|
||||
INT32 Start;
|
||||
INT32 End;
|
||||
INT32 Length;
|
||||
UINT32 Life;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Id;
|
||||
UINT16 HeadLen;
|
||||
UINT8 NextHeader;
|
||||
UINT8 LastFrag;
|
||||
UINT32 FormerNextHeader;
|
||||
UINT32 LinkFlag;
|
||||
INT32 CastType;
|
||||
INT32 Start;
|
||||
INT32 End;
|
||||
INT32 Length;
|
||||
UINT32 Life;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Id;
|
||||
UINT16 HeadLen;
|
||||
UINT8 NextHeader;
|
||||
UINT8 LastFrag;
|
||||
UINT32 FormerNextHeader;
|
||||
} IP6_CLIP_INFO;
|
||||
|
||||
//
|
||||
// Structure used to assemble IP packets.
|
||||
//
|
||||
typedef struct {
|
||||
LIST_ENTRY Link;
|
||||
LIST_ENTRY Fragments; // List of all the fragments of this packet
|
||||
LIST_ENTRY Link;
|
||||
LIST_ENTRY Fragments; // List of all the fragments of this packet
|
||||
|
||||
//
|
||||
// Identity of one IP6 packet. Each fragment of a packet has
|
||||
// the same (Dst, Src, Id).
|
||||
//
|
||||
EFI_IPv6_ADDRESS Dst;
|
||||
EFI_IPv6_ADDRESS Src;
|
||||
UINT32 Id;
|
||||
EFI_IPv6_ADDRESS Dst;
|
||||
EFI_IPv6_ADDRESS Src;
|
||||
UINT32 Id;
|
||||
|
||||
UINT32 TotalLen;
|
||||
UINT32 CurLen;
|
||||
UINT32 Life; // Count down life for the packet.
|
||||
UINT32 TotalLen;
|
||||
UINT32 CurLen;
|
||||
UINT32 Life; // Count down life for the packet.
|
||||
|
||||
EFI_IP6_HEADER *Head; // IP head of the first fragment
|
||||
IP6_CLIP_INFO *Info; // Per packet information of the first fragment
|
||||
NET_BUF *Packet; // The first fragment of the packet
|
||||
EFI_IP6_HEADER *Head; // IP head of the first fragment
|
||||
IP6_CLIP_INFO *Info; // Per packet information of the first fragment
|
||||
NET_BUF *Packet; // The first fragment of the packet
|
||||
} IP6_ASSEMBLE_ENTRY;
|
||||
|
||||
//
|
||||
@@ -89,7 +87,7 @@ typedef struct {
|
||||
// as hash table.
|
||||
//
|
||||
typedef struct {
|
||||
LIST_ENTRY Bucket[IP6_ASSEMLE_HASH_SIZE];
|
||||
LIST_ENTRY Bucket[IP6_ASSEMLE_HASH_SIZE];
|
||||
} IP6_ASSEMBLE_TABLE;
|
||||
|
||||
/**
|
||||
@@ -105,10 +103,10 @@ typedef struct {
|
||||
**/
|
||||
VOID
|
||||
Ip6AcceptFrame (
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN UINT32 Flag,
|
||||
IN VOID *Context
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN UINT32 Flag,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -127,7 +125,7 @@ Ip6AcceptFrame (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6InstanceDeliverPacket (
|
||||
IN IP6_PROTOCOL *IpInstance
|
||||
IN IP6_PROTOCOL *IpInstance
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -175,7 +173,7 @@ Ip6IpSecProcessPacket (
|
||||
**/
|
||||
VOID
|
||||
Ip6CreateAssembleTable (
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -187,7 +185,7 @@ Ip6CreateAssembleTable (
|
||||
**/
|
||||
VOID
|
||||
Ip6CleanAssembleTable (
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table
|
||||
IN OUT IP6_ASSEMBLE_TABLE *Table
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -210,9 +208,9 @@ Ip6CleanAssembleTable (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6Demultiplex (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -223,7 +221,7 @@ Ip6Demultiplex (
|
||||
**/
|
||||
VOID
|
||||
Ip6PacketTimerTicking (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -21,12 +21,12 @@
|
||||
**/
|
||||
IP6_MLD_GROUP *
|
||||
Ip6CreateMldEntry (
|
||||
IN OUT IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr,
|
||||
IN UINT32 DelayTimer
|
||||
IN OUT IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr,
|
||||
IN UINT32 DelayTimer
|
||||
)
|
||||
{
|
||||
IP6_MLD_GROUP *Entry;
|
||||
IP6_MLD_GROUP *Entry;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
ASSERT (MulticastAddr != NULL && IP6_IS_MULTICAST (MulticastAddr));
|
||||
@@ -54,12 +54,12 @@ Ip6CreateMldEntry (
|
||||
**/
|
||||
IP6_MLD_GROUP *
|
||||
Ip6FindMldEntry (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_MLD_GROUP *Group;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_MLD_GROUP *Group;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
ASSERT (MulticastAddr != NULL && IP6_IS_MULTICAST (MulticastAddr));
|
||||
@@ -88,13 +88,13 @@ Ip6FindMldEntry (
|
||||
**/
|
||||
INTN
|
||||
Ip6FindMac (
|
||||
IN IP6_MLD_SERVICE_DATA *MldCtrl,
|
||||
IN EFI_MAC_ADDRESS *Mac
|
||||
IN IP6_MLD_SERVICE_DATA *MldCtrl,
|
||||
IN EFI_MAC_ADDRESS *Mac
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_MLD_GROUP *Group;
|
||||
INTN Count;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_MLD_GROUP *Group;
|
||||
INTN Count;
|
||||
|
||||
Count = 0;
|
||||
|
||||
@@ -125,20 +125,20 @@ Ip6FindMac (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SendMldReport (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr
|
||||
)
|
||||
{
|
||||
IP6_MLD_HEAD *MldHead;
|
||||
NET_BUF *Packet;
|
||||
EFI_IP6_HEADER Head;
|
||||
UINT16 PayloadLen;
|
||||
UINTN OptionLen;
|
||||
UINT8 *Options;
|
||||
EFI_STATUS Status;
|
||||
UINT16 HeadChecksum;
|
||||
UINT16 PseudoChecksum;
|
||||
IP6_MLD_HEAD *MldHead;
|
||||
NET_BUF *Packet;
|
||||
EFI_IP6_HEADER Head;
|
||||
UINT16 PayloadLen;
|
||||
UINTN OptionLen;
|
||||
UINT8 *Options;
|
||||
EFI_STATUS Status;
|
||||
UINT16 HeadChecksum;
|
||||
UINT16 PseudoChecksum;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
ASSERT (MulticastAddr != NULL && IP6_IS_MULTICAST (MulticastAddr));
|
||||
@@ -149,11 +149,11 @@ Ip6SendMldReport (
|
||||
//
|
||||
|
||||
OptionLen = 0;
|
||||
Status = Ip6FillHopByHop (NULL, &OptionLen, IP6_ICMP);
|
||||
Status = Ip6FillHopByHop (NULL, &OptionLen, IP6_ICMP);
|
||||
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
|
||||
|
||||
PayloadLen = (UINT16) (OptionLen + sizeof (IP6_MLD_HEAD));
|
||||
Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32) PayloadLen);
|
||||
PayloadLen = (UINT16)(OptionLen + sizeof (IP6_MLD_HEAD));
|
||||
Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32)PayloadLen);
|
||||
if (Packet == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@@ -163,11 +163,11 @@ Ip6SendMldReport (
|
||||
// RFC3590: Use link-local address as source address if it is available,
|
||||
// otherwise use the unspecified address.
|
||||
//
|
||||
Head.FlowLabelL = 0;
|
||||
Head.FlowLabelH = 0;
|
||||
Head.PayloadLength = HTONS (PayloadLen);
|
||||
Head.NextHeader = IP6_HOP_BY_HOP;
|
||||
Head.HopLimit = 1;
|
||||
Head.FlowLabelL = 0;
|
||||
Head.FlowLabelH = 0;
|
||||
Head.PayloadLength = HTONS (PayloadLen);
|
||||
Head.NextHeader = IP6_HOP_BY_HOP;
|
||||
Head.HopLimit = 1;
|
||||
IP6_COPY_ADDRESS (&Head.DestinationAddress, MulticastAddr);
|
||||
|
||||
//
|
||||
@@ -180,7 +180,7 @@ Ip6SendMldReport (
|
||||
//
|
||||
// Fill a IPv6 Router Alert option in a Hop-by-Hop Options Header
|
||||
//
|
||||
Options = NetbufAllocSpace (Packet, (UINT32) OptionLen, FALSE);
|
||||
Options = NetbufAllocSpace (Packet, (UINT32)OptionLen, FALSE);
|
||||
ASSERT (Options != NULL);
|
||||
Status = Ip6FillHopByHop (Options, &OptionLen, IP6_ICMP);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@@ -192,14 +192,14 @@ Ip6SendMldReport (
|
||||
//
|
||||
// Fill in MLD message - Report
|
||||
//
|
||||
MldHead = (IP6_MLD_HEAD *) NetbufAllocSpace (Packet, sizeof (IP6_MLD_HEAD), FALSE);
|
||||
MldHead = (IP6_MLD_HEAD *)NetbufAllocSpace (Packet, sizeof (IP6_MLD_HEAD), FALSE);
|
||||
ASSERT (MldHead != NULL);
|
||||
ZeroMem (MldHead, sizeof (IP6_MLD_HEAD));
|
||||
MldHead->Head.Type = ICMP_V6_LISTENER_REPORT;
|
||||
MldHead->Head.Code = 0;
|
||||
IP6_COPY_ADDRESS (&MldHead->Group, MulticastAddr);
|
||||
|
||||
HeadChecksum = NetblockChecksum ((UINT8 *) MldHead, sizeof (IP6_MLD_HEAD));
|
||||
HeadChecksum = NetblockChecksum ((UINT8 *)MldHead, sizeof (IP6_MLD_HEAD));
|
||||
PseudoChecksum = NetIp6PseudoHeadChecksum (
|
||||
&Head.SourceAddress,
|
||||
&Head.DestinationAddress,
|
||||
@@ -229,20 +229,20 @@ Ip6SendMldReport (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SendMldDone (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr
|
||||
)
|
||||
{
|
||||
IP6_MLD_HEAD *MldHead;
|
||||
NET_BUF *Packet;
|
||||
EFI_IP6_HEADER Head;
|
||||
UINT16 PayloadLen;
|
||||
UINTN OptionLen;
|
||||
UINT8 *Options;
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
UINT16 HeadChecksum;
|
||||
UINT16 PseudoChecksum;
|
||||
IP6_MLD_HEAD *MldHead;
|
||||
NET_BUF *Packet;
|
||||
EFI_IP6_HEADER Head;
|
||||
UINT16 PayloadLen;
|
||||
UINTN OptionLen;
|
||||
UINT8 *Options;
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
UINT16 HeadChecksum;
|
||||
UINT16 PseudoChecksum;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
ASSERT (MulticastAddr != NULL && IP6_IS_MULTICAST (MulticastAddr));
|
||||
@@ -253,11 +253,11 @@ Ip6SendMldDone (
|
||||
//
|
||||
|
||||
OptionLen = 0;
|
||||
Status = Ip6FillHopByHop (NULL, &OptionLen, IP6_ICMP);
|
||||
Status = Ip6FillHopByHop (NULL, &OptionLen, IP6_ICMP);
|
||||
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
|
||||
|
||||
PayloadLen = (UINT16) (OptionLen + sizeof (IP6_MLD_HEAD));
|
||||
Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32) PayloadLen);
|
||||
PayloadLen = (UINT16)(OptionLen + sizeof (IP6_MLD_HEAD));
|
||||
Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32)PayloadLen);
|
||||
if (Packet == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@@ -265,11 +265,11 @@ Ip6SendMldDone (
|
||||
//
|
||||
// Create the basic IPv6 header.
|
||||
//
|
||||
Head.FlowLabelL = 0;
|
||||
Head.FlowLabelH = 0;
|
||||
Head.PayloadLength = HTONS (PayloadLen);
|
||||
Head.NextHeader = IP6_HOP_BY_HOP;
|
||||
Head.HopLimit = 1;
|
||||
Head.FlowLabelL = 0;
|
||||
Head.FlowLabelH = 0;
|
||||
Head.PayloadLength = HTONS (PayloadLen);
|
||||
Head.NextHeader = IP6_HOP_BY_HOP;
|
||||
Head.HopLimit = 1;
|
||||
|
||||
//
|
||||
// If Link-Local address is not ready, we use unspecified address.
|
||||
@@ -284,7 +284,7 @@ Ip6SendMldDone (
|
||||
//
|
||||
// Fill a IPv6 Router Alert option in a Hop-by-Hop Options Header
|
||||
//
|
||||
Options = NetbufAllocSpace (Packet, (UINT32) OptionLen, FALSE);
|
||||
Options = NetbufAllocSpace (Packet, (UINT32)OptionLen, FALSE);
|
||||
ASSERT (Options != NULL);
|
||||
Status = Ip6FillHopByHop (Options, &OptionLen, IP6_ICMP);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@@ -296,14 +296,14 @@ Ip6SendMldDone (
|
||||
//
|
||||
// Fill in MLD message - Done
|
||||
//
|
||||
MldHead = (IP6_MLD_HEAD *) NetbufAllocSpace (Packet, sizeof (IP6_MLD_HEAD), FALSE);
|
||||
MldHead = (IP6_MLD_HEAD *)NetbufAllocSpace (Packet, sizeof (IP6_MLD_HEAD), FALSE);
|
||||
ASSERT (MldHead != NULL);
|
||||
ZeroMem (MldHead, sizeof (IP6_MLD_HEAD));
|
||||
MldHead->Head.Type = ICMP_V6_LISTENER_DONE;
|
||||
MldHead->Head.Code = 0;
|
||||
IP6_COPY_ADDRESS (&MldHead->Group, MulticastAddr);
|
||||
|
||||
HeadChecksum = NetblockChecksum ((UINT8 *) MldHead, sizeof (IP6_MLD_HEAD));
|
||||
HeadChecksum = NetblockChecksum ((UINT8 *)MldHead, sizeof (IP6_MLD_HEAD));
|
||||
PseudoChecksum = NetIp6PseudoHeadChecksum (
|
||||
&Head.SourceAddress,
|
||||
&Head.DestinationAddress,
|
||||
@@ -332,12 +332,12 @@ Ip6SendMldDone (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6InitMld (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
)
|
||||
{
|
||||
EFI_IPv6_ADDRESS AllNodes;
|
||||
IP6_MLD_GROUP *Group;
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS AllNodes;
|
||||
IP6_MLD_GROUP *Group;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Join the link-scope all-nodes multicast address (FF02::1).
|
||||
@@ -347,7 +347,7 @@ Ip6InitMld (
|
||||
|
||||
Ip6SetToAllNodeMulticast (FALSE, IP6_LINK_LOCAL_SCOPE, &AllNodes);
|
||||
|
||||
Group = Ip6CreateMldEntry (IpSb, &AllNodes, (UINT32) IP6_INFINIT_LIFETIME);
|
||||
Group = Ip6CreateMldEntry (IpSb, &AllNodes, (UINT32)IP6_INFINIT_LIFETIME);
|
||||
if (Group == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@@ -388,11 +388,11 @@ ERROR:
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6CombineGroups (
|
||||
IN OUT IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IPv6_ADDRESS *Group
|
||||
IN OUT IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IPv6_ADDRESS *Group
|
||||
)
|
||||
{
|
||||
EFI_IPv6_ADDRESS *GroupList;
|
||||
EFI_IPv6_ADDRESS *GroupList;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpInstance, IP6_PROTOCOL_SIGNATURE);
|
||||
ASSERT (Group != NULL && IP6_IS_MULTICAST (Group));
|
||||
@@ -437,12 +437,12 @@ Ip6CombineGroups (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6RemoveGroup (
|
||||
IN OUT IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IPv6_ADDRESS *Group
|
||||
IN OUT IP6_PROTOCOL *IpInstance,
|
||||
IN EFI_IPv6_ADDRESS *Group
|
||||
)
|
||||
{
|
||||
UINT32 Index;
|
||||
UINT32 Count;
|
||||
UINT32 Index;
|
||||
UINT32 Count;
|
||||
|
||||
Count = IpInstance->GroupCount;
|
||||
|
||||
@@ -481,13 +481,13 @@ Ip6RemoveGroup (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6JoinGroup (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
)
|
||||
{
|
||||
IP6_MLD_GROUP *Group;
|
||||
EFI_STATUS Status;
|
||||
IP6_MLD_GROUP *Group;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Group = Ip6FindMldEntry (IpSb, Address);
|
||||
if (Group != NULL) {
|
||||
@@ -545,12 +545,12 @@ ERROR:
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6LeaveGroup (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
)
|
||||
{
|
||||
IP6_MLD_GROUP *Group;
|
||||
EFI_STATUS Status;
|
||||
IP6_MLD_GROUP *Group;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Group = Ip6FindMldEntry (IpSb, Address);
|
||||
if (Group == NULL) {
|
||||
@@ -611,15 +611,15 @@ Ip6LeaveGroup (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6Groups (
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN BOOLEAN JoinFlag,
|
||||
IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN BOOLEAN JoinFlag,
|
||||
IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
IP6_SERVICE *IpSb;
|
||||
UINT32 Index;
|
||||
EFI_IPv6_ADDRESS *Group;
|
||||
EFI_STATUS Status;
|
||||
IP6_SERVICE *IpSb;
|
||||
UINT32 Index;
|
||||
EFI_IPv6_ADDRESS *Group;
|
||||
|
||||
IpSb = IpInstance->Service;
|
||||
|
||||
@@ -690,13 +690,13 @@ Ip6Groups (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6UpdateDelayTimer (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN UINT16 MaxRespDelay,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr,
|
||||
IN OUT IP6_MLD_GROUP *Group
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN UINT16 MaxRespDelay,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr,
|
||||
IN OUT IP6_MLD_GROUP *Group
|
||||
)
|
||||
{
|
||||
UINT32 Delay;
|
||||
UINT32 Delay;
|
||||
|
||||
//
|
||||
// If the Query packet specifies a Maximum Response Delay of zero, perform timer
|
||||
@@ -707,14 +707,14 @@ Ip6UpdateDelayTimer (
|
||||
return Ip6SendMldReport (IpSb, NULL, MulticastAddr);
|
||||
}
|
||||
|
||||
Delay = (UINT32) (MaxRespDelay / 1000);
|
||||
Delay = (UINT32)(MaxRespDelay / 1000);
|
||||
|
||||
//
|
||||
// Sets a delay timer to a random value selected from the range [0, Maximum Response Delay]
|
||||
// If a timer is already running, resets it if the request Maximum Response Delay
|
||||
// is less than the remaining value of the running timer.
|
||||
//
|
||||
if (Group->DelayTimer == 0 || Delay < Group->DelayTimer) {
|
||||
if ((Group->DelayTimer == 0) || (Delay < Group->DelayTimer)) {
|
||||
Group->DelayTimer = Delay / 4294967295UL * NET_RANDOM (NetRandomInitSeed ());
|
||||
}
|
||||
|
||||
@@ -736,16 +736,16 @@ Ip6UpdateDelayTimer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessMldQuery (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
EFI_IPv6_ADDRESS AllNodes;
|
||||
IP6_MLD_GROUP *Group;
|
||||
IP6_MLD_HEAD MldPacket;
|
||||
LIST_ENTRY *Entry;
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS AllNodes;
|
||||
IP6_MLD_GROUP *Group;
|
||||
IP6_MLD_HEAD MldPacket;
|
||||
LIST_ENTRY *Entry;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
|
||||
@@ -756,14 +756,14 @@ Ip6ProcessMldQuery (
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (Head->HopLimit != 1 || !IP6_IS_MULTICAST (&Head->DestinationAddress)) {
|
||||
if ((Head->HopLimit != 1) || !IP6_IS_MULTICAST (&Head->DestinationAddress)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
//
|
||||
// The Packet points to MLD report raw data without Hop-By-Hop option.
|
||||
//
|
||||
NetbufCopy (Packet, 0, sizeof (IP6_MLD_HEAD), (UINT8 *) &MldPacket);
|
||||
NetbufCopy (Packet, 0, sizeof (IP6_MLD_HEAD), (UINT8 *)&MldPacket);
|
||||
MldPacket.MaxRespDelay = NTOHS (MldPacket.MaxRespDelay);
|
||||
|
||||
Ip6SetToAllNodeMulticast (FALSE, IP6_LINK_LOCAL_SCOPE, &AllNodes);
|
||||
@@ -774,6 +774,7 @@ Ip6ProcessMldQuery (
|
||||
if (!EFI_IP6_EQUAL (&Head->DestinationAddress, &MldPacket.Group)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
//
|
||||
// The node is not listening but it receives the specific query. Just return.
|
||||
//
|
||||
@@ -824,14 +825,14 @@ Exit:
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessMldReport (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
)
|
||||
{
|
||||
IP6_MLD_HEAD MldPacket;
|
||||
IP6_MLD_GROUP *Group;
|
||||
EFI_STATUS Status;
|
||||
IP6_MLD_HEAD MldPacket;
|
||||
IP6_MLD_GROUP *Group;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
|
||||
@@ -842,14 +843,14 @@ Ip6ProcessMldReport (
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (Head->HopLimit != 1 || !IP6_IS_MULTICAST (&Head->DestinationAddress)) {
|
||||
if ((Head->HopLimit != 1) || !IP6_IS_MULTICAST (&Head->DestinationAddress)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
//
|
||||
// The Packet points to MLD report raw data without Hop-By-Hop option.
|
||||
//
|
||||
NetbufCopy (Packet, 0, sizeof (IP6_MLD_HEAD), (UINT8 *) &MldPacket);
|
||||
NetbufCopy (Packet, 0, sizeof (IP6_MLD_HEAD), (UINT8 *)&MldPacket);
|
||||
if (!EFI_IP6_EQUAL (&Head->DestinationAddress, &MldPacket.Group)) {
|
||||
goto Exit;
|
||||
}
|
||||
@@ -883,11 +884,11 @@ Exit:
|
||||
**/
|
||||
VOID
|
||||
Ip6MldTimerTicking (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
)
|
||||
{
|
||||
IP6_MLD_GROUP *Group;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_MLD_GROUP *Group;
|
||||
LIST_ENTRY *Entry;
|
||||
|
||||
//
|
||||
// Send solicited report when timer expires
|
||||
@@ -899,4 +900,3 @@ Ip6MldTimerTicking (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -10,14 +10,14 @@
|
||||
#ifndef __EFI_IP6_MLD_H__
|
||||
#define __EFI_IP6_MLD_H__
|
||||
|
||||
#define IP6_UNSOLICITED_REPORT_INTERVAL 10
|
||||
#define IP6_UNSOLICITED_REPORT_INTERVAL 10
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
IP6_ICMP_HEAD Head;
|
||||
UINT16 MaxRespDelay;
|
||||
UINT16 Reserved;
|
||||
EFI_IPv6_ADDRESS Group;
|
||||
IP6_ICMP_HEAD Head;
|
||||
UINT16 MaxRespDelay;
|
||||
UINT16 Reserved;
|
||||
EFI_IPv6_ADDRESS Group;
|
||||
} IP6_MLD_HEAD;
|
||||
#pragma pack()
|
||||
|
||||
@@ -28,12 +28,12 @@ typedef struct {
|
||||
// "idle listener" state.
|
||||
//
|
||||
typedef struct {
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
EFI_IPv6_ADDRESS Address;
|
||||
UINT32 DelayTimer;
|
||||
BOOLEAN SendByUs;
|
||||
EFI_MAC_ADDRESS Mac;
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
EFI_IPv6_ADDRESS Address;
|
||||
UINT32 DelayTimer;
|
||||
BOOLEAN SendByUs;
|
||||
EFI_MAC_ADDRESS Mac;
|
||||
} IP6_MLD_GROUP;
|
||||
|
||||
//
|
||||
@@ -42,8 +42,8 @@ typedef struct {
|
||||
// connected network is v1 or v2.
|
||||
//
|
||||
typedef struct {
|
||||
INTN Mldv1QuerySeen;
|
||||
LIST_ENTRY Groups;
|
||||
INTN Mldv1QuerySeen;
|
||||
LIST_ENTRY Groups;
|
||||
} IP6_MLD_SERVICE_DATA;
|
||||
|
||||
/**
|
||||
@@ -57,8 +57,8 @@ typedef struct {
|
||||
**/
|
||||
IP6_MLD_GROUP *
|
||||
Ip6FindMldEntry (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *MulticastAddr
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -74,7 +74,7 @@ Ip6FindMldEntry (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6InitMld (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -91,9 +91,9 @@ Ip6InitMld (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6JoinGroup (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -109,8 +109,8 @@ Ip6JoinGroup (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6LeaveGroup (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Address
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -131,9 +131,9 @@ Ip6LeaveGroup (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6Groups (
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN BOOLEAN JoinFlag,
|
||||
IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
IN BOOLEAN JoinFlag,
|
||||
IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -151,9 +151,9 @@ Ip6Groups (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessMldQuery (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -170,12 +170,11 @@ Ip6ProcessMldQuery (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessMldReport (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
The heartbeat timer of the MLD module. It sends out solicited MLD report when
|
||||
DelayTimer expires.
|
||||
@@ -185,8 +184,7 @@ Ip6ProcessMldReport (
|
||||
**/
|
||||
VOID
|
||||
Ip6MldTimerTicking (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -13,82 +13,82 @@
|
||||
#define IP6_GET_TICKS(Ms) (((Ms) + IP6_TIMER_INTERVAL_IN_MS - 1) / IP6_TIMER_INTERVAL_IN_MS)
|
||||
|
||||
enum {
|
||||
IP6_INF_ROUTER_LIFETIME = 0xFFFF,
|
||||
IP6_INF_ROUTER_LIFETIME = 0xFFFF,
|
||||
|
||||
IP6_MAX_RTR_SOLICITATION_DELAY = 1000, ///< 1000 milliseconds
|
||||
IP6_MAX_RTR_SOLICITATIONS = 3,
|
||||
IP6_RTR_SOLICITATION_INTERVAL = 4000,
|
||||
|
||||
IP6_MIN_RANDOM_FACTOR_SCALED = 1,
|
||||
IP6_MAX_RANDOM_FACTOR_SCALED = 3,
|
||||
IP6_RANDOM_FACTOR_SCALE = 2,
|
||||
IP6_MIN_RANDOM_FACTOR_SCALED = 1,
|
||||
IP6_MAX_RANDOM_FACTOR_SCALED = 3,
|
||||
IP6_RANDOM_FACTOR_SCALE = 2,
|
||||
|
||||
IP6_MAX_MULTICAST_SOLICIT = 3,
|
||||
IP6_MAX_UNICAST_SOLICIT = 3,
|
||||
IP6_MAX_ANYCAST_DELAY_TIME = 1,
|
||||
IP6_MAX_NEIGHBOR_ADV = 3,
|
||||
IP6_REACHABLE_TIME = 30000,
|
||||
IP6_RETRANS_TIMER = 1000,
|
||||
IP6_DELAY_FIRST_PROBE_TIME = 5000,
|
||||
IP6_MAX_MULTICAST_SOLICIT = 3,
|
||||
IP6_MAX_UNICAST_SOLICIT = 3,
|
||||
IP6_MAX_ANYCAST_DELAY_TIME = 1,
|
||||
IP6_MAX_NEIGHBOR_ADV = 3,
|
||||
IP6_REACHABLE_TIME = 30000,
|
||||
IP6_RETRANS_TIMER = 1000,
|
||||
IP6_DELAY_FIRST_PROBE_TIME = 5000,
|
||||
|
||||
IP6_MIN_LINK_MTU = 1280,
|
||||
IP6_MAX_LINK_MTU = 1500,
|
||||
IP6_MIN_LINK_MTU = 1280,
|
||||
IP6_MAX_LINK_MTU = 1500,
|
||||
|
||||
IP6_IS_ROUTER_FLAG = 0x80,
|
||||
IP6_SOLICITED_FLAG = 0x40,
|
||||
IP6_OVERRIDE_FLAG = 0x20,
|
||||
IP6_IS_ROUTER_FLAG = 0x80,
|
||||
IP6_SOLICITED_FLAG = 0x40,
|
||||
IP6_OVERRIDE_FLAG = 0x20,
|
||||
|
||||
IP6_M_ADDR_CONFIG_FLAG = 0x80,
|
||||
IP6_O_CONFIG_FLAG = 0x40,
|
||||
IP6_M_ADDR_CONFIG_FLAG = 0x80,
|
||||
IP6_O_CONFIG_FLAG = 0x40,
|
||||
|
||||
IP6_ON_LINK_FLAG = 0x80,
|
||||
IP6_AUTO_CONFIG_FLAG = 0x40,
|
||||
IP6_ON_LINK_FLAG = 0x80,
|
||||
IP6_AUTO_CONFIG_FLAG = 0x40,
|
||||
|
||||
IP6_ND_LENGTH = 24,
|
||||
IP6_RA_LENGTH = 16,
|
||||
IP6_REDITECT_LENGTH = 40,
|
||||
IP6_DAD_ENTRY_SIGNATURE = SIGNATURE_32 ('I', 'P', 'D', 'E')
|
||||
IP6_ND_LENGTH = 24,
|
||||
IP6_RA_LENGTH = 16,
|
||||
IP6_REDITECT_LENGTH = 40,
|
||||
IP6_DAD_ENTRY_SIGNATURE = SIGNATURE_32 ('I', 'P', 'D', 'E')
|
||||
};
|
||||
|
||||
typedef
|
||||
VOID
|
||||
(*IP6_ARP_CALLBACK) (
|
||||
VOID *Context
|
||||
VOID *Context
|
||||
);
|
||||
|
||||
typedef struct _IP6_OPTION_HEADER {
|
||||
UINT8 Type;
|
||||
UINT8 Length;
|
||||
UINT8 Type;
|
||||
UINT8 Length;
|
||||
} IP6_OPTION_HEADER;
|
||||
|
||||
STATIC_ASSERT (sizeof (IP6_OPTION_HEADER) == 2, "IP6_OPTION_HEADER is expected to be exactly 2 bytes long.");
|
||||
|
||||
typedef struct _IP6_ETHE_ADDR_OPTION {
|
||||
UINT8 Type;
|
||||
UINT8 Length;
|
||||
UINT8 EtherAddr[6];
|
||||
UINT8 Type;
|
||||
UINT8 Length;
|
||||
UINT8 EtherAddr[6];
|
||||
} IP6_ETHER_ADDR_OPTION;
|
||||
|
||||
STATIC_ASSERT (sizeof (IP6_ETHER_ADDR_OPTION) == 8, "IP6_ETHER_ADDR_OPTION is expected to be exactly 8 bytes long.");
|
||||
|
||||
typedef struct _IP6_MTU_OPTION {
|
||||
UINT8 Type;
|
||||
UINT8 Length;
|
||||
UINT16 Reserved;
|
||||
UINT32 Mtu;
|
||||
UINT8 Type;
|
||||
UINT8 Length;
|
||||
UINT16 Reserved;
|
||||
UINT32 Mtu;
|
||||
} IP6_MTU_OPTION;
|
||||
|
||||
STATIC_ASSERT (sizeof (IP6_MTU_OPTION) == 8, "IP6_MTU_OPTION is expected to be exactly 8 bytes long.");
|
||||
|
||||
typedef struct _IP6_PREFIX_INFO_OPTION {
|
||||
UINT8 Type;
|
||||
UINT8 Length;
|
||||
UINT8 PrefixLength;
|
||||
UINT8 Reserved1;
|
||||
UINT32 ValidLifetime;
|
||||
UINT32 PreferredLifetime;
|
||||
UINT32 Reserved2;
|
||||
EFI_IPv6_ADDRESS Prefix;
|
||||
UINT8 Type;
|
||||
UINT8 Length;
|
||||
UINT8 PrefixLength;
|
||||
UINT8 Reserved1;
|
||||
UINT32 ValidLifetime;
|
||||
UINT32 PreferredLifetime;
|
||||
UINT32 Reserved2;
|
||||
EFI_IPv6_ADDRESS Prefix;
|
||||
} IP6_PREFIX_INFO_OPTION;
|
||||
|
||||
STATIC_ASSERT (sizeof (IP6_PREFIX_INFO_OPTION) == 32, "IP6_PREFIX_INFO_OPTION is expected to be exactly 32 bytes long.");
|
||||
@@ -102,25 +102,25 @@ VOID
|
||||
);
|
||||
|
||||
typedef struct _IP6_DAD_ENTRY {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 MaxTransmit;
|
||||
UINT32 Transmit;
|
||||
UINT32 Receive;
|
||||
UINT32 RetransTick;
|
||||
IP6_ADDRESS_INFO *AddressInfo;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
IP6_DAD_CALLBACK Callback;
|
||||
VOID *Context;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 MaxTransmit;
|
||||
UINT32 Transmit;
|
||||
UINT32 Receive;
|
||||
UINT32 RetransTick;
|
||||
IP6_ADDRESS_INFO *AddressInfo;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
IP6_DAD_CALLBACK Callback;
|
||||
VOID *Context;
|
||||
} IP6_DAD_ENTRY;
|
||||
|
||||
typedef struct _IP6_DELAY_JOIN_LIST {
|
||||
LIST_ENTRY Link;
|
||||
UINT32 DelayTime; ///< in tick per 50 milliseconds
|
||||
IP6_INTERFACE *Interface;
|
||||
IP6_ADDRESS_INFO *AddressInfo;
|
||||
IP6_DAD_CALLBACK DadCallback;
|
||||
VOID *Context;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 DelayTime; ///< in tick per 50 milliseconds
|
||||
IP6_INTERFACE *Interface;
|
||||
IP6_ADDRESS_INFO *AddressInfo;
|
||||
IP6_DAD_CALLBACK DadCallback;
|
||||
VOID *Context;
|
||||
} IP6_DELAY_JOIN_LIST;
|
||||
|
||||
typedef struct _IP6_NEIGHBOR_ENTRY {
|
||||
@@ -142,20 +142,20 @@ typedef struct _IP6_NEIGHBOR_ENTRY {
|
||||
} IP6_NEIGHBOR_ENTRY;
|
||||
|
||||
typedef struct _IP6_DEFAULT_ROUTER {
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINT16 Lifetime;
|
||||
EFI_IPv6_ADDRESS Router;
|
||||
IP6_NEIGHBOR_ENTRY *NeighborCache;
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINT16 Lifetime;
|
||||
EFI_IPv6_ADDRESS Router;
|
||||
IP6_NEIGHBOR_ENTRY *NeighborCache;
|
||||
} IP6_DEFAULT_ROUTER;
|
||||
|
||||
typedef struct _IP6_PREFIX_LIST_ENTRY {
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINT32 ValidLifetime;
|
||||
UINT32 PreferredLifetime;
|
||||
UINT8 PrefixLength;
|
||||
EFI_IPv6_ADDRESS Prefix;
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINT32 ValidLifetime;
|
||||
UINT32 PreferredLifetime;
|
||||
UINT8 PrefixLength;
|
||||
EFI_IPv6_ADDRESS Prefix;
|
||||
} IP6_PREFIX_LIST_ENTRY;
|
||||
|
||||
/**
|
||||
@@ -172,9 +172,9 @@ typedef struct _IP6_PREFIX_LIST_ENTRY {
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6BuildEfiNeighborCache (
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
OUT UINT32 *NeighborCount,
|
||||
OUT EFI_IP6_NEIGHBOR_CACHE **NeighborCache
|
||||
IN IP6_PROTOCOL *IpInstance,
|
||||
OUT UINT32 *NeighborCount,
|
||||
OUT EFI_IP6_NEIGHBOR_CACHE **NeighborCache
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -210,9 +210,9 @@ Ip6BuildPrefixTable (
|
||||
**/
|
||||
IP6_DEFAULT_ROUTER *
|
||||
Ip6CreateDefaultRouter (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Address,
|
||||
IN UINT16 RouterLifetime
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Address,
|
||||
IN UINT16 RouterLifetime
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -224,8 +224,8 @@ Ip6CreateDefaultRouter (
|
||||
**/
|
||||
VOID
|
||||
Ip6DestroyDefaultRouter (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_DEFAULT_ROUTER *DefaultRouter
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_DEFAULT_ROUTER *DefaultRouter
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -236,7 +236,7 @@ Ip6DestroyDefaultRouter (
|
||||
**/
|
||||
VOID
|
||||
Ip6CleanDefaultRouterList (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -251,8 +251,8 @@ Ip6CleanDefaultRouterList (
|
||||
**/
|
||||
IP6_DEFAULT_ROUTER *
|
||||
Ip6FindDefaultRouter (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Address
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Address
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -289,10 +289,10 @@ Ip6OnDADFinished (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6InitDADProcess (
|
||||
IN IP6_INTERFACE *IpIf,
|
||||
IN IP6_ADDRESS_INFO *AddressInfo,
|
||||
IN IP6_DAD_CALLBACK Callback OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
IN IP6_INTERFACE *IpIf,
|
||||
IN IP6_ADDRESS_INFO *AddressInfo,
|
||||
IN IP6_DAD_CALLBACK Callback OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -309,9 +309,9 @@ Ip6InitDADProcess (
|
||||
**/
|
||||
IP6_DAD_ENTRY *
|
||||
Ip6FindDADEntry (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Target,
|
||||
OUT IP6_INTERFACE **Interface OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Target,
|
||||
OUT IP6_INTERFACE **Interface OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -334,12 +334,12 @@ Ip6FindDADEntry (
|
||||
**/
|
||||
IP6_PREFIX_LIST_ENTRY *
|
||||
Ip6CreatePrefixListEntry (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN OnLinkOrAuto,
|
||||
IN UINT32 ValidLifetime,
|
||||
IN UINT32 PreferredLifetime,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *Prefix
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN OnLinkOrAuto,
|
||||
IN UINT32 ValidLifetime,
|
||||
IN UINT32 PreferredLifetime,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *Prefix
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -377,10 +377,10 @@ Ip6DestroyPrefixListEntry (
|
||||
**/
|
||||
IP6_PREFIX_LIST_ENTRY *
|
||||
Ip6FindPrefixListEntry (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN OnLinkOrAuto,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *Prefix
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN BOOLEAN OnLinkOrAuto,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *Prefix
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -393,8 +393,8 @@ Ip6FindPrefixListEntry (
|
||||
**/
|
||||
VOID
|
||||
Ip6CleanPrefixListTable (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN LIST_ENTRY *ListHead
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN LIST_ENTRY *ListHead
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -413,10 +413,10 @@ Ip6CleanPrefixListTable (
|
||||
**/
|
||||
IP6_NEIGHBOR_ENTRY *
|
||||
Ip6CreateNeighborEntry (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_ARP_CALLBACK CallBack,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Address,
|
||||
IN EFI_MAC_ADDRESS *LinkAddress OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_ARP_CALLBACK CallBack,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Address,
|
||||
IN EFI_MAC_ADDRESS *LinkAddress OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -431,8 +431,8 @@ Ip6CreateNeighborEntry (
|
||||
**/
|
||||
IP6_NEIGHBOR_ENTRY *
|
||||
Ip6FindNeighborEntry (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Address
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Address
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -458,13 +458,13 @@ Ip6FindNeighborEntry (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6FreeNeighborEntry (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_NEIGHBOR_ENTRY *NeighborCache,
|
||||
IN BOOLEAN SendIcmpError,
|
||||
IN BOOLEAN FullFree,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_NEIGHBOR_ENTRY *NeighborCache,
|
||||
IN BOOLEAN SendIcmpError,
|
||||
IN BOOLEAN FullFree,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -493,11 +493,11 @@ Ip6FreeNeighborEntry (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6AddNeighbor (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||
IN UINT32 Timeout,
|
||||
IN BOOLEAN Override
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||
IN UINT32 Timeout,
|
||||
IN BOOLEAN Override
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -521,11 +521,11 @@ Ip6AddNeighbor (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6DelNeighbor (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||
IN UINT32 Timeout,
|
||||
IN BOOLEAN Override
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||
IN UINT32 Timeout,
|
||||
IN BOOLEAN Override
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -544,9 +544,9 @@ Ip6DelNeighbor (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessNeighborSolicit (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -564,9 +564,9 @@ Ip6ProcessNeighborSolicit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessNeighborAdvertise (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -584,9 +584,9 @@ Ip6ProcessNeighborAdvertise (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessRouterAdvertise (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -607,9 +607,9 @@ Ip6ProcessRouterAdvertise (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6ProcessRedirect (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN NET_BUF *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -631,11 +631,11 @@ Ip6ProcessRedirect (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SendRouterSolicit (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress OPTIONAL,
|
||||
IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -658,11 +658,11 @@ Ip6SendRouterSolicit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SendNeighborSolicit (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *SourceAddress,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *SourceAddress,
|
||||
IN EFI_IPv6_ADDRESS *DestinationAddress,
|
||||
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||
IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -690,14 +690,14 @@ Ip6SendNeighborSolicit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SetAddress (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Addr,
|
||||
IN BOOLEAN IsAnycast,
|
||||
IN UINT8 PrefixLength,
|
||||
IN UINT32 ValidLifetime,
|
||||
IN UINT32 PreferredLifetime,
|
||||
IN IP6_DAD_CALLBACK DadCallback OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_IPv6_ADDRESS *Ip6Addr,
|
||||
IN BOOLEAN IsAnycast,
|
||||
IN UINT8 PrefixLength,
|
||||
IN UINT32 ValidLifetime,
|
||||
IN UINT32 PreferredLifetime,
|
||||
IN IP6_DAD_CALLBACK DadCallback OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -712,8 +712,8 @@ Ip6SetAddress (
|
||||
VOID
|
||||
EFIAPI
|
||||
Ip6NdFasterTimerTicking (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -726,7 +726,7 @@ Ip6NdFasterTimerTicking (
|
||||
**/
|
||||
VOID
|
||||
Ip6NdTimerTicking (
|
||||
IN IP6_SERVICE *IpSb
|
||||
IN IP6_SERVICE *IpSb
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -739,7 +739,7 @@ Ip6NdTimerTicking (
|
||||
**/
|
||||
VOID
|
||||
Ip6OnArpResolved (
|
||||
IN VOID *Context
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
|
@@ -12,35 +12,35 @@
|
||||
|
||||
#include <Guid/Ip6ConfigHii.h>
|
||||
|
||||
#define FORMID_MAIN_FORM 1
|
||||
#define FORMID_MANUAL_CONFIG_FORM 2
|
||||
#define FORMID_HEAD_FORM 3
|
||||
#define FORMID_MAIN_FORM 1
|
||||
#define FORMID_MANUAL_CONFIG_FORM 2
|
||||
#define FORMID_HEAD_FORM 3
|
||||
|
||||
#define IP6_POLICY_AUTO 0
|
||||
#define IP6_POLICY_MANUAL 1
|
||||
#define DAD_MAX_TRANSMIT_COUNT 10
|
||||
#define IP6_POLICY_AUTO 0
|
||||
#define IP6_POLICY_MANUAL 1
|
||||
#define DAD_MAX_TRANSMIT_COUNT 10
|
||||
|
||||
#define KEY_INTERFACE_ID 0x101
|
||||
#define KEY_MANUAL_ADDRESS 0x102
|
||||
#define KEY_GATEWAY_ADDRESS 0x103
|
||||
#define KEY_DNS_ADDRESS 0x104
|
||||
#define KEY_SAVE_CHANGES 0x105
|
||||
#define KEY_SAVE_CONFIG_CHANGES 0x106
|
||||
#define KEY_IGNORE_CONFIG_CHANGES 0x107
|
||||
#define KEY_GET_CURRENT_SETTING 0x108
|
||||
#define KEY_INTERFACE_ID 0x101
|
||||
#define KEY_MANUAL_ADDRESS 0x102
|
||||
#define KEY_GATEWAY_ADDRESS 0x103
|
||||
#define KEY_DNS_ADDRESS 0x104
|
||||
#define KEY_SAVE_CHANGES 0x105
|
||||
#define KEY_SAVE_CONFIG_CHANGES 0x106
|
||||
#define KEY_IGNORE_CONFIG_CHANGES 0x107
|
||||
#define KEY_GET_CURRENT_SETTING 0x108
|
||||
|
||||
#define HOST_ADDRESS_LABEL 0x9000
|
||||
#define ROUTE_TABLE_LABEL 0xa000
|
||||
#define GATEWAY_ADDRESS_LABEL 0xb000
|
||||
#define DNS_ADDRESS_LABEL 0xc000
|
||||
#define LABEL_END 0xffff
|
||||
#define HOST_ADDRESS_LABEL 0x9000
|
||||
#define ROUTE_TABLE_LABEL 0xa000
|
||||
#define GATEWAY_ADDRESS_LABEL 0xb000
|
||||
#define DNS_ADDRESS_LABEL 0xc000
|
||||
#define LABEL_END 0xffff
|
||||
|
||||
#define INTERFACE_ID_STR_MIN_SIZE 1
|
||||
#define INTERFACE_ID_STR_MAX_SIZE 23
|
||||
#define INTERFACE_ID_STR_STORAGE 25
|
||||
#define IP6_STR_MAX_SIZE 40
|
||||
#define ADDRESS_STR_MIN_SIZE 2
|
||||
#define ADDRESS_STR_MAX_SIZE 255
|
||||
#define INTERFACE_ID_STR_MIN_SIZE 1
|
||||
#define INTERFACE_ID_STR_MAX_SIZE 23
|
||||
#define INTERFACE_ID_STR_STORAGE 25
|
||||
#define IP6_STR_MAX_SIZE 40
|
||||
#define ADDRESS_STR_MIN_SIZE 2
|
||||
#define ADDRESS_STR_MAX_SIZE 255
|
||||
|
||||
///
|
||||
/// IP6_CONFIG_IFR_NVDATA contains the IP6 configure
|
||||
@@ -48,16 +48,15 @@
|
||||
///
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
UINT8 IfType; ///< interface type
|
||||
UINT8 Padding[3];
|
||||
UINT32 Policy; ///< manual or automatic
|
||||
UINT32 DadTransmitCount; ///< dad transmits count
|
||||
CHAR16 InterfaceId[INTERFACE_ID_STR_STORAGE]; ///< alternative interface id
|
||||
CHAR16 ManualAddress[ADDRESS_STR_MAX_SIZE]; ///< IP addresses
|
||||
CHAR16 GatewayAddress[ADDRESS_STR_MAX_SIZE]; ///< Gateway address
|
||||
CHAR16 DnsAddress[ADDRESS_STR_MAX_SIZE]; ///< DNS server address
|
||||
UINT8 IfType; ///< interface type
|
||||
UINT8 Padding[3];
|
||||
UINT32 Policy; ///< manual or automatic
|
||||
UINT32 DadTransmitCount; ///< dad transmits count
|
||||
CHAR16 InterfaceId[INTERFACE_ID_STR_STORAGE]; ///< alternative interface id
|
||||
CHAR16 ManualAddress[ADDRESS_STR_MAX_SIZE]; ///< IP addresses
|
||||
CHAR16 GatewayAddress[ADDRESS_STR_MAX_SIZE]; ///< Gateway address
|
||||
CHAR16 DnsAddress[ADDRESS_STR_MAX_SIZE]; ///< DNS server address
|
||||
} IP6_CONFIG_IFR_NVDATA;
|
||||
#pragma pack()
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -28,15 +28,15 @@
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsOptionValid (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN NET_BUF *Packet,
|
||||
IN UINT8 *Option,
|
||||
IN UINT8 OptionLen,
|
||||
IN UINT32 Pointer
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN NET_BUF *Packet,
|
||||
IN UINT8 *Option,
|
||||
IN UINT8 OptionLen,
|
||||
IN UINT32 Pointer
|
||||
)
|
||||
{
|
||||
UINT8 Offset;
|
||||
UINT8 OptionType;
|
||||
UINT8 Offset;
|
||||
UINT8 OptionType;
|
||||
|
||||
Offset = 0;
|
||||
|
||||
@@ -44,68 +44,67 @@ Ip6IsOptionValid (
|
||||
OptionType = *(Option + Offset);
|
||||
|
||||
switch (OptionType) {
|
||||
case Ip6OptionPad1:
|
||||
//
|
||||
// It is a Pad1 option
|
||||
//
|
||||
Offset++;
|
||||
break;
|
||||
case Ip6OptionPadN:
|
||||
//
|
||||
// It is a PadN option
|
||||
//
|
||||
Offset = (UINT8) (Offset + *(Option + Offset + 1) + 2);
|
||||
break;
|
||||
case Ip6OptionRouterAlert:
|
||||
//
|
||||
// It is a Router Alert Option
|
||||
//
|
||||
Offset += 4;
|
||||
break;
|
||||
default:
|
||||
//
|
||||
// The highest-order two bits specify the action must be taken if
|
||||
// the processing IPv6 node does not recognize the option type.
|
||||
//
|
||||
switch (OptionType & Ip6OptionMask) {
|
||||
case Ip6OptionSkip:
|
||||
Offset = (UINT8) (Offset + *(Option + Offset + 1));
|
||||
case Ip6OptionPad1:
|
||||
//
|
||||
// It is a Pad1 option
|
||||
//
|
||||
Offset++;
|
||||
break;
|
||||
case Ip6OptionDiscard:
|
||||
return FALSE;
|
||||
case Ip6OptionParameterProblem:
|
||||
Pointer = Pointer + Offset + sizeof (EFI_IP6_HEADER);
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
2,
|
||||
&Pointer
|
||||
);
|
||||
return FALSE;
|
||||
case Ip6OptionMask:
|
||||
if (!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress)) {
|
||||
Pointer = Pointer + Offset + sizeof (EFI_IP6_HEADER);
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
2,
|
||||
&Pointer
|
||||
);
|
||||
case Ip6OptionPadN:
|
||||
//
|
||||
// It is a PadN option
|
||||
//
|
||||
Offset = (UINT8)(Offset + *(Option + Offset + 1) + 2);
|
||||
break;
|
||||
case Ip6OptionRouterAlert:
|
||||
//
|
||||
// It is a Router Alert Option
|
||||
//
|
||||
Offset += 4;
|
||||
break;
|
||||
default:
|
||||
//
|
||||
// The highest-order two bits specify the action must be taken if
|
||||
// the processing IPv6 node does not recognize the option type.
|
||||
//
|
||||
switch (OptionType & Ip6OptionMask) {
|
||||
case Ip6OptionSkip:
|
||||
Offset = (UINT8)(Offset + *(Option + Offset + 1));
|
||||
break;
|
||||
case Ip6OptionDiscard:
|
||||
return FALSE;
|
||||
case Ip6OptionParameterProblem:
|
||||
Pointer = Pointer + Offset + sizeof (EFI_IP6_HEADER);
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
2,
|
||||
&Pointer
|
||||
);
|
||||
return FALSE;
|
||||
case Ip6OptionMask:
|
||||
if (!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress)) {
|
||||
Pointer = Pointer + Offset + sizeof (EFI_IP6_HEADER);
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
2,
|
||||
&Pointer
|
||||
);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@@ -125,13 +124,13 @@ Ip6IsOptionValid (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsNDOptionValid (
|
||||
IN UINT8 *Option,
|
||||
IN UINT16 OptionLen
|
||||
IN UINT8 *Option,
|
||||
IN UINT16 OptionLen
|
||||
)
|
||||
{
|
||||
UINT32 Offset;
|
||||
UINT16 Length;
|
||||
IP6_OPTION_HEADER *OptionHeader;
|
||||
UINT32 Offset;
|
||||
UINT16 Length;
|
||||
IP6_OPTION_HEADER *OptionHeader;
|
||||
|
||||
if (Option == NULL) {
|
||||
ASSERT (Option != NULL);
|
||||
@@ -146,50 +145,54 @@ Ip6IsNDOptionValid (
|
||||
// fit within the input buffer.
|
||||
//
|
||||
while (Offset + sizeof (IP6_OPTION_HEADER) - 1 < OptionLen) {
|
||||
OptionHeader = (IP6_OPTION_HEADER*) (Option + Offset);
|
||||
Length = (UINT16) OptionHeader->Length * 8;
|
||||
OptionHeader = (IP6_OPTION_HEADER *)(Option + Offset);
|
||||
Length = (UINT16)OptionHeader->Length * 8;
|
||||
|
||||
switch (OptionHeader->Type) {
|
||||
case Ip6OptionPrefixInfo:
|
||||
if (Length != 32) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case Ip6OptionPrefixInfo:
|
||||
if (Length != 32) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
case Ip6OptionMtu:
|
||||
if (Length != 8) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
// RFC 4861 states that Length field cannot be 0.
|
||||
if (Length == 0) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case Ip6OptionMtu:
|
||||
if (Length != 8) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
// RFC 4861 states that Length field cannot be 0.
|
||||
if (Length == 0) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Check whether recognized options are within the input buffer's scope.
|
||||
//
|
||||
switch (OptionHeader->Type) {
|
||||
case Ip6OptionEtherSource:
|
||||
case Ip6OptionEtherTarget:
|
||||
case Ip6OptionPrefixInfo:
|
||||
case Ip6OptionRedirected:
|
||||
case Ip6OptionMtu:
|
||||
if (Offset + Length > (UINT32) OptionLen) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case Ip6OptionEtherSource:
|
||||
case Ip6OptionEtherTarget:
|
||||
case Ip6OptionPrefixInfo:
|
||||
case Ip6OptionRedirected:
|
||||
case Ip6OptionMtu:
|
||||
if (Offset + Length > (UINT32)OptionLen) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
default:
|
||||
//
|
||||
// Unrecognized options can be either valid (but unused) or invalid
|
||||
// (garbage in between or right after valid options). Silently ignore.
|
||||
//
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
//
|
||||
// Unrecognized options can be either valid (but unused) or invalid
|
||||
// (garbage in between or right after valid options). Silently ignore.
|
||||
//
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -202,7 +205,6 @@ Ip6IsNDOptionValid (
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Validate whether the NextHeader is a known valid protocol or one of the user configured
|
||||
protocols from the upper layer.
|
||||
@@ -216,18 +218,19 @@ Ip6IsNDOptionValid (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsValidProtocol (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN UINT8 NextHeader
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN UINT8 NextHeader
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_PROTOCOL *IpInstance;
|
||||
|
||||
if (NextHeader == EFI_IP_PROTO_TCP ||
|
||||
NextHeader == EFI_IP_PROTO_UDP ||
|
||||
NextHeader == IP6_ICMP ||
|
||||
NextHeader == IP6_ESP
|
||||
) {
|
||||
if ((NextHeader == EFI_IP_PROTO_TCP) ||
|
||||
(NextHeader == EFI_IP_PROTO_UDP) ||
|
||||
(NextHeader == IP6_ICMP) ||
|
||||
(NextHeader == IP6_ESP)
|
||||
)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -281,29 +284,29 @@ Ip6IsValidProtocol (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsExtsValid (
|
||||
IN IP6_SERVICE *IpSb OPTIONAL,
|
||||
IN NET_BUF *Packet OPTIONAL,
|
||||
IN UINT8 *NextHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN BOOLEAN Rcvd,
|
||||
OUT UINT32 *FormerHeader OPTIONAL,
|
||||
OUT UINT8 **LastHeader,
|
||||
OUT UINT32 *RealExtsLen OPTIONAL,
|
||||
OUT UINT32 *UnFragmentLen OPTIONAL,
|
||||
OUT BOOLEAN *Fragmented OPTIONAL
|
||||
IN IP6_SERVICE *IpSb OPTIONAL,
|
||||
IN NET_BUF *Packet OPTIONAL,
|
||||
IN UINT8 *NextHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN BOOLEAN Rcvd,
|
||||
OUT UINT32 *FormerHeader OPTIONAL,
|
||||
OUT UINT8 **LastHeader,
|
||||
OUT UINT32 *RealExtsLen OPTIONAL,
|
||||
OUT UINT32 *UnFragmentLen OPTIONAL,
|
||||
OUT BOOLEAN *Fragmented OPTIONAL
|
||||
)
|
||||
{
|
||||
UINT32 Pointer;
|
||||
UINT32 Offset;
|
||||
UINT8 *Option;
|
||||
UINT8 OptionLen;
|
||||
BOOLEAN Flag;
|
||||
UINT8 CountD;
|
||||
UINT8 CountA;
|
||||
IP6_FRAGMENT_HEADER *FragmentHead;
|
||||
UINT16 FragmentOffset;
|
||||
IP6_ROUTING_HEADER *RoutingHead;
|
||||
UINT32 Pointer;
|
||||
UINT32 Offset;
|
||||
UINT8 *Option;
|
||||
UINT8 OptionLen;
|
||||
BOOLEAN Flag;
|
||||
UINT8 CountD;
|
||||
UINT8 CountA;
|
||||
IP6_FRAGMENT_HEADER *FragmentHead;
|
||||
UINT16 FragmentOffset;
|
||||
IP6_ROUTING_HEADER *RoutingHead;
|
||||
|
||||
if (RealExtsLen != NULL) {
|
||||
*RealExtsLen = 0;
|
||||
@@ -319,11 +322,11 @@ Ip6IsExtsValid (
|
||||
|
||||
*LastHeader = NextHeader;
|
||||
|
||||
if (ExtHdrs == NULL && ExtHdrsLen == 0) {
|
||||
if ((ExtHdrs == NULL) && (ExtHdrsLen == 0)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if ((ExtHdrs == NULL && ExtHdrsLen != 0) || (ExtHdrs != NULL && ExtHdrsLen == 0)) {
|
||||
if (((ExtHdrs == NULL) && (ExtHdrsLen != 0)) || ((ExtHdrs != NULL) && (ExtHdrsLen == 0))) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -334,25 +337,228 @@ Ip6IsExtsValid (
|
||||
CountA = 0;
|
||||
|
||||
while (Offset <= ExtHdrsLen) {
|
||||
|
||||
switch (*NextHeader) {
|
||||
case IP6_HOP_BY_HOP:
|
||||
if (Offset != 0) {
|
||||
if (!Rcvd) {
|
||||
case IP6_HOP_BY_HOP:
|
||||
if (Offset != 0) {
|
||||
if (!Rcvd) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// Hop-by-Hop Options header is restricted to appear immediately after an IPv6 header only.
|
||||
// If not, generate a ICMP parameter problem message with code value of 1.
|
||||
//
|
||||
if (Pointer == 0) {
|
||||
Pointer = sizeof (EFI_IP6_HEADER);
|
||||
} else {
|
||||
Pointer = Offset + sizeof (EFI_IP6_HEADER);
|
||||
}
|
||||
|
||||
if ((IpSb != NULL) && (Packet != NULL) &&
|
||||
!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress))
|
||||
{
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
1,
|
||||
&Pointer
|
||||
);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Flag = TRUE;
|
||||
|
||||
//
|
||||
// Fall through
|
||||
//
|
||||
case IP6_DESTINATION:
|
||||
if (*NextHeader == IP6_DESTINATION) {
|
||||
CountD++;
|
||||
}
|
||||
|
||||
if (CountD > 2) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
NextHeader = ExtHdrs + Offset;
|
||||
Pointer = Offset;
|
||||
|
||||
Offset++;
|
||||
Option = ExtHdrs + Offset;
|
||||
OptionLen = (UINT8)((*Option + 1) * 8 - 2);
|
||||
Option++;
|
||||
Offset++;
|
||||
|
||||
if ((IpSb != NULL) && (Packet != NULL) && !Ip6IsOptionValid (IpSb, Packet, Option, OptionLen, Offset)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Offset = Offset + OptionLen;
|
||||
|
||||
if (Flag) {
|
||||
if (UnFragmentLen != NULL) {
|
||||
*UnFragmentLen = Offset;
|
||||
}
|
||||
|
||||
Flag = FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case IP6_ROUTING:
|
||||
NextHeader = ExtHdrs + Offset;
|
||||
RoutingHead = (IP6_ROUTING_HEADER *)NextHeader;
|
||||
|
||||
//
|
||||
// Hop-by-Hop Options header is restricted to appear immediately after an IPv6 header only.
|
||||
// If not, generate a ICMP parameter problem message with code value of 1.
|
||||
// Type 0 routing header is defined in RFC2460 and deprecated in RFC5095.
|
||||
// Thus all routing types are processed as unrecognized.
|
||||
//
|
||||
if (Pointer == 0) {
|
||||
Pointer = sizeof (EFI_IP6_HEADER);
|
||||
if (RoutingHead->SegmentsLeft == 0) {
|
||||
//
|
||||
// Ignore the routing header and proceed to process the next header.
|
||||
//
|
||||
Offset = Offset + (RoutingHead->HeaderLen + 1) * 8;
|
||||
|
||||
if (UnFragmentLen != NULL) {
|
||||
*UnFragmentLen = Offset;
|
||||
}
|
||||
} else {
|
||||
Pointer = Offset + sizeof (EFI_IP6_HEADER);
|
||||
//
|
||||
// Discard the packet and send an ICMP Parameter Problem, Code 0, message
|
||||
// to the packet's source address, pointing to the unrecognized routing
|
||||
// type.
|
||||
//
|
||||
Pointer = Offset + 2 + sizeof (EFI_IP6_HEADER);
|
||||
if ((IpSb != NULL) && (Packet != NULL) &&
|
||||
!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress))
|
||||
{
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
0,
|
||||
&Pointer
|
||||
);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case IP6_FRAGMENT:
|
||||
|
||||
//
|
||||
// RFC2402, AH header should after fragment header.
|
||||
//
|
||||
if (CountA > 1) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// RFC2460, ICMP Parameter Problem message with code 0 should be sent
|
||||
// if the length of a fragment is not a multiple of 8 octets and the M
|
||||
// flag of that fragment is 1, pointing to the Payload length field of the
|
||||
// fragment packet.
|
||||
//
|
||||
if ((IpSb != NULL) && (Packet != NULL) && ((ExtHdrsLen % 8) != 0)) {
|
||||
//
|
||||
// Check whether it is the last fragment.
|
||||
//
|
||||
FragmentHead = (IP6_FRAGMENT_HEADER *)(ExtHdrs + Offset);
|
||||
if (FragmentHead == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
FragmentOffset = NTOHS (FragmentHead->FragmentOffset);
|
||||
|
||||
if (((FragmentOffset & 0x1) == 0x1) &&
|
||||
!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress))
|
||||
{
|
||||
Pointer = sizeof (UINT32);
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
0,
|
||||
&Pointer
|
||||
);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (Fragmented != NULL) {
|
||||
*Fragmented = TRUE;
|
||||
}
|
||||
|
||||
if (Rcvd && (FormerHeader != NULL)) {
|
||||
*FormerHeader = (UINT32)(NextHeader - ExtHdrs);
|
||||
}
|
||||
|
||||
NextHeader = ExtHdrs + Offset;
|
||||
Offset = Offset + 8;
|
||||
break;
|
||||
|
||||
case IP6_AH:
|
||||
if (++CountA > 1) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Option = ExtHdrs + Offset;
|
||||
NextHeader = Option;
|
||||
Option++;
|
||||
//
|
||||
// RFC2402, Payload length is specified in 32-bit words, minus "2".
|
||||
//
|
||||
OptionLen = (UINT8)((*Option + 2) * 4);
|
||||
Offset = Offset + OptionLen;
|
||||
break;
|
||||
|
||||
case IP6_NO_NEXT_HEADER:
|
||||
*LastHeader = NextHeader;
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (Ip6IsValidProtocol (IpSb, *NextHeader)) {
|
||||
*LastHeader = NextHeader;
|
||||
|
||||
if (RealExtsLen != NULL) {
|
||||
*RealExtsLen = Offset;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
// The Next Header value is unrecognized by the node, discard the packet and
|
||||
// send an ICMP parameter problem message with code value of 1.
|
||||
//
|
||||
if (Offset == 0) {
|
||||
//
|
||||
// The Next Header directly follows IPv6 basic header.
|
||||
//
|
||||
Pointer = 6;
|
||||
} else {
|
||||
if (Pointer == 0) {
|
||||
Pointer = sizeof (EFI_IP6_HEADER);
|
||||
} else {
|
||||
Pointer = Offset + sizeof (EFI_IP6_HEADER);
|
||||
}
|
||||
}
|
||||
|
||||
if ((IpSb != NULL) && (Packet != NULL) &&
|
||||
!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress)) {
|
||||
!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress))
|
||||
{
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
@@ -363,207 +569,8 @@ Ip6IsExtsValid (
|
||||
&Pointer
|
||||
);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Flag = TRUE;
|
||||
|
||||
//
|
||||
// Fall through
|
||||
//
|
||||
case IP6_DESTINATION:
|
||||
if (*NextHeader == IP6_DESTINATION) {
|
||||
CountD++;
|
||||
}
|
||||
|
||||
if (CountD > 2) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
NextHeader = ExtHdrs + Offset;
|
||||
Pointer = Offset;
|
||||
|
||||
Offset++;
|
||||
Option = ExtHdrs + Offset;
|
||||
OptionLen = (UINT8) ((*Option + 1) * 8 - 2);
|
||||
Option++;
|
||||
Offset++;
|
||||
|
||||
if (IpSb != NULL && Packet != NULL && !Ip6IsOptionValid (IpSb, Packet, Option, OptionLen, Offset)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Offset = Offset + OptionLen;
|
||||
|
||||
if (Flag) {
|
||||
if (UnFragmentLen != NULL) {
|
||||
*UnFragmentLen = Offset;
|
||||
}
|
||||
|
||||
Flag = FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case IP6_ROUTING:
|
||||
NextHeader = ExtHdrs + Offset;
|
||||
RoutingHead = (IP6_ROUTING_HEADER *) NextHeader;
|
||||
|
||||
//
|
||||
// Type 0 routing header is defined in RFC2460 and deprecated in RFC5095.
|
||||
// Thus all routing types are processed as unrecognized.
|
||||
//
|
||||
if (RoutingHead->SegmentsLeft == 0) {
|
||||
//
|
||||
// Ignore the routing header and proceed to process the next header.
|
||||
//
|
||||
Offset = Offset + (RoutingHead->HeaderLen + 1) * 8;
|
||||
|
||||
if (UnFragmentLen != NULL) {
|
||||
*UnFragmentLen = Offset;
|
||||
}
|
||||
|
||||
} else {
|
||||
//
|
||||
// Discard the packet and send an ICMP Parameter Problem, Code 0, message
|
||||
// to the packet's source address, pointing to the unrecognized routing
|
||||
// type.
|
||||
//
|
||||
Pointer = Offset + 2 + sizeof (EFI_IP6_HEADER);
|
||||
if ((IpSb != NULL) && (Packet != NULL) &&
|
||||
!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress)) {
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
0,
|
||||
&Pointer
|
||||
);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case IP6_FRAGMENT:
|
||||
|
||||
//
|
||||
// RFC2402, AH header should after fragment header.
|
||||
//
|
||||
if (CountA > 1) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// RFC2460, ICMP Parameter Problem message with code 0 should be sent
|
||||
// if the length of a fragment is not a multiple of 8 octets and the M
|
||||
// flag of that fragment is 1, pointing to the Payload length field of the
|
||||
// fragment packet.
|
||||
//
|
||||
if (IpSb != NULL && Packet != NULL && (ExtHdrsLen % 8) != 0) {
|
||||
//
|
||||
// Check whether it is the last fragment.
|
||||
//
|
||||
FragmentHead = (IP6_FRAGMENT_HEADER *) (ExtHdrs + Offset);
|
||||
if (FragmentHead == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
FragmentOffset = NTOHS (FragmentHead->FragmentOffset);
|
||||
|
||||
if (((FragmentOffset & 0x1) == 0x1) &&
|
||||
!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress)) {
|
||||
Pointer = sizeof (UINT32);
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
0,
|
||||
&Pointer
|
||||
);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (Fragmented != NULL) {
|
||||
*Fragmented = TRUE;
|
||||
}
|
||||
|
||||
if (Rcvd && FormerHeader != NULL) {
|
||||
*FormerHeader = (UINT32) (NextHeader - ExtHdrs);
|
||||
}
|
||||
|
||||
NextHeader = ExtHdrs + Offset;
|
||||
Offset = Offset + 8;
|
||||
break;
|
||||
|
||||
case IP6_AH:
|
||||
if (++CountA > 1) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Option = ExtHdrs + Offset;
|
||||
NextHeader = Option;
|
||||
Option++;
|
||||
//
|
||||
// RFC2402, Payload length is specified in 32-bit words, minus "2".
|
||||
//
|
||||
OptionLen = (UINT8) ((*Option + 2) * 4);
|
||||
Offset = Offset + OptionLen;
|
||||
break;
|
||||
|
||||
case IP6_NO_NEXT_HEADER:
|
||||
*LastHeader = NextHeader;
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (Ip6IsValidProtocol (IpSb, *NextHeader)) {
|
||||
|
||||
*LastHeader = NextHeader;
|
||||
|
||||
if (RealExtsLen != NULL) {
|
||||
*RealExtsLen = Offset;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
// The Next Header value is unrecognized by the node, discard the packet and
|
||||
// send an ICMP parameter problem message with code value of 1.
|
||||
//
|
||||
if (Offset == 0) {
|
||||
//
|
||||
// The Next Header directly follows IPv6 basic header.
|
||||
//
|
||||
Pointer = 6;
|
||||
} else {
|
||||
if (Pointer == 0) {
|
||||
Pointer = sizeof (EFI_IP6_HEADER);
|
||||
} else {
|
||||
Pointer = Offset + sizeof (EFI_IP6_HEADER);
|
||||
}
|
||||
}
|
||||
|
||||
if ((IpSb != NULL) && (Packet != NULL) &&
|
||||
!IP6_IS_MULTICAST (&Packet->Ip.Ip6->DestinationAddress)) {
|
||||
Ip6SendIcmpError (
|
||||
IpSb,
|
||||
Packet,
|
||||
NULL,
|
||||
&Packet->Ip.Ip6->SourceAddress,
|
||||
ICMP_V6_PARAMETER_PROBLEM,
|
||||
1,
|
||||
&Pointer
|
||||
);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -592,12 +599,12 @@ Ip6IsExtsValid (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6FillHopByHop (
|
||||
OUT UINT8 *Buffer,
|
||||
IN OUT UINTN *BufferLen,
|
||||
IN UINT8 NextHeader
|
||||
OUT UINT8 *Buffer,
|
||||
IN OUT UINTN *BufferLen,
|
||||
IN UINT8 NextHeader
|
||||
)
|
||||
{
|
||||
UINT8 BufferArray[8];
|
||||
UINT8 BufferArray[8];
|
||||
|
||||
if (*BufferLen < 8) {
|
||||
*BufferLen = 8;
|
||||
@@ -640,23 +647,23 @@ Ip6FillHopByHop (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6FillFragmentHeader (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN UINT8 NextHeader,
|
||||
IN UINT8 LastHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN UINT16 FragmentOffset,
|
||||
OUT UINT8 **UpdatedExtHdrs
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN UINT8 NextHeader,
|
||||
IN UINT8 LastHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN UINT16 FragmentOffset,
|
||||
OUT UINT8 **UpdatedExtHdrs
|
||||
)
|
||||
{
|
||||
UINT32 Length;
|
||||
UINT8 *Buffer;
|
||||
UINT32 FormerHeader;
|
||||
UINT32 Offset;
|
||||
UINT32 Part1Len;
|
||||
UINT32 HeaderLen;
|
||||
UINT8 Current;
|
||||
IP6_FRAGMENT_HEADER FragmentHead;
|
||||
UINT32 Length;
|
||||
UINT8 *Buffer;
|
||||
UINT32 FormerHeader;
|
||||
UINT32 Offset;
|
||||
UINT32 Part1Len;
|
||||
UINT32 HeaderLen;
|
||||
UINT8 Current;
|
||||
IP6_FRAGMENT_HEADER FragmentHead;
|
||||
|
||||
if (UpdatedExtHdrs == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -668,82 +675,81 @@ Ip6FillFragmentHeader (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Offset = 0;
|
||||
Part1Len = 0;
|
||||
FormerHeader = 0;
|
||||
Current = NextHeader;
|
||||
Offset = 0;
|
||||
Part1Len = 0;
|
||||
FormerHeader = 0;
|
||||
Current = NextHeader;
|
||||
|
||||
while ((ExtHdrs != NULL) && (Offset <= ExtHdrsLen)) {
|
||||
switch (NextHeader) {
|
||||
case IP6_ROUTING:
|
||||
case IP6_HOP_BY_HOP:
|
||||
case IP6_DESTINATION:
|
||||
Current = NextHeader;
|
||||
NextHeader = *(ExtHdrs + Offset);
|
||||
case IP6_ROUTING:
|
||||
case IP6_HOP_BY_HOP:
|
||||
case IP6_DESTINATION:
|
||||
Current = NextHeader;
|
||||
NextHeader = *(ExtHdrs + Offset);
|
||||
|
||||
if ((Current == IP6_DESTINATION) && (NextHeader != IP6_ROUTING)) {
|
||||
//
|
||||
// Destination Options header should occur at most twice, once before
|
||||
// a Routing header and once before the upper-layer header. Here we
|
||||
// find the one before the upper-layer header. Insert the Fragment
|
||||
// Header before it.
|
||||
//
|
||||
CopyMem (Buffer, ExtHdrs, Part1Len);
|
||||
*(Buffer + FormerHeader) = IP6_FRAGMENT;
|
||||
//
|
||||
// Exit the loop.
|
||||
//
|
||||
Offset = ExtHdrsLen + 1;
|
||||
if ((Current == IP6_DESTINATION) && (NextHeader != IP6_ROUTING)) {
|
||||
//
|
||||
// Destination Options header should occur at most twice, once before
|
||||
// a Routing header and once before the upper-layer header. Here we
|
||||
// find the one before the upper-layer header. Insert the Fragment
|
||||
// Header before it.
|
||||
//
|
||||
CopyMem (Buffer, ExtHdrs, Part1Len);
|
||||
*(Buffer + FormerHeader) = IP6_FRAGMENT;
|
||||
//
|
||||
// Exit the loop.
|
||||
//
|
||||
Offset = ExtHdrsLen + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
FormerHeader = Offset;
|
||||
HeaderLen = (*(ExtHdrs + Offset + 1) + 1) * 8;
|
||||
Part1Len = Part1Len + HeaderLen;
|
||||
Offset = Offset + HeaderLen;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
FormerHeader = Offset;
|
||||
HeaderLen = (*(ExtHdrs + Offset + 1) + 1) * 8;
|
||||
Part1Len = Part1Len + HeaderLen;
|
||||
Offset = Offset + HeaderLen;
|
||||
break;
|
||||
|
||||
case IP6_FRAGMENT:
|
||||
Current = NextHeader;
|
||||
|
||||
if (Part1Len != 0) {
|
||||
CopyMem (Buffer, ExtHdrs, Part1Len);
|
||||
}
|
||||
|
||||
*(Buffer + FormerHeader) = IP6_FRAGMENT;
|
||||
|
||||
//
|
||||
// Exit the loop.
|
||||
//
|
||||
Offset = ExtHdrsLen + 1;
|
||||
break;
|
||||
|
||||
case IP6_AH:
|
||||
Current = NextHeader;
|
||||
NextHeader = *(ExtHdrs + Offset);
|
||||
//
|
||||
// RFC2402, Payload length is specified in 32-bit words, minus "2".
|
||||
//
|
||||
HeaderLen = (*(ExtHdrs + Offset + 1) + 2) * 4;
|
||||
Part1Len = Part1Len + HeaderLen;
|
||||
Offset = Offset + HeaderLen;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (Ip6IsValidProtocol (IpSb, NextHeader)) {
|
||||
case IP6_FRAGMENT:
|
||||
Current = NextHeader;
|
||||
CopyMem (Buffer, ExtHdrs, Part1Len);
|
||||
|
||||
if (Part1Len != 0) {
|
||||
CopyMem (Buffer, ExtHdrs, Part1Len);
|
||||
}
|
||||
|
||||
*(Buffer + FormerHeader) = IP6_FRAGMENT;
|
||||
|
||||
//
|
||||
// Exit the loop.
|
||||
//
|
||||
Offset = ExtHdrsLen + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
FreePool (Buffer);
|
||||
return EFI_UNSUPPORTED;
|
||||
case IP6_AH:
|
||||
Current = NextHeader;
|
||||
NextHeader = *(ExtHdrs + Offset);
|
||||
//
|
||||
// RFC2402, Payload length is specified in 32-bit words, minus "2".
|
||||
//
|
||||
HeaderLen = (*(ExtHdrs + Offset + 1) + 2) * 4;
|
||||
Part1Len = Part1Len + HeaderLen;
|
||||
Offset = Offset + HeaderLen;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (Ip6IsValidProtocol (IpSb, NextHeader)) {
|
||||
Current = NextHeader;
|
||||
CopyMem (Buffer, ExtHdrs, Part1Len);
|
||||
*(Buffer + FormerHeader) = IP6_FRAGMENT;
|
||||
//
|
||||
// Exit the loop.
|
||||
//
|
||||
Offset = ExtHdrsLen + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
FreePool (Buffer);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -778,4 +784,3 @@ Ip6FillFragmentHeader (
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@@ -10,20 +10,20 @@
|
||||
#ifndef __EFI_IP6_OPTION_H__
|
||||
#define __EFI_IP6_OPTION_H__
|
||||
|
||||
#define IP6_FRAGMENT_OFFSET_MASK (~0x3)
|
||||
#define IP6_FRAGMENT_OFFSET_MASK (~0x3)
|
||||
|
||||
typedef struct _IP6_FRAGMENT_HEADER {
|
||||
UINT8 NextHeader;
|
||||
UINT8 Reserved;
|
||||
UINT16 FragmentOffset;
|
||||
UINT32 Identification;
|
||||
UINT8 NextHeader;
|
||||
UINT8 Reserved;
|
||||
UINT16 FragmentOffset;
|
||||
UINT32 Identification;
|
||||
} IP6_FRAGMENT_HEADER;
|
||||
|
||||
typedef struct _IP6_ROUTING_HEADER {
|
||||
UINT8 NextHeader;
|
||||
UINT8 HeaderLen;
|
||||
UINT8 RoutingType;
|
||||
UINT8 SegmentsLeft;
|
||||
UINT8 NextHeader;
|
||||
UINT8 HeaderLen;
|
||||
UINT8 RoutingType;
|
||||
UINT8 SegmentsLeft;
|
||||
} IP6_ROUTING_HEADER;
|
||||
|
||||
typedef enum {
|
||||
@@ -35,11 +35,11 @@ typedef enum {
|
||||
Ip6OptionParameterProblem = 0x80,
|
||||
Ip6OptionMask = 0xc0,
|
||||
|
||||
Ip6OptionEtherSource = 1,
|
||||
Ip6OptionEtherTarget = 2,
|
||||
Ip6OptionPrefixInfo = 3,
|
||||
Ip6OptionRedirected = 4,
|
||||
Ip6OptionMtu = 5
|
||||
Ip6OptionEtherSource = 1,
|
||||
Ip6OptionEtherTarget = 2,
|
||||
Ip6OptionPrefixInfo = 3,
|
||||
Ip6OptionRedirected = 4,
|
||||
Ip6OptionMtu = 5
|
||||
} IP6_OPTION_TYPE;
|
||||
|
||||
/**
|
||||
@@ -72,17 +72,17 @@ typedef enum {
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsExtsValid (
|
||||
IN IP6_SERVICE *IpSb OPTIONAL,
|
||||
IN NET_BUF *Packet OPTIONAL,
|
||||
IN UINT8 *NextHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN BOOLEAN Rcvd,
|
||||
OUT UINT32 *FormerHeader OPTIONAL,
|
||||
OUT UINT8 **LastHeader,
|
||||
OUT UINT32 *RealExtsLen OPTIONAL,
|
||||
OUT UINT32 *UnFragmentLen OPTIONAL,
|
||||
OUT BOOLEAN *Fragmented OPTIONAL
|
||||
IN IP6_SERVICE *IpSb OPTIONAL,
|
||||
IN NET_BUF *Packet OPTIONAL,
|
||||
IN UINT8 *NextHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN BOOLEAN Rcvd,
|
||||
OUT UINT32 *FormerHeader OPTIONAL,
|
||||
OUT UINT8 **LastHeader,
|
||||
OUT UINT32 *RealExtsLen OPTIONAL,
|
||||
OUT UINT32 *UnFragmentLen OPTIONAL,
|
||||
OUT BOOLEAN *Fragmented OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -101,9 +101,9 @@ Ip6IsExtsValid (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6FillHopByHop (
|
||||
OUT UINT8 *Buffer,
|
||||
IN OUT UINTN *BufferLen,
|
||||
IN UINT8 NextHeader
|
||||
OUT UINT8 *Buffer,
|
||||
IN OUT UINTN *BufferLen,
|
||||
IN UINT8 NextHeader
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -127,13 +127,13 @@ Ip6FillHopByHop (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6FillFragmentHeader (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN UINT8 NextHeader,
|
||||
IN UINT8 LastHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN UINT16 FragmentOffset,
|
||||
OUT UINT8 **UpdatedExtHdrs
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN UINT8 NextHeader,
|
||||
IN UINT8 LastHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN UINT16 FragmentOffset,
|
||||
OUT UINT8 **UpdatedExtHdrs
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -155,13 +155,13 @@ Ip6FillFragmentHeader (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6CopyExts (
|
||||
IN UINT8 NextHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT8 *LastHeader,
|
||||
IN UINT16 FragmentOffset,
|
||||
IN UINT32 UnFragmentHdrLen,
|
||||
IN OUT UINT8 *Buf,
|
||||
IN OUT UINT32 *BufLen
|
||||
IN UINT8 NextHeader,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT8 *LastHeader,
|
||||
IN UINT16 FragmentOffset,
|
||||
IN UINT32 UnFragmentHdrLen,
|
||||
IN OUT UINT8 *Buf,
|
||||
IN OUT UINT32 *BufLen
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -178,8 +178,8 @@ Ip6CopyExts (
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6IsNDOptionValid (
|
||||
IN UINT8 *Option,
|
||||
IN UINT16 OptionLen
|
||||
IN UINT8 *Option,
|
||||
IN UINT16 OptionLen
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -9,7 +9,7 @@
|
||||
|
||||
#include "Ip6Impl.h"
|
||||
|
||||
UINT32 mIp6Id;
|
||||
UINT32 mIp6Id;
|
||||
|
||||
/**
|
||||
Output all the available source addresses to a list entry head SourceList. The
|
||||
@@ -28,16 +28,16 @@ UINT32 mIp6Id;
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6CandidateSource (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
OUT LIST_ENTRY *SourceList,
|
||||
OUT UINT32 *SourceCount
|
||||
IN IP6_SERVICE *IpSb,
|
||||
OUT LIST_ENTRY *SourceList,
|
||||
OUT UINT32 *SourceCount
|
||||
)
|
||||
{
|
||||
IP6_INTERFACE *IpIf;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Entry2;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
IP6_ADDRESS_INFO *Copy;
|
||||
IP6_INTERFACE *IpIf;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Entry2;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
IP6_ADDRESS_INFO *Copy;
|
||||
|
||||
*SourceCount = 0;
|
||||
|
||||
@@ -47,12 +47,12 @@ Ip6CandidateSource (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Copy->Signature = IP6_ADDR_INFO_SIGNATURE;
|
||||
Copy->Signature = IP6_ADDR_INFO_SIGNATURE;
|
||||
IP6_COPY_ADDRESS (&Copy->Address, &IpSb->LinkLocalAddr);
|
||||
Copy->IsAnycast = FALSE;
|
||||
Copy->PrefixLength = IP6_LINK_LOCAL_PREFIX_LENGTH;
|
||||
Copy->ValidLifetime = (UINT32) IP6_INFINIT_LIFETIME;
|
||||
Copy->PreferredLifetime = (UINT32) IP6_INFINIT_LIFETIME;
|
||||
Copy->ValidLifetime = (UINT32)IP6_INFINIT_LIFETIME;
|
||||
Copy->PreferredLifetime = (UINT32)IP6_INFINIT_LIFETIME;
|
||||
|
||||
InsertTailList (SourceList, &Copy->Link);
|
||||
(*SourceCount)++;
|
||||
@@ -95,15 +95,15 @@ Ip6CandidateSource (
|
||||
**/
|
||||
UINT8
|
||||
Ip6CommonPrefixLen (
|
||||
IN EFI_IPv6_ADDRESS *AddressA,
|
||||
IN EFI_IPv6_ADDRESS *AddressB
|
||||
IN EFI_IPv6_ADDRESS *AddressA,
|
||||
IN EFI_IPv6_ADDRESS *AddressB
|
||||
)
|
||||
{
|
||||
UINT8 Count;
|
||||
UINT8 Index;
|
||||
UINT8 ByteA;
|
||||
UINT8 ByteB;
|
||||
UINT8 NumBits;
|
||||
UINT8 Count;
|
||||
UINT8 Index;
|
||||
UINT8 ByteA;
|
||||
UINT8 ByteB;
|
||||
UINT8 NumBits;
|
||||
|
||||
Count = 0;
|
||||
Index = 0;
|
||||
@@ -122,14 +122,14 @@ Ip6CommonPrefixLen (
|
||||
// Check how many bits are common between the two bytes.
|
||||
//
|
||||
NumBits = 8;
|
||||
ByteA = (UINT8) (ByteA ^ ByteB);
|
||||
ByteA = (UINT8)(ByteA ^ ByteB);
|
||||
|
||||
while (ByteA != 0) {
|
||||
NumBits--;
|
||||
ByteA = (UINT8) (ByteA >> 1);
|
||||
ByteA = (UINT8)(ByteA >> 1);
|
||||
}
|
||||
|
||||
return (UINT8) (Count + NumBits);
|
||||
return (UINT8)(Count + NumBits);
|
||||
}
|
||||
|
||||
return Count;
|
||||
@@ -151,21 +151,21 @@ Ip6CommonPrefixLen (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SelectSourceAddress (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
OUT EFI_IPv6_ADDRESS *Source
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
OUT EFI_IPv6_ADDRESS *Source
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
LIST_ENTRY SourceList;
|
||||
UINT32 SourceCount;
|
||||
UINT8 ScopeD;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
IP6_PREFIX_LIST_ENTRY *Prefix;
|
||||
UINT8 LastCommonLength;
|
||||
UINT8 CurrentCommonLength;
|
||||
EFI_IPv6_ADDRESS *TmpAddress;
|
||||
EFI_STATUS Status;
|
||||
LIST_ENTRY SourceList;
|
||||
UINT32 SourceCount;
|
||||
UINT8 ScopeD;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ADDRESS_INFO *AddrInfo;
|
||||
IP6_PREFIX_LIST_ENTRY *Prefix;
|
||||
UINT8 LastCommonLength;
|
||||
UINT8 CurrentCommonLength;
|
||||
EFI_IPv6_ADDRESS *TmpAddress;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
@@ -188,7 +188,7 @@ Ip6SelectSourceAddress (
|
||||
// Rule 2: Prefer appropriate scope.
|
||||
//
|
||||
if (IP6_IS_MULTICAST (Destination)) {
|
||||
ScopeD = (UINT8) (Destination->Addr[1] >> 4);
|
||||
ScopeD = (UINT8)(Destination->Addr[1] >> 4);
|
||||
} else if (NetIp6IsLinkLocalAddr (Destination)) {
|
||||
ScopeD = 0x2;
|
||||
} else {
|
||||
@@ -284,15 +284,15 @@ Exit:
|
||||
**/
|
||||
IP6_INTERFACE *
|
||||
Ip6SelectInterface (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN OUT EFI_IPv6_ADDRESS *Source
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN OUT EFI_IPv6_ADDRESS *Source
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS SelectedSource;
|
||||
IP6_INTERFACE *IpIf;
|
||||
BOOLEAN Exist;
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS SelectedSource;
|
||||
IP6_INTERFACE *IpIf;
|
||||
BOOLEAN Exist;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
ASSERT (Destination != NULL && Source != NULL);
|
||||
@@ -335,10 +335,10 @@ Ip6SelectInterface (
|
||||
**/
|
||||
VOID
|
||||
Ip6SysPacketSent (
|
||||
NET_BUF *Packet,
|
||||
EFI_STATUS IoStatus,
|
||||
UINT32 LinkFlag,
|
||||
VOID *Context
|
||||
NET_BUF *Packet,
|
||||
EFI_STATUS IoStatus,
|
||||
UINT32 LinkFlag,
|
||||
VOID *Context
|
||||
)
|
||||
{
|
||||
NetbufFree (Packet);
|
||||
@@ -365,22 +365,22 @@ Ip6SysPacketSent (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6PrependHead (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN UINT16 FragmentOffset,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN UINT8 LastHeader,
|
||||
IN UINT32 HeadLen
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN UINT16 FragmentOffset,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN UINT8 LastHeader,
|
||||
IN UINT32 HeadLen
|
||||
)
|
||||
{
|
||||
UINT32 Len;
|
||||
UINT32 UnFragExtHdrsLen;
|
||||
EFI_IP6_HEADER *PacketHead;
|
||||
UINT8 *UpdatedExtHdrs;
|
||||
EFI_STATUS Status;
|
||||
UINT8 NextHeader;
|
||||
UINT32 Len;
|
||||
UINT32 UnFragExtHdrsLen;
|
||||
EFI_IP6_HEADER *PacketHead;
|
||||
UINT8 *UpdatedExtHdrs;
|
||||
EFI_STATUS Status;
|
||||
UINT8 NextHeader;
|
||||
|
||||
UpdatedExtHdrs = NULL;
|
||||
|
||||
@@ -388,7 +388,7 @@ Ip6PrependHead (
|
||||
// HeadLen is the length of the fixed part of the sequences of fragments, i.e.
|
||||
// the unfragment part.
|
||||
//
|
||||
PacketHead = (EFI_IP6_HEADER *) NetbufAllocSpace (Packet, HeadLen, NET_BUF_HEAD);
|
||||
PacketHead = (EFI_IP6_HEADER *)NetbufAllocSpace (Packet, HeadLen, NET_BUF_HEAD);
|
||||
if (PacketHead == NULL) {
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
@@ -397,7 +397,7 @@ Ip6PrependHead (
|
||||
// Set the head up, convert the host byte order to network byte order
|
||||
//
|
||||
CopyMem (PacketHead, Head, sizeof (EFI_IP6_HEADER));
|
||||
PacketHead->PayloadLength = HTONS ((UINT16) (Packet->TotalSize - sizeof (EFI_IP6_HEADER)));
|
||||
PacketHead->PayloadLength = HTONS ((UINT16)(Packet->TotalSize - sizeof (EFI_IP6_HEADER)));
|
||||
Packet->Ip.Ip6 = PacketHead;
|
||||
|
||||
Len = HeadLen - sizeof (EFI_IP6_HEADER);
|
||||
@@ -431,7 +431,7 @@ Ip6PrependHead (
|
||||
}
|
||||
|
||||
CopyMem (
|
||||
(UINT8 *) (PacketHead + 1),
|
||||
(UINT8 *)(PacketHead + 1),
|
||||
UpdatedExtHdrs,
|
||||
UnFragExtHdrsLen + sizeof (IP6_FRAGMENT_HEADER)
|
||||
);
|
||||
@@ -474,52 +474,52 @@ Ip6PrependHead (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6Output (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface OPTIONAL,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN IP6_FRAME_CALLBACK Callback,
|
||||
IN VOID *Context
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface OPTIONAL,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN IP6_FRAME_CALLBACK Callback,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
IP6_INTERFACE *IpIf;
|
||||
EFI_IPv6_ADDRESS NextHop;
|
||||
IP6_NEIGHBOR_ENTRY *NeighborCache;
|
||||
IP6_ROUTE_CACHE_ENTRY *RouteCache;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Mtu;
|
||||
UINT32 HeadLen;
|
||||
UINT16 FragmentOffset;
|
||||
UINT8 *LastHeader;
|
||||
UINT32 UnFragmentLen;
|
||||
UINT32 UnFragmentHdrsLen;
|
||||
UINT32 FragmentHdrsLen;
|
||||
UINT16 *Checksum;
|
||||
UINT16 PacketChecksum;
|
||||
UINT16 PseudoChecksum;
|
||||
UINT32 Index;
|
||||
UINT32 PacketLen;
|
||||
UINT32 RealExtLen;
|
||||
UINT32 Offset;
|
||||
NET_BUF *TmpPacket;
|
||||
NET_BUF *Fragment;
|
||||
UINT32 Num;
|
||||
UINT8 *Buf;
|
||||
EFI_IP6_HEADER *PacketHead;
|
||||
IP6_ICMP_HEAD *IcmpHead;
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
IP6_ROUTE_ENTRY *RouteEntry;
|
||||
UINT8 *UpdatedExtHdrs;
|
||||
UINT8 NextHeader;
|
||||
UINT8 LastHeaderBackup;
|
||||
BOOLEAN FragmentHeadInserted;
|
||||
UINT8 *ExtHdrsBackup;
|
||||
UINT8 NextHeaderBackup;
|
||||
EFI_IPv6_ADDRESS Source;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
IP6_INTERFACE *IpIf;
|
||||
EFI_IPv6_ADDRESS NextHop;
|
||||
IP6_NEIGHBOR_ENTRY *NeighborCache;
|
||||
IP6_ROUTE_CACHE_ENTRY *RouteCache;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Mtu;
|
||||
UINT32 HeadLen;
|
||||
UINT16 FragmentOffset;
|
||||
UINT8 *LastHeader;
|
||||
UINT32 UnFragmentLen;
|
||||
UINT32 UnFragmentHdrsLen;
|
||||
UINT32 FragmentHdrsLen;
|
||||
UINT16 *Checksum;
|
||||
UINT16 PacketChecksum;
|
||||
UINT16 PseudoChecksum;
|
||||
UINT32 Index;
|
||||
UINT32 PacketLen;
|
||||
UINT32 RealExtLen;
|
||||
UINT32 Offset;
|
||||
NET_BUF *TmpPacket;
|
||||
NET_BUF *Fragment;
|
||||
UINT32 Num;
|
||||
UINT8 *Buf;
|
||||
EFI_IP6_HEADER *PacketHead;
|
||||
IP6_ICMP_HEAD *IcmpHead;
|
||||
IP6_TXTOKEN_WRAP *Wrap;
|
||||
IP6_ROUTE_ENTRY *RouteEntry;
|
||||
UINT8 *UpdatedExtHdrs;
|
||||
UINT8 NextHeader;
|
||||
UINT8 LastHeaderBackup;
|
||||
BOOLEAN FragmentHeadInserted;
|
||||
UINT8 *ExtHdrsBackup;
|
||||
UINT8 NextHeaderBackup;
|
||||
EFI_IPv6_ADDRESS Source;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
|
||||
@@ -557,7 +557,7 @@ Ip6Output (
|
||||
// IpInstance->Interface is NULL when IpInstance is configured with both stationaddress
|
||||
// and destinationaddress is unspecified.
|
||||
//
|
||||
if (IpInstance == NULL || IpInstance->Interface == NULL) {
|
||||
if ((IpInstance == NULL) || (IpInstance->Interface == NULL)) {
|
||||
IpIf = Ip6SelectInterface (IpSb, &Head->DestinationAddress, &Head->SourceAddress);
|
||||
if (IpInstance != NULL) {
|
||||
IpInstance->Interface = IpIf;
|
||||
@@ -578,43 +578,46 @@ Ip6Output (
|
||||
Head->TrafficClassL = 0;
|
||||
Head->TrafficClassH = 0;
|
||||
|
||||
Checksum = NULL;
|
||||
NextHeader = *LastHeader;
|
||||
Checksum = NULL;
|
||||
NextHeader = *LastHeader;
|
||||
|
||||
switch (NextHeader) {
|
||||
case EFI_IP_PROTO_UDP:
|
||||
Packet->Udp = (EFI_UDP_HEADER *) NetbufGetByte (Packet, 0, NULL);
|
||||
ASSERT (Packet->Udp != NULL);
|
||||
if (Packet->Udp->Checksum == 0) {
|
||||
Checksum = &Packet->Udp->Checksum;
|
||||
}
|
||||
break;
|
||||
case EFI_IP_PROTO_UDP:
|
||||
Packet->Udp = (EFI_UDP_HEADER *)NetbufGetByte (Packet, 0, NULL);
|
||||
ASSERT (Packet->Udp != NULL);
|
||||
if (Packet->Udp->Checksum == 0) {
|
||||
Checksum = &Packet->Udp->Checksum;
|
||||
}
|
||||
|
||||
case EFI_IP_PROTO_TCP:
|
||||
Packet->Tcp = (TCP_HEAD *) NetbufGetByte (Packet, 0, NULL);
|
||||
ASSERT (Packet->Tcp != NULL);
|
||||
if (Packet->Tcp->Checksum == 0) {
|
||||
Checksum = &Packet->Tcp->Checksum;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case IP6_ICMP:
|
||||
//
|
||||
// Don't send ICMP packet to an IPv6 anycast address.
|
||||
//
|
||||
if (Ip6IsAnycast (IpSb, &Head->DestinationAddress)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
case EFI_IP_PROTO_TCP:
|
||||
Packet->Tcp = (TCP_HEAD *)NetbufGetByte (Packet, 0, NULL);
|
||||
ASSERT (Packet->Tcp != NULL);
|
||||
if (Packet->Tcp->Checksum == 0) {
|
||||
Checksum = &Packet->Tcp->Checksum;
|
||||
}
|
||||
|
||||
IcmpHead = (IP6_ICMP_HEAD *) NetbufGetByte (Packet, 0, NULL);
|
||||
ASSERT (IcmpHead != NULL);
|
||||
if (IcmpHead->Checksum == 0) {
|
||||
Checksum = &IcmpHead->Checksum;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
case IP6_ICMP:
|
||||
//
|
||||
// Don't send ICMP packet to an IPv6 anycast address.
|
||||
//
|
||||
if (Ip6IsAnycast (IpSb, &Head->DestinationAddress)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
IcmpHead = (IP6_ICMP_HEAD *)NetbufGetByte (Packet, 0, NULL);
|
||||
ASSERT (IcmpHead != NULL);
|
||||
if (IcmpHead->Checksum == 0) {
|
||||
Checksum = &IcmpHead->Checksum;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (Checksum != NULL) {
|
||||
@@ -624,11 +627,11 @@ Ip6Output (
|
||||
//
|
||||
PacketChecksum = NetbufChecksum (Packet);
|
||||
PseudoChecksum = NetIp6PseudoHeadChecksum (
|
||||
&Head->SourceAddress,
|
||||
&Head->DestinationAddress,
|
||||
NextHeader,
|
||||
Packet->TotalSize
|
||||
);
|
||||
&Head->SourceAddress,
|
||||
&Head->DestinationAddress,
|
||||
NextHeader,
|
||||
Packet->TotalSize
|
||||
);
|
||||
*Checksum = (UINT16) ~NetAddChecksum (PacketChecksum, PseudoChecksum);
|
||||
}
|
||||
|
||||
@@ -643,7 +646,7 @@ Ip6Output (
|
||||
Context
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -663,7 +666,8 @@ Ip6Output (
|
||||
&RealExtLen,
|
||||
&UnFragmentHdrsLen,
|
||||
NULL
|
||||
)) {
|
||||
))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -762,7 +766,6 @@ Ip6Output (
|
||||
);
|
||||
if (RouteEntry != NULL) {
|
||||
if ((RouteEntry->Flag & IP6_PACKET_TOO_BIG) == IP6_PACKET_TOO_BIG) {
|
||||
|
||||
//
|
||||
// FragmentHead is inserted after Hop-by-Hop Options header, Destination
|
||||
// Options header (first occur), Routing header, and before Fragment header,
|
||||
@@ -787,10 +790,10 @@ Ip6Output (
|
||||
Head->NextHeader = IP6_FRAGMENT;
|
||||
}
|
||||
|
||||
ExtHdrsBackup = ExtHdrs;
|
||||
ExtHdrs = UpdatedExtHdrs;
|
||||
ExtHdrsLen = ExtHdrsLen + sizeof (IP6_FRAGMENT_HEADER);
|
||||
RealExtLen = RealExtLen + sizeof (IP6_FRAGMENT_HEADER);
|
||||
ExtHdrsBackup = ExtHdrs;
|
||||
ExtHdrs = UpdatedExtHdrs;
|
||||
ExtHdrsLen = ExtHdrsLen + sizeof (IP6_FRAGMENT_HEADER);
|
||||
RealExtLen = RealExtLen + sizeof (IP6_FRAGMENT_HEADER);
|
||||
|
||||
mIp6Id++;
|
||||
|
||||
@@ -879,8 +882,8 @@ Ip6Output (
|
||||
goto Error;
|
||||
}
|
||||
|
||||
FragmentOffset = (UINT16) ((UINT16) Offset | 0x1);
|
||||
if (Index == Num - 1){
|
||||
FragmentOffset = (UINT16)((UINT16)Offset | 0x1);
|
||||
if (Index == Num - 1) {
|
||||
//
|
||||
// The last fragment, clear the M flag.
|
||||
//
|
||||
@@ -915,11 +918,11 @@ Ip6Output (
|
||||
// The last fragment of upper layer packet, update the IP6 token status.
|
||||
//
|
||||
if ((Index == Num -1) && (Context != NULL)) {
|
||||
Wrap = (IP6_TXTOKEN_WRAP *) Context;
|
||||
Wrap = (IP6_TXTOKEN_WRAP *)Context;
|
||||
Wrap->Token->Status = Status;
|
||||
}
|
||||
|
||||
Offset += PacketLen;
|
||||
Offset += PacketLen;
|
||||
PacketLen = Packet->TotalSize - Offset;
|
||||
if (PacketLen > Mtu) {
|
||||
PacketLen = Mtu;
|
||||
@@ -939,7 +942,7 @@ Ip6Output (
|
||||
//
|
||||
// Need not fragment the packet, send it in one frame.
|
||||
//
|
||||
PacketHead = (EFI_IP6_HEADER *) NetbufAllocSpace (Packet, HeadLen, NET_BUF_HEAD);
|
||||
PacketHead = (EFI_IP6_HEADER *)NetbufAllocSpace (Packet, HeadLen, NET_BUF_HEAD);
|
||||
if (PacketHead == NULL) {
|
||||
Status = EFI_BAD_BUFFER_SIZE;
|
||||
goto Error;
|
||||
@@ -949,7 +952,7 @@ Ip6Output (
|
||||
Packet->Ip.Ip6 = PacketHead;
|
||||
|
||||
if (ExtHdrs != NULL) {
|
||||
Buf = (UINT8 *) (PacketHead + 1);
|
||||
Buf = (UINT8 *)(PacketHead + 1);
|
||||
CopyMem (Buf, ExtHdrs, ExtHdrsLen);
|
||||
}
|
||||
|
||||
@@ -957,8 +960,8 @@ Ip6Output (
|
||||
//
|
||||
// A Fragment Header is inserted to the packet, update the payload length.
|
||||
//
|
||||
PacketHead->PayloadLength = (UINT16) (NTOHS (PacketHead->PayloadLength) +
|
||||
sizeof (IP6_FRAGMENT_HEADER));
|
||||
PacketHead->PayloadLength = (UINT16)(NTOHS (PacketHead->PayloadLength) +
|
||||
sizeof (IP6_FRAGMENT_HEADER));
|
||||
PacketHead->PayloadLength = HTONS (PacketHead->PayloadLength);
|
||||
FreePool (UpdatedExtHdrs);
|
||||
}
|
||||
@@ -976,6 +979,7 @@ Error:
|
||||
if (UpdatedExtHdrs != NULL) {
|
||||
FreePool (UpdatedExtHdrs);
|
||||
}
|
||||
|
||||
Ip6CancelPacket (IpIf, Packet, Status);
|
||||
return Status;
|
||||
}
|
||||
@@ -993,11 +997,11 @@ Error:
|
||||
**/
|
||||
BOOLEAN
|
||||
Ip6CancelPacketFragments (
|
||||
IN IP6_LINK_TX_TOKEN *Frame,
|
||||
IN VOID *Context
|
||||
IN IP6_LINK_TX_TOKEN *Frame,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
if ((Frame->Packet == (NET_BUF *) Context) || (Frame->Context == Context)) {
|
||||
if ((Frame->Packet == (NET_BUF *)Context) || (Frame->Context == Context)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -1018,18 +1022,18 @@ Ip6CancelPacketFragments (
|
||||
**/
|
||||
VOID
|
||||
Ip6CancelFrames (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_LINK_TX_TOKEN *Token;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_NEIGHBOR_ENTRY *ArpQue;
|
||||
EFI_STATUS Status;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_LINK_TX_TOKEN *Token;
|
||||
IP6_SERVICE *IpSb;
|
||||
IP6_NEIGHBOR_ENTRY *ArpQue;
|
||||
EFI_STATUS Status;
|
||||
|
||||
IpSb = Interface->Service;
|
||||
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
|
||||
@@ -1075,11 +1079,10 @@ Ip6CancelFrames (
|
||||
**/
|
||||
VOID
|
||||
Ip6CancelPacket (
|
||||
IN IP6_INTERFACE *IpIf,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus
|
||||
IN IP6_INTERFACE *IpIf,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus
|
||||
)
|
||||
{
|
||||
Ip6CancelFrames (IpIf, IoStatus, Ip6CancelPacketFragments, Packet);
|
||||
}
|
||||
|
||||
|
@@ -10,7 +10,7 @@
|
||||
#ifndef __EFI_IP6_OUTPUT_H__
|
||||
#define __EFI_IP6_OUTPUT_H__
|
||||
|
||||
extern UINT32 mIp6Id;
|
||||
extern UINT32 mIp6Id;
|
||||
|
||||
/**
|
||||
Output all the available source addresses to the list entry head SourceList. The
|
||||
@@ -28,9 +28,9 @@ extern UINT32 mIp6Id;
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6SelectSourceAddress (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
OUT EFI_IPv6_ADDRESS *Source
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
OUT EFI_IPv6_ADDRESS *Source
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -46,10 +46,10 @@ Ip6SelectSourceAddress (
|
||||
**/
|
||||
VOID
|
||||
Ip6SysPacketSent (
|
||||
NET_BUF *Packet,
|
||||
EFI_STATUS IoStatus,
|
||||
UINT32 LinkFlag,
|
||||
VOID *Context
|
||||
NET_BUF *Packet,
|
||||
EFI_STATUS IoStatus,
|
||||
UINT32 LinkFlag,
|
||||
VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -86,15 +86,15 @@ Ip6SysPacketSent (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6Output (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface OPTIONAL,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN IP6_FRAME_CALLBACK Callback,
|
||||
IN VOID *Context
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN IP6_INTERFACE *Interface OPTIONAL,
|
||||
IN IP6_PROTOCOL *IpInstance OPTIONAL,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_IP6_HEADER *Head,
|
||||
IN UINT8 *ExtHdrs,
|
||||
IN UINT32 ExtHdrsLen,
|
||||
IN IP6_FRAME_CALLBACK Callback,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -111,10 +111,10 @@ Ip6Output (
|
||||
**/
|
||||
VOID
|
||||
Ip6CancelFrames (
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
IN IP6_INTERFACE *Interface,
|
||||
IN EFI_STATUS IoStatus,
|
||||
IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,
|
||||
IN VOID *Context OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -127,9 +127,9 @@ Ip6CancelFrames (
|
||||
**/
|
||||
VOID
|
||||
Ip6CancelPacket (
|
||||
IN IP6_INTERFACE *IpIf,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus
|
||||
IN IP6_INTERFACE *IpIf,
|
||||
IN NET_BUF *Packet,
|
||||
IN EFI_STATUS IoStatus
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -21,17 +21,17 @@
|
||||
**/
|
||||
UINT32
|
||||
Ip6RouteCacheHash (
|
||||
IN EFI_IPv6_ADDRESS *Ip1,
|
||||
IN EFI_IPv6_ADDRESS *Ip2
|
||||
IN EFI_IPv6_ADDRESS *Ip1,
|
||||
IN EFI_IPv6_ADDRESS *Ip2
|
||||
)
|
||||
{
|
||||
UINT32 Prefix1;
|
||||
UINT32 Prefix2;
|
||||
UINT32 Prefix1;
|
||||
UINT32 Prefix2;
|
||||
|
||||
Prefix1 = *((UINT32 *) ((UINTN *) (Ip1)));
|
||||
Prefix2 = *((UINT32 *) ((UINTN *) (Ip2)));
|
||||
Prefix1 = *((UINT32 *)((UINTN *)(Ip1)));
|
||||
Prefix2 = *((UINT32 *)((UINTN *)(Ip2)));
|
||||
|
||||
return ((UINT32) (Prefix1 ^ Prefix2) % IP6_ROUTE_CACHE_HASH_SIZE);
|
||||
return ((UINT32)(Prefix1 ^ Prefix2) % IP6_ROUTE_CACHE_HASH_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -49,12 +49,12 @@ Ip6RouteCacheHash (
|
||||
**/
|
||||
IP6_ROUTE_ENTRY *
|
||||
Ip6CreateRouteEntry (
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||
)
|
||||
{
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
|
||||
RtEntry = AllocateZeroPool (sizeof (IP6_ROUTE_ENTRY));
|
||||
|
||||
@@ -85,7 +85,7 @@ Ip6CreateRouteEntry (
|
||||
**/
|
||||
VOID
|
||||
Ip6FreeRouteEntry (
|
||||
IN OUT IP6_ROUTE_ENTRY *RtEntry
|
||||
IN OUT IP6_ROUTE_ENTRY *RtEntry
|
||||
)
|
||||
{
|
||||
ASSERT ((RtEntry != NULL) && (RtEntry->RefCnt > 0));
|
||||
@@ -116,14 +116,14 @@ Ip6FreeRouteEntry (
|
||||
**/
|
||||
IP6_ROUTE_ENTRY *
|
||||
Ip6FindRouteEntry (
|
||||
IN IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *NextHop OPTIONAL
|
||||
IN IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *NextHop OPTIONAL
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
INTN Index;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
INTN Index;
|
||||
|
||||
ASSERT (Destination != NULL || NextHop != NULL);
|
||||
|
||||
@@ -144,7 +144,6 @@ Ip6FindRouteEntry (
|
||||
return RtEntry;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,13 +165,13 @@ Ip6FindRouteEntry (
|
||||
**/
|
||||
IP6_ROUTE_CACHE_ENTRY *
|
||||
Ip6CreateRouteCacheEntry (
|
||||
IN EFI_IPv6_ADDRESS *Dst,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN EFI_IPv6_ADDRESS *GateWay,
|
||||
IN UINTN Tag
|
||||
IN EFI_IPv6_ADDRESS *Dst,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN EFI_IPv6_ADDRESS *GateWay,
|
||||
IN UINTN Tag
|
||||
)
|
||||
{
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
|
||||
RtCacheEntry = AllocatePool (sizeof (IP6_ROUTE_CACHE_ENTRY));
|
||||
|
||||
@@ -222,21 +221,21 @@ Ip6FreeRouteCacheEntry (
|
||||
**/
|
||||
IP6_ROUTE_CACHE_ENTRY *
|
||||
Ip6FindRouteCache (
|
||||
IN IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src
|
||||
IN IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
UINT32 Index;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
UINT32 Index;
|
||||
|
||||
Index = IP6_ROUTE_CACHE_HASH (Dest, Src);
|
||||
|
||||
NET_LIST_FOR_EACH (Entry, &RtTable->Cache.CacheBucket[Index]) {
|
||||
RtCacheEntry = NET_LIST_USER_STRUCT (Entry, IP6_ROUTE_CACHE_ENTRY, Link);
|
||||
|
||||
if (EFI_IP6_EQUAL (Dest, &RtCacheEntry->Destination)&& EFI_IP6_EQUAL (Src, &RtCacheEntry->Source)) {
|
||||
if (EFI_IP6_EQUAL (Dest, &RtCacheEntry->Destination) && EFI_IP6_EQUAL (Src, &RtCacheEntry->Source)) {
|
||||
NET_GET_REF (RtCacheEntry);
|
||||
return RtCacheEntry;
|
||||
}
|
||||
@@ -260,16 +259,16 @@ Ip6FindRouteCache (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6BuildEfiRouteTable (
|
||||
IN IP6_ROUTE_TABLE *RouteTable,
|
||||
OUT UINT32 *EfiRouteCount,
|
||||
OUT EFI_IP6_ROUTE_TABLE **EfiRouteTable OPTIONAL
|
||||
IN IP6_ROUTE_TABLE *RouteTable,
|
||||
OUT UINT32 *EfiRouteCount,
|
||||
OUT EFI_IP6_ROUTE_TABLE **EfiRouteTable OPTIONAL
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
EFI_IP6_ROUTE_TABLE *EfiTable;
|
||||
UINT32 Count;
|
||||
INT32 Index;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
EFI_IP6_ROUTE_TABLE *EfiTable;
|
||||
UINT32 Count;
|
||||
INT32 Index;
|
||||
|
||||
ASSERT (EfiRouteCount != NULL);
|
||||
|
||||
@@ -295,7 +294,6 @@ Ip6BuildEfiRouteTable (
|
||||
Count = 0;
|
||||
|
||||
for (Index = IP6_PREFIX_MAX; Index >= 0; Index--) {
|
||||
|
||||
NET_LIST_FOR_EACH (Entry, &(RouteTable->RouteArea[Index])) {
|
||||
RtEntry = NET_LIST_USER_STRUCT (Entry, IP6_ROUTE_ENTRY, Link);
|
||||
|
||||
@@ -329,8 +327,8 @@ Ip6CreateRouteTable (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
IP6_ROUTE_TABLE *RtTable;
|
||||
UINT32 Index;
|
||||
IP6_ROUTE_TABLE *RtTable;
|
||||
UINT32 Index;
|
||||
|
||||
RtTable = AllocatePool (sizeof (IP6_ROUTE_TABLE));
|
||||
if (RtTable == NULL) {
|
||||
@@ -361,19 +359,19 @@ Ip6CreateRouteTable (
|
||||
**/
|
||||
VOID
|
||||
Ip6CleanRouteTable (
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
UINT32 Index;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
UINT32 Index;
|
||||
|
||||
ASSERT (RtTable->RefCnt > 0);
|
||||
|
||||
if (--RtTable->RefCnt > 0) {
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -410,18 +408,17 @@ Ip6CleanRouteTable (
|
||||
**/
|
||||
VOID
|
||||
Ip6PurgeRouteCache (
|
||||
IN IP6_ROUTE_CACHE *RtCache,
|
||||
IN UINTN Tag
|
||||
IN IP6_ROUTE_CACHE *RtCache,
|
||||
IN UINTN Tag
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
UINT32 Index;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
UINT32 Index;
|
||||
|
||||
for (Index = 0; Index < IP6_ROUTE_CACHE_HASH_SIZE; Index++) {
|
||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &RtCache->CacheBucket[Index]) {
|
||||
|
||||
RtCacheEntry = NET_LIST_USER_STRUCT (Entry, IP6_ROUTE_CACHE_ENTRY, Link);
|
||||
|
||||
if (RtCacheEntry->Tag == Tag) {
|
||||
@@ -447,15 +444,15 @@ Ip6PurgeRouteCache (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6AddRoute (
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ROUTE_ENTRY *Route;
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *Entry;
|
||||
IP6_ROUTE_ENTRY *Route;
|
||||
|
||||
ListHead = &RtTable->RouteArea[PrefixLength];
|
||||
|
||||
@@ -466,7 +463,8 @@ Ip6AddRoute (
|
||||
Route = NET_LIST_USER_STRUCT (Entry, IP6_ROUTE_ENTRY, Link);
|
||||
|
||||
if (NetIp6IsNetEqual (Destination, &Route->Destination, PrefixLength) &&
|
||||
EFI_IP6_EQUAL (GatewayAddress, &Route->NextHop)) {
|
||||
EFI_IP6_EQUAL (GatewayAddress, &Route->NextHop))
|
||||
{
|
||||
return EFI_ACCESS_DENIED;
|
||||
}
|
||||
}
|
||||
@@ -506,17 +504,17 @@ Ip6AddRoute (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6DelRoute (
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ROUTE_ENTRY *Route;
|
||||
UINT32 TotalNum;
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_ROUTE_ENTRY *Route;
|
||||
UINT32 TotalNum;
|
||||
|
||||
ListHead = &RtTable->RouteArea[PrefixLength];
|
||||
TotalNum = RtTable->TotalNum;
|
||||
@@ -524,14 +522,15 @@ Ip6DelRoute (
|
||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, ListHead) {
|
||||
Route = NET_LIST_USER_STRUCT (Entry, IP6_ROUTE_ENTRY, Link);
|
||||
|
||||
if (Destination != NULL && !NetIp6IsNetEqual (Destination, &Route->Destination, PrefixLength)) {
|
||||
continue;
|
||||
}
|
||||
if (GatewayAddress != NULL && !EFI_IP6_EQUAL (GatewayAddress, &Route->NextHop)) {
|
||||
if ((Destination != NULL) && !NetIp6IsNetEqual (Destination, &Route->Destination, PrefixLength)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Ip6PurgeRouteCache (&RtTable->Cache, (UINTN) Route);
|
||||
if ((GatewayAddress != NULL) && !EFI_IP6_EQUAL (GatewayAddress, &Route->NextHop)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Ip6PurgeRouteCache (&RtTable->Cache, (UINTN)Route);
|
||||
RemoveEntryList (Entry);
|
||||
Ip6FreeRouteEntry (Route);
|
||||
|
||||
@@ -556,17 +555,17 @@ Ip6DelRoute (
|
||||
**/
|
||||
IP6_ROUTE_CACHE_ENTRY *
|
||||
Ip6Route (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src
|
||||
)
|
||||
{
|
||||
IP6_ROUTE_TABLE *RtTable;
|
||||
LIST_ENTRY *ListHead;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
EFI_IPv6_ADDRESS NextHop;
|
||||
UINT32 Index;
|
||||
IP6_ROUTE_TABLE *RtTable;
|
||||
LIST_ENTRY *ListHead;
|
||||
IP6_ROUTE_CACHE_ENTRY *RtCacheEntry;
|
||||
IP6_ROUTE_ENTRY *RtEntry;
|
||||
EFI_IPv6_ADDRESS NextHop;
|
||||
UINT32 Index;
|
||||
|
||||
RtTable = IpSb->RouteTable;
|
||||
|
||||
@@ -614,7 +613,7 @@ Ip6Route (
|
||||
//
|
||||
// Create a route cache entry, and tag it as spawned from this route entry
|
||||
//
|
||||
RtCacheEntry = Ip6CreateRouteCacheEntry (Dest, Src, &NextHop, (UINTN) RtEntry);
|
||||
RtCacheEntry = Ip6CreateRouteCacheEntry (Dest, Src, &NextHop, (UINTN)RtEntry);
|
||||
|
||||
if (RtCacheEntry == NULL) {
|
||||
return NULL;
|
||||
@@ -626,4 +625,3 @@ Ip6Route (
|
||||
|
||||
return RtCacheEntry;
|
||||
}
|
||||
|
||||
|
@@ -10,38 +10,38 @@
|
||||
#ifndef __EFI_IP6_ROUTE_H__
|
||||
#define __EFI_IP6_ROUTE_H__
|
||||
|
||||
#define IP6_DIRECT_ROUTE 0x00000001
|
||||
#define IP6_PACKET_TOO_BIG 0x00000010
|
||||
#define IP6_DIRECT_ROUTE 0x00000001
|
||||
#define IP6_PACKET_TOO_BIG 0x00000010
|
||||
|
||||
#define IP6_ROUTE_CACHE_HASH_SIZE 31
|
||||
#define IP6_ROUTE_CACHE_HASH_SIZE 31
|
||||
///
|
||||
/// Max NO. of cache entry per hash bucket
|
||||
///
|
||||
#define IP6_ROUTE_CACHE_MAX 32
|
||||
#define IP6_ROUTE_CACHE_MAX 32
|
||||
|
||||
#define IP6_ROUTE_CACHE_HASH(Ip1, Ip2) Ip6RouteCacheHash ((Ip1), (Ip2))
|
||||
#define IP6_ROUTE_CACHE_HASH(Ip1, Ip2) Ip6RouteCacheHash ((Ip1), (Ip2))
|
||||
|
||||
typedef struct {
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINT32 Flag;
|
||||
UINT8 PrefixLength;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
EFI_IPv6_ADDRESS NextHop;
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINT32 Flag;
|
||||
UINT8 PrefixLength;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
EFI_IPv6_ADDRESS NextHop;
|
||||
} IP6_ROUTE_ENTRY;
|
||||
|
||||
typedef struct {
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINTN Tag;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
EFI_IPv6_ADDRESS Source;
|
||||
EFI_IPv6_ADDRESS NextHop;
|
||||
LIST_ENTRY Link;
|
||||
INTN RefCnt;
|
||||
UINTN Tag;
|
||||
EFI_IPv6_ADDRESS Destination;
|
||||
EFI_IPv6_ADDRESS Source;
|
||||
EFI_IPv6_ADDRESS NextHop;
|
||||
} IP6_ROUTE_CACHE_ENTRY;
|
||||
|
||||
typedef struct {
|
||||
LIST_ENTRY CacheBucket[IP6_ROUTE_CACHE_HASH_SIZE];
|
||||
UINT8 CacheNum[IP6_ROUTE_CACHE_HASH_SIZE];
|
||||
LIST_ENTRY CacheBucket[IP6_ROUTE_CACHE_HASH_SIZE];
|
||||
UINT8 CacheNum[IP6_ROUTE_CACHE_HASH_SIZE];
|
||||
} IP6_ROUTE_CACHE;
|
||||
|
||||
//
|
||||
@@ -54,10 +54,10 @@ typedef struct {
|
||||
//
|
||||
|
||||
typedef struct _IP6_ROUTE_TABLE {
|
||||
INTN RefCnt;
|
||||
UINT32 TotalNum;
|
||||
LIST_ENTRY RouteArea[IP6_PREFIX_NUM];
|
||||
IP6_ROUTE_CACHE Cache;
|
||||
INTN RefCnt;
|
||||
UINT32 TotalNum;
|
||||
LIST_ENTRY RouteArea[IP6_PREFIX_NUM];
|
||||
IP6_ROUTE_CACHE Cache;
|
||||
} IP6_ROUTE_TABLE;
|
||||
|
||||
/**
|
||||
@@ -72,8 +72,8 @@ typedef struct _IP6_ROUTE_TABLE {
|
||||
**/
|
||||
UINT32
|
||||
Ip6RouteCacheHash (
|
||||
IN EFI_IPv6_ADDRESS *Ip1,
|
||||
IN EFI_IPv6_ADDRESS *Ip2
|
||||
IN EFI_IPv6_ADDRESS *Ip1,
|
||||
IN EFI_IPv6_ADDRESS *Ip2
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -91,10 +91,10 @@ Ip6RouteCacheHash (
|
||||
**/
|
||||
IP6_ROUTE_CACHE_ENTRY *
|
||||
Ip6CreateRouteCacheEntry (
|
||||
IN EFI_IPv6_ADDRESS *Dst,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN EFI_IPv6_ADDRESS *GateWay,
|
||||
IN UINTN Tag
|
||||
IN EFI_IPv6_ADDRESS *Dst,
|
||||
IN EFI_IPv6_ADDRESS *Src,
|
||||
IN EFI_IPv6_ADDRESS *GateWay,
|
||||
IN UINTN Tag
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -122,9 +122,9 @@ Ip6FreeRouteCacheEntry (
|
||||
**/
|
||||
IP6_ROUTE_CACHE_ENTRY *
|
||||
Ip6FindRouteCache (
|
||||
IN IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src
|
||||
IN IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -142,9 +142,9 @@ Ip6FindRouteCache (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6BuildEfiRouteTable (
|
||||
IN IP6_ROUTE_TABLE *RouteTable,
|
||||
OUT UINT32 *EfiRouteCount,
|
||||
OUT EFI_IP6_ROUTE_TABLE **EfiRouteTable OPTIONAL
|
||||
IN IP6_ROUTE_TABLE *RouteTable,
|
||||
OUT UINT32 *EfiRouteCount,
|
||||
OUT EFI_IP6_ROUTE_TABLE **EfiRouteTable OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -168,7 +168,7 @@ Ip6CreateRouteTable (
|
||||
**/
|
||||
VOID
|
||||
Ip6CleanRouteTable (
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -186,9 +186,9 @@ Ip6CleanRouteTable (
|
||||
**/
|
||||
IP6_ROUTE_ENTRY *
|
||||
Ip6CreateRouteEntry (
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -212,9 +212,9 @@ Ip6CreateRouteEntry (
|
||||
**/
|
||||
IP6_ROUTE_ENTRY *
|
||||
Ip6FindRouteEntry (
|
||||
IN IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *NextHop OPTIONAL
|
||||
IN IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||
IN EFI_IPv6_ADDRESS *NextHop OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -225,7 +225,7 @@ Ip6FindRouteEntry (
|
||||
**/
|
||||
VOID
|
||||
Ip6FreeRouteEntry (
|
||||
IN OUT IP6_ROUTE_ENTRY *RtEntry
|
||||
IN OUT IP6_ROUTE_ENTRY *RtEntry
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -243,10 +243,10 @@ Ip6FreeRouteEntry (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6AddRoute (
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -265,10 +265,10 @@ Ip6AddRoute (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Ip6DelRoute (
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress
|
||||
IN OUT IP6_ROUTE_TABLE *RtTable,
|
||||
IN EFI_IPv6_ADDRESS *Destination,
|
||||
IN UINT8 PrefixLength,
|
||||
IN EFI_IPv6_ADDRESS *GatewayAddress
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -285,9 +285,9 @@ Ip6DelRoute (
|
||||
**/
|
||||
IP6_ROUTE_CACHE_ENTRY *
|
||||
Ip6Route (
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src
|
||||
IN IP6_SERVICE *IpSb,
|
||||
IN EFI_IPv6_ADDRESS *Dest,
|
||||
IN EFI_IPv6_ADDRESS *Src
|
||||
);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user