\r
#include "Ip6Impl.h"\r
\r
-EFI_MAC_ADDRESS mZeroMacAddress;\r
+EFI_MAC_ADDRESS mZeroMacAddress;\r
\r
/**\r
Update the ReachableTime in IP6 service binding instance data, in milliseconds.\r
IN OUT IP6_SERVICE *IpSb\r
)\r
{\r
- UINT32 Random;\r
+ UINT32 Random;\r
\r
- Random = (NetRandomInitSeed () / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE;\r
- Random = Random + IP6_MIN_RANDOM_FACTOR_SCALED;\r
+ Random = (NetRandomInitSeed () / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE;\r
+ Random = Random + IP6_MIN_RANDOM_FACTOR_SCALED;\r
IpSb->ReachableTime = (IpSb->BaseReachableTime * Random) / IP6_RANDOM_FACTOR_SCALE;\r
}\r
\r
**/\r
EFI_STATUS\r
Ip6BuildEfiNeighborCache (\r
- IN IP6_PROTOCOL *IpInstance,\r
- OUT UINT32 *NeighborCount,\r
- OUT EFI_IP6_NEIGHBOR_CACHE **NeighborCache\r
+ IN IP6_PROTOCOL *IpInstance,\r
+ OUT UINT32 *NeighborCount,\r
+ OUT EFI_IP6_NEIGHBOR_CACHE **NeighborCache\r
)\r
{\r
- IP6_NEIGHBOR_ENTRY *Neighbor;\r
- LIST_ENTRY *Entry;\r
- IP6_SERVICE *IpSb;\r
- UINT32 Count;\r
- EFI_IP6_NEIGHBOR_CACHE *EfiNeighborCache;\r
- EFI_IP6_NEIGHBOR_CACHE *NeighborCacheTmp;\r
+ IP6_NEIGHBOR_ENTRY *Neighbor;\r
+ LIST_ENTRY *Entry;\r
+ IP6_SERVICE *IpSb;\r
+ UINT32 Count;\r
+ EFI_IP6_NEIGHBOR_CACHE *EfiNeighborCache;\r
+ EFI_IP6_NEIGHBOR_CACHE *NeighborCacheTmp;\r
\r
NET_CHECK_SIGNATURE (IpInstance, IP6_PROTOCOL_SIGNATURE);\r
ASSERT (NeighborCount != NULL && NeighborCache != NULL);\r
\r
EfiNeighborCache = NeighborCacheTmp + Count;\r
\r
- EfiNeighborCache->State = Neighbor->State;\r
+ EfiNeighborCache->State = Neighbor->State;\r
IP6_COPY_ADDRESS (&EfiNeighborCache->Neighbor, &Neighbor->Neighbor);\r
IP6_COPY_LINK_ADDRESS (&EfiNeighborCache->LinkAddress, &Neighbor->LinkAddress);\r
\r
OUT EFI_IP6_ADDRESS_INFO **PrefixTable\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- IP6_SERVICE *IpSb;\r
- UINT32 Count;\r
- IP6_PREFIX_LIST_ENTRY *PrefixList;\r
- EFI_IP6_ADDRESS_INFO *EfiPrefix;\r
- EFI_IP6_ADDRESS_INFO *PrefixTableTmp;\r
+ LIST_ENTRY *Entry;\r
+ IP6_SERVICE *IpSb;\r
+ UINT32 Count;\r
+ IP6_PREFIX_LIST_ENTRY *PrefixList;\r
+ EFI_IP6_ADDRESS_INFO *EfiPrefix;\r
+ EFI_IP6_ADDRESS_INFO *PrefixTableTmp;\r
\r
NET_CHECK_SIGNATURE (IpInstance, IP6_PROTOCOL_SIGNATURE);\r
ASSERT (PrefixCount != NULL && PrefixTable != NULL);\r
**/\r
IP6_PREFIX_LIST_ENTRY *\r
Ip6CreatePrefixListEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN BOOLEAN OnLinkOrAuto,\r
- IN UINT32 ValidLifetime,\r
- IN UINT32 PreferredLifetime,\r
- IN UINT8 PrefixLength,\r
- IN EFI_IPv6_ADDRESS *Prefix\r
+ IN IP6_SERVICE *IpSb,\r
+ IN BOOLEAN OnLinkOrAuto,\r
+ IN UINT32 ValidLifetime,\r
+ IN UINT32 PreferredLifetime,\r
+ IN UINT8 PrefixLength,\r
+ IN EFI_IPv6_ADDRESS *Prefix\r
)\r
{\r
- IP6_PREFIX_LIST_ENTRY *PrefixEntry;\r
- IP6_ROUTE_ENTRY *RtEntry;\r
- LIST_ENTRY *ListHead;\r
- LIST_ENTRY *Entry;\r
- IP6_PREFIX_LIST_ENTRY *TmpPrefixEntry;\r
+ IP6_PREFIX_LIST_ENTRY *PrefixEntry;\r
+ IP6_ROUTE_ENTRY *RtEntry;\r
+ LIST_ENTRY *ListHead;\r
+ LIST_ENTRY *Entry;\r
+ IP6_PREFIX_LIST_ENTRY *TmpPrefixEntry;\r
\r
- if (Prefix == NULL || PreferredLifetime > ValidLifetime || PrefixLength > IP6_PREFIX_MAX) {\r
+ if ((Prefix == NULL) || (PreferredLifetime > ValidLifetime) || (PrefixLength > IP6_PREFIX_MAX)) {\r
return NULL;\r
}\r
\r
Prefix\r
);\r
if (PrefixEntry != NULL) {\r
- PrefixEntry->RefCnt ++;\r
+ PrefixEntry->RefCnt++;\r
return PrefixEntry;\r
}\r
\r
// is put ahead in the list.\r
//\r
NET_LIST_FOR_EACH (Entry, ListHead) {\r
- TmpPrefixEntry = NET_LIST_USER_STRUCT(Entry, IP6_PREFIX_LIST_ENTRY, Link);\r
+ TmpPrefixEntry = NET_LIST_USER_STRUCT (Entry, IP6_PREFIX_LIST_ENTRY, Link);\r
\r
if (TmpPrefixEntry->PrefixLength < PrefixEntry->PrefixLength) {\r
break;\r
IN BOOLEAN ImmediateDelete\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- IP6_INTERFACE *IpIf;\r
- EFI_STATUS Status;\r
+ LIST_ENTRY *Entry;\r
+ IP6_INTERFACE *IpIf;\r
+ EFI_STATUS Status;\r
\r
if ((!ImmediateDelete) && (PrefixEntry->RefCnt > 0) && ((--PrefixEntry->RefCnt) > 0)) {\r
- return ;\r
+ return;\r
}\r
\r
if (OnLinkOrAuto) {\r
- //\r
- // Remove the direct route for onlink prefix from route table.\r
- //\r
- do {\r
- Status = Ip6DelRoute (\r
- IpSb->RouteTable,\r
- &PrefixEntry->Prefix,\r
- PrefixEntry->PrefixLength,\r
- NULL\r
- );\r
- } while (Status != EFI_NOT_FOUND);\r
+ //\r
+ // Remove the direct route for onlink prefix from route table.\r
+ //\r
+ do {\r
+ Status = Ip6DelRoute (\r
+ IpSb->RouteTable,\r
+ &PrefixEntry->Prefix,\r
+ PrefixEntry->PrefixLength,\r
+ NULL\r
+ );\r
+ } while (Status != EFI_NOT_FOUND);\r
} else {\r
//\r
// Remove the corresponding addresses generated from this autonomous prefix.\r
**/\r
IP6_PREFIX_LIST_ENTRY *\r
Ip6FindPrefixListEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN BOOLEAN OnLinkOrAuto,\r
- IN UINT8 PrefixLength,\r
- IN EFI_IPv6_ADDRESS *Prefix\r
+ IN IP6_SERVICE *IpSb,\r
+ IN BOOLEAN OnLinkOrAuto,\r
+ IN UINT8 PrefixLength,\r
+ IN EFI_IPv6_ADDRESS *Prefix\r
)\r
{\r
- IP6_PREFIX_LIST_ENTRY *PrefixList;\r
- LIST_ENTRY *Entry;\r
- LIST_ENTRY *ListHead;\r
+ IP6_PREFIX_LIST_ENTRY *PrefixList;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *ListHead;\r
\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
ASSERT (Prefix != NULL);\r
//\r
// Perform exactly prefix match.\r
//\r
- if (PrefixList->PrefixLength == PrefixLength &&\r
- NetIp6IsNetEqual (&PrefixList->Prefix, Prefix, PrefixLength)) {\r
+ if ((PrefixList->PrefixLength == PrefixLength) &&\r
+ NetIp6IsNetEqual (&PrefixList->Prefix, Prefix, PrefixLength))\r
+ {\r
return PrefixList;\r
}\r
} else {\r
**/\r
VOID\r
Ip6CleanPrefixListTable (\r
- IN IP6_SERVICE *IpSb,\r
- IN LIST_ENTRY *ListHead\r
+ IN IP6_SERVICE *IpSb,\r
+ IN LIST_ENTRY *ListHead\r
)\r
{\r
- IP6_PREFIX_LIST_ENTRY *PrefixList;\r
- BOOLEAN OnLink;\r
+ IP6_PREFIX_LIST_ENTRY *PrefixList;\r
+ BOOLEAN OnLink;\r
\r
- OnLink = (BOOLEAN) (ListHead == &IpSb->OnlinkPrefix);\r
+ OnLink = (BOOLEAN)(ListHead == &IpSb->OnlinkPrefix);\r
\r
while (!IsListEmpty (ListHead)) {\r
PrefixList = NET_LIST_HEAD (ListHead, IP6_PREFIX_LIST_ENTRY, Link);\r
**/\r
VOID\r
Ip6OnArpResolved (\r
- IN VOID *Context\r
+ IN VOID *Context\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- LIST_ENTRY *Next;\r
- IP6_NEIGHBOR_ENTRY *ArpQue;\r
- IP6_SERVICE *IpSb;\r
- IP6_LINK_TX_TOKEN *Token;\r
- EFI_STATUS Status;\r
- BOOLEAN Sent;\r
-\r
- ArpQue = (IP6_NEIGHBOR_ENTRY *) Context;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Next;\r
+ IP6_NEIGHBOR_ENTRY *ArpQue;\r
+ IP6_SERVICE *IpSb;\r
+ IP6_LINK_TX_TOKEN *Token;\r
+ EFI_STATUS Status;\r
+ BOOLEAN Sent;\r
+\r
+ ArpQue = (IP6_NEIGHBOR_ENTRY *)Context;\r
if ((ArpQue == NULL) || (ArpQue->Interface == NULL)) {\r
- return ;\r
+ return;\r
}\r
\r
- IpSb = ArpQue->Interface->Service;\r
+ IpSb = ArpQue->Interface->Service;\r
if ((IpSb == NULL) || (IpSb->Signature != IP6_SERVICE_SIGNATURE)) {\r
- return ;\r
+ return;\r
}\r
\r
//\r
//\r
if (NET_MAC_EQUAL (&ArpQue->LinkAddress, &mZeroMacAddress, IpSb->SnpMode.HwAddressSize)) {\r
Ip6FreeNeighborEntry (IpSb, ArpQue, FALSE, TRUE, EFI_NO_MAPPING, NULL, NULL);\r
- return ;\r
+ return;\r
}\r
\r
//\r
\r
if (Sent && (ArpQue->State == EfiNeighborStale)) {\r
ArpQue->State = EfiNeighborDelay;\r
- ArpQue->Ticks = (UINT32) IP6_GET_TICKS (IP6_DELAY_FIRST_PROBE_TIME);\r
+ ArpQue->Ticks = (UINT32)IP6_GET_TICKS (IP6_DELAY_FIRST_PROBE_TIME);\r
}\r
}\r
\r
**/\r
IP6_NEIGHBOR_ENTRY *\r
Ip6CreateNeighborEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN IP6_ARP_CALLBACK CallBack,\r
- IN EFI_IPv6_ADDRESS *Ip6Address,\r
- IN EFI_MAC_ADDRESS *LinkAddress OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN IP6_ARP_CALLBACK CallBack,\r
+ IN EFI_IPv6_ADDRESS *Ip6Address,\r
+ IN EFI_MAC_ADDRESS *LinkAddress OPTIONAL\r
)\r
{\r
- IP6_NEIGHBOR_ENTRY *Entry;\r
- IP6_DEFAULT_ROUTER *DefaultRouter;\r
+ IP6_NEIGHBOR_ENTRY *Entry;\r
+ IP6_DEFAULT_ROUTER *DefaultRouter;\r
\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
- ASSERT (Ip6Address!= NULL);\r
+ ASSERT (Ip6Address != NULL);\r
\r
Entry = AllocateZeroPool (sizeof (IP6_NEIGHBOR_ENTRY));\r
if (Entry == NULL) {\r
**/\r
IP6_NEIGHBOR_ENTRY *\r
Ip6FindNeighborEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *Ip6Address\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *Ip6Address\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- LIST_ENTRY *Next;\r
- IP6_NEIGHBOR_ENTRY *Neighbor;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Next;\r
+ IP6_NEIGHBOR_ENTRY *Neighbor;\r
\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
ASSERT (Ip6Address != NULL);\r
**/\r
EFI_STATUS\r
Ip6FreeNeighborEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN IP6_NEIGHBOR_ENTRY *NeighborCache,\r
- IN BOOLEAN SendIcmpError,\r
- IN BOOLEAN FullFree,\r
- IN EFI_STATUS IoStatus,\r
- IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,\r
- IN VOID *Context OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN IP6_NEIGHBOR_ENTRY *NeighborCache,\r
+ IN BOOLEAN SendIcmpError,\r
+ IN BOOLEAN FullFree,\r
+ IN EFI_STATUS IoStatus,\r
+ IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,\r
+ IN VOID *Context OPTIONAL\r
)\r
{\r
- IP6_LINK_TX_TOKEN *TxToken;\r
- LIST_ENTRY *Entry;\r
- LIST_ENTRY *Next;\r
- IP6_DEFAULT_ROUTER *DefaultRouter;\r
+ IP6_LINK_TX_TOKEN *TxToken;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Next;\r
+ IP6_DEFAULT_ROUTER *DefaultRouter;\r
\r
//\r
// If FrameToCancel fails, the token will not be released.\r
// To avoid the memory leak, stop this usage model.\r
//\r
- if (FullFree && FrameToCancel != NULL) {\r
+ if (FullFree && (FrameToCancel != NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
**/\r
IP6_DEFAULT_ROUTER *\r
Ip6CreateDefaultRouter (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *Ip6Address,\r
- IN UINT16 RouterLifetime\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *Ip6Address,\r
+ IN UINT16 RouterLifetime\r
)\r
{\r
- IP6_DEFAULT_ROUTER *Entry;\r
- IP6_ROUTE_ENTRY *RtEntry;\r
+ IP6_DEFAULT_ROUTER *Entry;\r
+ IP6_ROUTE_ENTRY *RtEntry;\r
\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
ASSERT (Ip6Address != NULL);\r
**/\r
VOID\r
Ip6DestroyDefaultRouter (\r
- IN IP6_SERVICE *IpSb,\r
- IN IP6_DEFAULT_ROUTER *DefaultRouter\r
+ IN IP6_SERVICE *IpSb,\r
+ IN IP6_DEFAULT_ROUTER *DefaultRouter\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
RemoveEntryList (&DefaultRouter->Link);\r
\r
**/\r
VOID\r
Ip6CleanDefaultRouterList (\r
- IN IP6_SERVICE *IpSb\r
+ IN IP6_SERVICE *IpSb\r
)\r
{\r
- IP6_DEFAULT_ROUTER *DefaultRouter;\r
+ IP6_DEFAULT_ROUTER *DefaultRouter;\r
\r
while (!IsListEmpty (&IpSb->DefaultRouterList)) {\r
DefaultRouter = NET_LIST_HEAD (&IpSb->DefaultRouterList, IP6_DEFAULT_ROUTER, Link);\r
**/\r
IP6_DEFAULT_ROUTER *\r
Ip6FindDefaultRouter (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *Ip6Address\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *Ip6Address\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- IP6_DEFAULT_ROUTER *DefaultRouter;\r
+ LIST_ENTRY *Entry;\r
+ IP6_DEFAULT_ROUTER *DefaultRouter;\r
\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
ASSERT (Ip6Address != NULL);\r
// Set the exta options to send. Here we only want the option request option\r
// with DNS SERVERS.\r
//\r
- Oro = (EFI_DHCP6_PACKET_OPTION *) OptBuf;\r
- Oro->OpCode = HTONS (DHCP6_OPT_ORO);\r
- Oro->OpLen = HTONS (2);\r
- *((UINT16 *) &Oro->Data[0]) = HTONS (DHCP6_OPT_DNS_SERVERS);\r
+ Oro = (EFI_DHCP6_PACKET_OPTION *)OptBuf;\r
+ Oro->OpCode = HTONS (DHCP6_OPT_ORO);\r
+ Oro->OpLen = HTONS (2);\r
+ *((UINT16 *)&Oro->Data[0]) = HTONS (DHCP6_OPT_DNS_SERVERS);\r
\r
InfoReqReXmit.Irt = 4;\r
InfoReqReXmit.Mrc = 64;\r
Ip6CreatePrefixListEntry (\r
IpSb,\r
TRUE,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
IP6_LINK_LOCAL_PREFIX_LENGTH,\r
&IpSb->LinkLocalAddr\r
);\r
-\r
} else {\r
//\r
// Global scope unicast address.\r
IpSb->Mnp->Configure (IpSb->Mnp, NULL);\r
gBS->SetTimer (IpSb->Timer, TimerCancel, 0);\r
gBS->SetTimer (IpSb->FasterTimer, TimerCancel, 0);\r
- return ;\r
+ return;\r
}\r
\r
if (!IsDadPassed || NetIp6IsLinkLocalAddr (&AddrInfo->Address)) {\r
**/\r
EFI_STATUS\r
Ip6InitDADProcess (\r
- IN IP6_INTERFACE *IpIf,\r
- IN IP6_ADDRESS_INFO *AddressInfo,\r
- IN IP6_DAD_CALLBACK Callback OPTIONAL,\r
- IN VOID *Context OPTIONAL\r
+ IN IP6_INTERFACE *IpIf,\r
+ IN IP6_ADDRESS_INFO *AddressInfo,\r
+ IN IP6_DAD_CALLBACK Callback OPTIONAL,\r
+ IN VOID *Context OPTIONAL\r
)\r
{\r
IP6_DAD_ENTRY *Entry;\r
return Status;\r
}\r
\r
- Entry->Signature = IP6_DAD_ENTRY_SIGNATURE;\r
- Entry->MaxTransmit = DadXmits->DupAddrDetectTransmits;\r
- Entry->Transmit = 0;\r
- Entry->Receive = 0;\r
- MaxDelayTick = IP6_MAX_RTR_SOLICITATION_DELAY / IP6_TIMER_INTERVAL_IN_MS;\r
- Entry->RetransTick = (MaxDelayTick * ((NET_RANDOM (NetRandomInitSeed ()) % 5) + 1)) / 5;\r
- Entry->AddressInfo = AddressInfo;\r
- Entry->Callback = Callback;\r
- Entry->Context = Context;\r
+ Entry->Signature = IP6_DAD_ENTRY_SIGNATURE;\r
+ Entry->MaxTransmit = DadXmits->DupAddrDetectTransmits;\r
+ Entry->Transmit = 0;\r
+ Entry->Receive = 0;\r
+ MaxDelayTick = IP6_MAX_RTR_SOLICITATION_DELAY / IP6_TIMER_INTERVAL_IN_MS;\r
+ Entry->RetransTick = (MaxDelayTick * ((NET_RANDOM (NetRandomInitSeed ()) % 5) + 1)) / 5;\r
+ Entry->AddressInfo = AddressInfo;\r
+ Entry->Callback = Callback;\r
+ Entry->Context = Context;\r
InsertTailList (&IpIf->DupAddrDetectList, &Entry->Link);\r
\r
if (Entry->MaxTransmit == 0) {\r
**/\r
IP6_DAD_ENTRY *\r
Ip6FindDADEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *Target,\r
- OUT IP6_INTERFACE **Interface OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *Target,\r
+ OUT IP6_INTERFACE **Interface OPTIONAL\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- LIST_ENTRY *Entry2;\r
- IP6_INTERFACE *IpIf;\r
- IP6_DAD_ENTRY *DupAddrDetect;\r
- IP6_ADDRESS_INFO *AddrInfo;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Entry2;\r
+ IP6_INTERFACE *IpIf;\r
+ IP6_DAD_ENTRY *DupAddrDetect;\r
+ IP6_ADDRESS_INFO *AddrInfo;\r
\r
NET_LIST_FOR_EACH (Entry, &IpSb->Interfaces) {\r
IpIf = NET_LIST_USER_STRUCT (Entry, IP6_INTERFACE, Link);\r
if (Interface != NULL) {\r
*Interface = IpIf;\r
}\r
+\r
return DupAddrDetect;\r
}\r
}\r
**/\r
EFI_STATUS\r
Ip6SendRouterSolicit (\r
- IN IP6_SERVICE *IpSb,\r
- IN IP6_INTERFACE *Interface OPTIONAL,\r
- IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,\r
- IN EFI_IPv6_ADDRESS *DestinationAddress OPTIONAL,\r
- IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN IP6_INTERFACE *Interface OPTIONAL,\r
+ IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,\r
+ IN EFI_IPv6_ADDRESS *DestinationAddress OPTIONAL,\r
+ IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r
)\r
{\r
- NET_BUF *Packet;\r
- EFI_IP6_HEADER Head;\r
- IP6_ICMP_INFORMATION_HEAD *IcmpHead;\r
- IP6_ETHER_ADDR_OPTION *LinkLayerOption;\r
- UINT16 PayloadLen;\r
- IP6_INTERFACE *IpIf;\r
+ NET_BUF *Packet;\r
+ EFI_IP6_HEADER Head;\r
+ IP6_ICMP_INFORMATION_HEAD *IcmpHead;\r
+ IP6_ETHER_ADDR_OPTION *LinkLayerOption;\r
+ UINT16 PayloadLen;\r
+ IP6_INTERFACE *IpIf;\r
\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
\r
IpIf = Interface;\r
- if (IpIf == NULL && IpSb->DefaultInterface != NULL) {\r
+ if ((IpIf == NULL) && (IpSb->DefaultInterface != NULL)) {\r
IpIf = IpSb->DefaultInterface;\r
}\r
\r
// Generate the packet to be sent\r
//\r
\r
- PayloadLen = (UINT16) sizeof (IP6_ICMP_INFORMATION_HEAD);\r
+ PayloadLen = (UINT16)sizeof (IP6_ICMP_INFORMATION_HEAD);\r
if (SourceLinkAddress != NULL) {\r
PayloadLen += sizeof (IP6_ETHER_ADDR_OPTION);\r
}\r
\r
- Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32) PayloadLen);\r
+ Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32)PayloadLen);\r
if (Packet == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
//\r
// Create the basic IPv6 header.\r
//\r
- Head.FlowLabelL = 0;\r
- Head.FlowLabelH = 0;\r
- Head.PayloadLength = HTONS (PayloadLen);\r
- Head.NextHeader = IP6_ICMP;\r
- Head.HopLimit = IP6_HOP_LIMIT;\r
+ Head.FlowLabelL = 0;\r
+ Head.FlowLabelH = 0;\r
+ Head.PayloadLength = HTONS (PayloadLen);\r
+ Head.NextHeader = IP6_ICMP;\r
+ Head.HopLimit = IP6_HOP_LIMIT;\r
\r
if (SourceAddress != NULL) {\r
IP6_COPY_ADDRESS (&Head.SourceAddress, SourceAddress);\r
ZeroMem (&Head.SourceAddress, sizeof (EFI_IPv6_ADDRESS));\r
}\r
\r
-\r
if (DestinationAddress != NULL) {\r
IP6_COPY_ADDRESS (&Head.DestinationAddress, DestinationAddress);\r
} else {\r
// Fill in the ICMP header, and Source link-layer address if contained.\r
//\r
\r
- IcmpHead = (IP6_ICMP_INFORMATION_HEAD *) NetbufAllocSpace (Packet, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);\r
+ IcmpHead = (IP6_ICMP_INFORMATION_HEAD *)NetbufAllocSpace (Packet, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);\r
ASSERT (IcmpHead != NULL);\r
ZeroMem (IcmpHead, sizeof (IP6_ICMP_INFORMATION_HEAD));\r
IcmpHead->Head.Type = ICMP_V6_ROUTER_SOLICIT;\r
\r
LinkLayerOption = NULL;\r
if (SourceLinkAddress != NULL) {\r
- LinkLayerOption = (IP6_ETHER_ADDR_OPTION *) NetbufAllocSpace (\r
- Packet,\r
- sizeof (IP6_ETHER_ADDR_OPTION),\r
- FALSE\r
- );\r
+ LinkLayerOption = (IP6_ETHER_ADDR_OPTION *)NetbufAllocSpace (\r
+ Packet,\r
+ sizeof (IP6_ETHER_ADDR_OPTION),\r
+ FALSE\r
+ );\r
ASSERT (LinkLayerOption != NULL);\r
LinkLayerOption->Type = Ip6OptionEtherSource;\r
- LinkLayerOption->Length = (UINT8) sizeof (IP6_ETHER_ADDR_OPTION);\r
+ LinkLayerOption->Length = (UINT8)sizeof (IP6_ETHER_ADDR_OPTION);\r
CopyMem (LinkLayerOption->EtherAddr, SourceLinkAddress, 6);\r
}\r
\r
**/\r
EFI_STATUS\r
Ip6SendNeighborAdvertise (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *SourceAddress,\r
- IN EFI_IPv6_ADDRESS *DestinationAddress,\r
- IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
- IN EFI_MAC_ADDRESS *TargetLinkAddress,\r
- IN BOOLEAN IsRouter,\r
- IN BOOLEAN Override,\r
- IN BOOLEAN Solicited\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *SourceAddress,\r
+ IN EFI_IPv6_ADDRESS *DestinationAddress,\r
+ IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
+ IN EFI_MAC_ADDRESS *TargetLinkAddress,\r
+ IN BOOLEAN IsRouter,\r
+ IN BOOLEAN Override,\r
+ IN BOOLEAN Solicited\r
)\r
{\r
- NET_BUF *Packet;\r
- EFI_IP6_HEADER Head;\r
- IP6_ICMP_INFORMATION_HEAD *IcmpHead;\r
- IP6_ETHER_ADDR_OPTION *LinkLayerOption;\r
- EFI_IPv6_ADDRESS *Target;\r
- UINT16 PayloadLen;\r
+ NET_BUF *Packet;\r
+ EFI_IP6_HEADER Head;\r
+ IP6_ICMP_INFORMATION_HEAD *IcmpHead;\r
+ IP6_ETHER_ADDR_OPTION *LinkLayerOption;\r
+ EFI_IPv6_ADDRESS *Target;\r
+ UINT16 PayloadLen;\r
\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
\r
//\r
ASSERT (DestinationAddress != NULL && TargetIp6Address != NULL && TargetLinkAddress != NULL);\r
\r
- PayloadLen = (UINT16) (sizeof (IP6_ICMP_INFORMATION_HEAD) + sizeof (EFI_IPv6_ADDRESS) + sizeof (IP6_ETHER_ADDR_OPTION));\r
+ PayloadLen = (UINT16)(sizeof (IP6_ICMP_INFORMATION_HEAD) + sizeof (EFI_IPv6_ADDRESS) + sizeof (IP6_ETHER_ADDR_OPTION));\r
\r
//\r
// Generate the packet to be sent\r
//\r
\r
- Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32) PayloadLen);\r
+ Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32)PayloadLen);\r
if (Packet == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
//\r
// Create the basic IPv6 header.\r
//\r
- Head.FlowLabelL = 0;\r
- Head.FlowLabelH = 0;\r
- Head.PayloadLength = HTONS (PayloadLen);\r
- Head.NextHeader = IP6_ICMP;\r
- Head.HopLimit = IP6_HOP_LIMIT;\r
+ Head.FlowLabelL = 0;\r
+ Head.FlowLabelH = 0;\r
+ Head.PayloadLength = HTONS (PayloadLen);\r
+ Head.NextHeader = IP6_ICMP;\r
+ Head.HopLimit = IP6_HOP_LIMIT;\r
\r
IP6_COPY_ADDRESS (&Head.SourceAddress, SourceAddress);\r
IP6_COPY_ADDRESS (&Head.DestinationAddress, DestinationAddress);\r
// Set the Router flag, Solicited flag and Override flag.\r
//\r
\r
- IcmpHead = (IP6_ICMP_INFORMATION_HEAD *) NetbufAllocSpace (Packet, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);\r
+ IcmpHead = (IP6_ICMP_INFORMATION_HEAD *)NetbufAllocSpace (Packet, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);\r
ASSERT (IcmpHead != NULL);\r
ZeroMem (IcmpHead, sizeof (IP6_ICMP_INFORMATION_HEAD));\r
IcmpHead->Head.Type = ICMP_V6_NEIGHBOR_ADVERTISE;\r
IcmpHead->Fourth |= IP6_OVERRIDE_FLAG;\r
}\r
\r
- Target = (EFI_IPv6_ADDRESS *) NetbufAllocSpace (Packet, sizeof (EFI_IPv6_ADDRESS), FALSE);\r
+ Target = (EFI_IPv6_ADDRESS *)NetbufAllocSpace (Packet, sizeof (EFI_IPv6_ADDRESS), FALSE);\r
ASSERT (Target != NULL);\r
IP6_COPY_ADDRESS (Target, TargetIp6Address);\r
\r
- LinkLayerOption = (IP6_ETHER_ADDR_OPTION *) NetbufAllocSpace (\r
- Packet,\r
- sizeof (IP6_ETHER_ADDR_OPTION),\r
- FALSE\r
- );\r
+ LinkLayerOption = (IP6_ETHER_ADDR_OPTION *)NetbufAllocSpace (\r
+ Packet,\r
+ sizeof (IP6_ETHER_ADDR_OPTION),\r
+ FALSE\r
+ );\r
ASSERT (LinkLayerOption != NULL);\r
LinkLayerOption->Type = Ip6OptionEtherTarget;\r
LinkLayerOption->Length = 1;\r
**/\r
EFI_STATUS\r
Ip6SendNeighborSolicit (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *SourceAddress,\r
- IN EFI_IPv6_ADDRESS *DestinationAddress,\r
- IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
- IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *SourceAddress,\r
+ IN EFI_IPv6_ADDRESS *DestinationAddress,\r
+ IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
+ IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r
)\r
{\r
- NET_BUF *Packet;\r
- EFI_IP6_HEADER Head;\r
- IP6_ICMP_INFORMATION_HEAD *IcmpHead;\r
- IP6_ETHER_ADDR_OPTION *LinkLayerOption;\r
- EFI_IPv6_ADDRESS *Target;\r
- BOOLEAN IsDAD;\r
- UINT16 PayloadLen;\r
- IP6_NEIGHBOR_ENTRY *Neighbor;\r
+ NET_BUF *Packet;\r
+ EFI_IP6_HEADER Head;\r
+ IP6_ICMP_INFORMATION_HEAD *IcmpHead;\r
+ IP6_ETHER_ADDR_OPTION *LinkLayerOption;\r
+ EFI_IPv6_ADDRESS *Target;\r
+ BOOLEAN IsDAD;\r
+ UINT16 PayloadLen;\r
+ IP6_NEIGHBOR_ENTRY *Neighbor;\r
\r
//\r
// Check input parameters\r
//\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
- if (DestinationAddress == NULL || TargetIp6Address == NULL) {\r
+ if ((DestinationAddress == NULL) || (TargetIp6Address == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
IsDAD = FALSE;\r
\r
- if (SourceAddress == NULL || (SourceAddress != NULL && NetIp6IsUnspecifiedAddr (SourceAddress))) {\r
+ if ((SourceAddress == NULL) || ((SourceAddress != NULL) && NetIp6IsUnspecifiedAddr (SourceAddress))) {\r
IsDAD = TRUE;\r
}\r
\r
// if the solicitation is not sent by performing DAD - Duplicate Address Detection.\r
// Otherwise must not include it.\r
//\r
- PayloadLen = (UINT16) (sizeof (IP6_ICMP_INFORMATION_HEAD) + sizeof (EFI_IPv6_ADDRESS));\r
+ PayloadLen = (UINT16)(sizeof (IP6_ICMP_INFORMATION_HEAD) + sizeof (EFI_IPv6_ADDRESS));\r
\r
if (!IsDAD) {\r
if (SourceLinkAddress == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- PayloadLen = (UINT16) (PayloadLen + sizeof (IP6_ETHER_ADDR_OPTION));\r
+ PayloadLen = (UINT16)(PayloadLen + sizeof (IP6_ETHER_ADDR_OPTION));\r
}\r
\r
//\r
// Generate the packet to be sent\r
//\r
\r
- Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32) PayloadLen);\r
+ Packet = NetbufAlloc (sizeof (EFI_IP6_HEADER) + (UINT32)PayloadLen);\r
if (Packet == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
//\r
// Create the basic IPv6 header\r
//\r
- Head.FlowLabelL = 0;\r
- Head.FlowLabelH = 0;\r
- Head.PayloadLength = HTONS (PayloadLen);\r
- Head.NextHeader = IP6_ICMP;\r
- Head.HopLimit = IP6_HOP_LIMIT;\r
+ Head.FlowLabelL = 0;\r
+ Head.FlowLabelH = 0;\r
+ Head.PayloadLength = HTONS (PayloadLen);\r
+ Head.NextHeader = IP6_ICMP;\r
+ Head.HopLimit = IP6_HOP_LIMIT;\r
\r
if (SourceAddress != NULL) {\r
IP6_COPY_ADDRESS (&Head.SourceAddress, SourceAddress);\r
//\r
// Fill in the ICMP header, Target address, and Source link-layer address.\r
//\r
- IcmpHead = (IP6_ICMP_INFORMATION_HEAD *) NetbufAllocSpace (Packet, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);\r
+ IcmpHead = (IP6_ICMP_INFORMATION_HEAD *)NetbufAllocSpace (Packet, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);\r
ASSERT (IcmpHead != NULL);\r
ZeroMem (IcmpHead, sizeof (IP6_ICMP_INFORMATION_HEAD));\r
IcmpHead->Head.Type = ICMP_V6_NEIGHBOR_SOLICIT;\r
IcmpHead->Head.Code = 0;\r
\r
- Target = (EFI_IPv6_ADDRESS *) NetbufAllocSpace (Packet, sizeof (EFI_IPv6_ADDRESS), FALSE);\r
+ Target = (EFI_IPv6_ADDRESS *)NetbufAllocSpace (Packet, sizeof (EFI_IPv6_ADDRESS), FALSE);\r
ASSERT (Target != NULL);\r
IP6_COPY_ADDRESS (Target, TargetIp6Address);\r
\r
LinkLayerOption = NULL;\r
if (!IsDAD) {\r
-\r
//\r
// Fill in the source link-layer address option\r
//\r
- LinkLayerOption = (IP6_ETHER_ADDR_OPTION *) NetbufAllocSpace (\r
- Packet,\r
- sizeof (IP6_ETHER_ADDR_OPTION),\r
- FALSE\r
- );\r
+ LinkLayerOption = (IP6_ETHER_ADDR_OPTION *)NetbufAllocSpace (\r
+ Packet,\r
+ sizeof (IP6_ETHER_ADDR_OPTION),\r
+ FALSE\r
+ );\r
ASSERT (LinkLayerOption != NULL);\r
LinkLayerOption->Type = Ip6OptionEtherSource;\r
LinkLayerOption->Length = 1;\r
**/\r
EFI_STATUS\r
Ip6ProcessNeighborSolicit (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IP6_HEADER *Head,\r
- IN NET_BUF *Packet\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IP6_HEADER *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IP6_ICMP_INFORMATION_HEAD Icmp;\r
- EFI_IPv6_ADDRESS Target;\r
- IP6_ETHER_ADDR_OPTION LinkLayerOption;\r
- BOOLEAN IsDAD;\r
- BOOLEAN IsUnicast;\r
- BOOLEAN IsMaintained;\r
- IP6_DAD_ENTRY *DupAddrDetect;\r
- IP6_INTERFACE *IpIf;\r
- IP6_NEIGHBOR_ENTRY *Neighbor;\r
- BOOLEAN Solicited;\r
- BOOLEAN UpdateCache;\r
- EFI_IPv6_ADDRESS Dest;\r
- UINT16 OptionLen;\r
- UINT8 *Option;\r
- BOOLEAN Provided;\r
- EFI_STATUS Status;\r
- VOID *MacAddress;\r
-\r
- NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+ IP6_ICMP_INFORMATION_HEAD Icmp;\r
+ EFI_IPv6_ADDRESS Target;\r
+ IP6_ETHER_ADDR_OPTION LinkLayerOption;\r
+ BOOLEAN IsDAD;\r
+ BOOLEAN IsUnicast;\r
+ BOOLEAN IsMaintained;\r
+ IP6_DAD_ENTRY *DupAddrDetect;\r
+ IP6_INTERFACE *IpIf;\r
+ IP6_NEIGHBOR_ENTRY *Neighbor;\r
+ BOOLEAN Solicited;\r
+ BOOLEAN UpdateCache;\r
+ EFI_IPv6_ADDRESS Dest;\r
+ UINT16 OptionLen;\r
+ UINT8 *Option;\r
+ BOOLEAN Provided;\r
+ EFI_STATUS Status;\r
+ VOID *MacAddress;\r
+\r
+ NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
NetbufCopy (Packet, sizeof (Icmp), sizeof (Target), Target.Addr);\r
\r
//\r
//\r
Status = EFI_INVALID_PARAMETER;\r
\r
- if (Head->HopLimit != IP6_HOP_LIMIT || Icmp.Head.Code != 0 || !NetIp6IsValidUnicast (&Target)) {\r
+ if ((Head->HopLimit != IP6_HOP_LIMIT) || (Icmp.Head.Code != 0) || !NetIp6IsValidUnicast (&Target)) {\r
goto Exit;\r
}\r
\r
if (Head->PayloadLength < IP6_ND_LENGTH) {\r
goto Exit;\r
} else {\r
- OptionLen = (UINT16) (Head->PayloadLength - IP6_ND_LENGTH);\r
+ OptionLen = (UINT16)(Head->PayloadLength - IP6_ND_LENGTH);\r
if (OptionLen != 0) {\r
- Option = NetbufGetByte (Packet, IP6_ND_LENGTH, NULL);\r
+ Option = NetbufGetByte (Packet, IP6_ND_LENGTH, NULL);\r
ASSERT (Option != NULL);\r
\r
//\r
Packet,\r
IP6_ND_LENGTH,\r
sizeof (IP6_ETHER_ADDR_OPTION),\r
- (UINT8 *) &LinkLayerOption\r
+ (UINT8 *)&LinkLayerOption\r
);\r
//\r
// The solicitation for neighbor discovery should include a source link-layer\r
MacAddress,\r
&IpSb->SnpMode.CurrentAddress,\r
IpSb->SnpMode.HwAddressSize\r
- ) != 0) {\r
+ ) != 0)\r
+ {\r
//\r
// The NS is from another node to performing DAD on the same address.\r
// Fail DAD for the tentative address.\r
}\r
}\r
}\r
+\r
goto Exit;\r
}\r
\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Exit;\r
}\r
+\r
UpdateCache = TRUE;\r
} else {\r
if (CompareMem (Neighbor->LinkAddress.Addr, LinkLayerOption.EtherAddr, 6) != 0) {\r
\r
if (UpdateCache) {\r
Neighbor->State = EfiNeighborStale;\r
- Neighbor->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
+ Neighbor->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
CopyMem (Neighbor->LinkAddress.Addr, LinkLayerOption.EtherAddr, 6);\r
//\r
// Send queued packets if exist.\r
//\r
- Neighbor->CallBack ((VOID *) Neighbor);\r
+ Neighbor->CallBack ((VOID *)Neighbor);\r
}\r
}\r
\r
**/\r
EFI_STATUS\r
Ip6ProcessNeighborAdvertise (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IP6_HEADER *Head,\r
- IN NET_BUF *Packet\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IP6_HEADER *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IP6_ICMP_INFORMATION_HEAD Icmp;\r
- EFI_IPv6_ADDRESS Target;\r
- IP6_ETHER_ADDR_OPTION LinkLayerOption;\r
- BOOLEAN Provided;\r
- INTN Compare;\r
- IP6_NEIGHBOR_ENTRY *Neighbor;\r
- IP6_DEFAULT_ROUTER *DefaultRouter;\r
- BOOLEAN Solicited;\r
- BOOLEAN IsRouter;\r
- BOOLEAN Override;\r
- IP6_DAD_ENTRY *DupAddrDetect;\r
- IP6_INTERFACE *IpIf;\r
- UINT16 OptionLen;\r
- UINT8 *Option;\r
- EFI_STATUS Status;\r
-\r
- NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+ IP6_ICMP_INFORMATION_HEAD Icmp;\r
+ EFI_IPv6_ADDRESS Target;\r
+ IP6_ETHER_ADDR_OPTION LinkLayerOption;\r
+ BOOLEAN Provided;\r
+ INTN Compare;\r
+ IP6_NEIGHBOR_ENTRY *Neighbor;\r
+ IP6_DEFAULT_ROUTER *DefaultRouter;\r
+ BOOLEAN Solicited;\r
+ BOOLEAN IsRouter;\r
+ BOOLEAN Override;\r
+ IP6_DAD_ENTRY *DupAddrDetect;\r
+ IP6_INTERFACE *IpIf;\r
+ UINT16 OptionLen;\r
+ UINT8 *Option;\r
+ EFI_STATUS Status;\r
+\r
+ NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
NetbufCopy (Packet, sizeof (Icmp), sizeof (Target), Target.Addr);\r
\r
//\r
// ICMP Code is 0.\r
// Target Address is not a multicast address.\r
//\r
- if (Head->HopLimit != IP6_HOP_LIMIT || Icmp.Head.Code != 0 || !NetIp6IsValidUnicast (&Target)) {\r
+ if ((Head->HopLimit != IP6_HOP_LIMIT) || (Icmp.Head.Code != 0) || !NetIp6IsValidUnicast (&Target)) {\r
goto Exit;\r
}\r
\r
if (Head->PayloadLength < IP6_ND_LENGTH) {\r
goto Exit;\r
} else {\r
- OptionLen = (UINT16) (Head->PayloadLength - IP6_ND_LENGTH);\r
+ OptionLen = (UINT16)(Head->PayloadLength - IP6_ND_LENGTH);\r
if (OptionLen != 0) {\r
- Option = NetbufGetByte (Packet, IP6_ND_LENGTH, NULL);\r
+ Option = NetbufGetByte (Packet, IP6_ND_LENGTH, NULL);\r
ASSERT (Option != NULL);\r
\r
//\r
if ((Icmp.Fourth & IP6_SOLICITED_FLAG) == IP6_SOLICITED_FLAG) {\r
Solicited = TRUE;\r
}\r
+\r
if (IP6_IS_MULTICAST (&Head->DestinationAddress) && Solicited) {\r
goto Exit;\r
}\r
if ((Icmp.Fourth & IP6_IS_ROUTER_FLAG) == IP6_IS_ROUTER_FLAG) {\r
IsRouter = TRUE;\r
}\r
+\r
if ((Icmp.Fourth & IP6_OVERRIDE_FLAG) == IP6_OVERRIDE_FLAG) {\r
Override = TRUE;\r
}\r
Packet,\r
IP6_ND_LENGTH,\r
sizeof (IP6_ETHER_ADDR_OPTION),\r
- (UINT8 *) &LinkLayerOption\r
+ (UINT8 *)&LinkLayerOption\r
);\r
\r
if (LinkLayerOption.Type == Ip6OptionEtherTarget) {\r
if (!Provided) {\r
goto Exit;\r
}\r
+\r
//\r
// Update the Neighbor Cache\r
//\r
Neighbor->Ticks = IP6_GET_TICKS (IpSb->ReachableTime);\r
} else {\r
Neighbor->State = EfiNeighborStale;\r
- Neighbor->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
+ Neighbor->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
//\r
// Send any packets queued for the neighbor awaiting address resolution.\r
//\r
- Neighbor->CallBack ((VOID *) Neighbor);\r
+ Neighbor->CallBack ((VOID *)Neighbor);\r
}\r
\r
Neighbor->IsRouter = IsRouter;\r
-\r
} else {\r
- if (!Override && Compare != 0) {\r
+ if (!Override && (Compare != 0)) {\r
//\r
// When the Override Flag is clear and supplied link-layer address differs from\r
// that in the cache, if the state of the entry is not REACHABLE, ignore the\r
//\r
if (Neighbor->State == EfiNeighborReachable) {\r
Neighbor->State = EfiNeighborStale;\r
- Neighbor->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
+ Neighbor->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
}\r
} else {\r
if (Compare != 0) {\r
CopyMem (Neighbor->LinkAddress.Addr, LinkLayerOption.EtherAddr, 6);\r
}\r
+\r
//\r
// Update the entry's state\r
//\r
} else {\r
if (Compare != 0) {\r
Neighbor->State = EfiNeighborStale;\r
- Neighbor->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
+ Neighbor->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
}\r
}\r
\r
}\r
\r
if (Neighbor->State == EfiNeighborReachable) {\r
- Neighbor->CallBack ((VOID *) Neighbor);\r
+ Neighbor->CallBack ((VOID *)Neighbor);\r
}\r
\r
Status = EFI_SUCCESS;\r
**/\r
EFI_STATUS\r
Ip6ProcessRouterAdvertise (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IP6_HEADER *Head,\r
- IN NET_BUF *Packet\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IP6_HEADER *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IP6_ICMP_INFORMATION_HEAD Icmp;\r
- UINT32 ReachableTime;\r
- UINT32 RetransTimer;\r
- UINT16 RouterLifetime;\r
- UINT32 Offset;\r
- UINT8 Type;\r
- UINT8 Length;\r
- IP6_ETHER_ADDR_OPTION LinkLayerOption;\r
- UINT32 Fourth;\r
- UINT8 CurHopLimit;\r
- BOOLEAN Mflag;\r
- BOOLEAN Oflag;\r
- IP6_DEFAULT_ROUTER *DefaultRouter;\r
- IP6_NEIGHBOR_ENTRY *NeighborCache;\r
- EFI_MAC_ADDRESS LinkLayerAddress;\r
- IP6_MTU_OPTION MTUOption;\r
- IP6_PREFIX_INFO_OPTION PrefixOption;\r
- IP6_PREFIX_LIST_ENTRY *PrefixList;\r
- BOOLEAN OnLink;\r
- BOOLEAN Autonomous;\r
- EFI_IPv6_ADDRESS StatelessAddress;\r
- EFI_STATUS Status;\r
- UINT16 OptionLen;\r
- UINT8 *Option;\r
- INTN Result;\r
+ IP6_ICMP_INFORMATION_HEAD Icmp;\r
+ UINT32 ReachableTime;\r
+ UINT32 RetransTimer;\r
+ UINT16 RouterLifetime;\r
+ UINT32 Offset;\r
+ UINT8 Type;\r
+ UINT8 Length;\r
+ IP6_ETHER_ADDR_OPTION LinkLayerOption;\r
+ UINT32 Fourth;\r
+ UINT8 CurHopLimit;\r
+ BOOLEAN Mflag;\r
+ BOOLEAN Oflag;\r
+ IP6_DEFAULT_ROUTER *DefaultRouter;\r
+ IP6_NEIGHBOR_ENTRY *NeighborCache;\r
+ EFI_MAC_ADDRESS LinkLayerAddress;\r
+ IP6_MTU_OPTION MTUOption;\r
+ IP6_PREFIX_INFO_OPTION PrefixOption;\r
+ IP6_PREFIX_LIST_ENTRY *PrefixList;\r
+ BOOLEAN OnLink;\r
+ BOOLEAN Autonomous;\r
+ EFI_IPv6_ADDRESS StatelessAddress;\r
+ EFI_STATUS Status;\r
+ UINT16 OptionLen;\r
+ UINT8 *Option;\r
+ INTN Result;\r
\r
Status = EFI_INVALID_PARAMETER;\r
\r
goto Exit;\r
}\r
\r
- NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+ NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
\r
//\r
// Validate the incoming Router Advertisement\r
if (!NetIp6IsLinkLocalAddr (&Head->SourceAddress)) {\r
goto Exit;\r
}\r
+\r
//\r
// The IP Hop Limit field has a value of 255, i.e. the packet\r
// could not possibly have been forwarded by a router.\r
// ICMP Code is 0.\r
// ICMP length (derived from the IP length) is 16 or more octets.\r
//\r
- if (Head->HopLimit != IP6_HOP_LIMIT || Icmp.Head.Code != 0 ||\r
- Head->PayloadLength < IP6_RA_LENGTH) {\r
+ if ((Head->HopLimit != IP6_HOP_LIMIT) || (Icmp.Head.Code != 0) ||\r
+ (Head->PayloadLength < IP6_RA_LENGTH))\r
+ {\r
goto Exit;\r
}\r
\r
//\r
// All included options have a length that is greater than zero.\r
//\r
- OptionLen = (UINT16) (Head->PayloadLength - IP6_RA_LENGTH);\r
+ OptionLen = (UINT16)(Head->PayloadLength - IP6_RA_LENGTH);\r
if (OptionLen != 0) {\r
- Option = NetbufGetByte (Packet, IP6_RA_LENGTH, NULL);\r
+ Option = NetbufGetByte (Packet, IP6_RA_LENGTH, NULL);\r
ASSERT (Option != NULL);\r
\r
if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
}\r
}\r
\r
- CurHopLimit = *((UINT8 *) &Fourth + 3);\r
+ CurHopLimit = *((UINT8 *)&Fourth + 3);\r
if (CurHopLimit != 0) {\r
IpSb->CurHopLimit = CurHopLimit;\r
}\r
\r
Mflag = FALSE;\r
Oflag = FALSE;\r
- if ((*((UINT8 *) &Fourth + 2) & IP6_M_ADDR_CONFIG_FLAG) == IP6_M_ADDR_CONFIG_FLAG) {\r
+ if ((*((UINT8 *)&Fourth + 2) & IP6_M_ADDR_CONFIG_FLAG) == IP6_M_ADDR_CONFIG_FLAG) {\r
Mflag = TRUE;\r
} else {\r
- if ((*((UINT8 *) &Fourth + 2) & IP6_O_CONFIG_FLAG) == IP6_O_CONFIG_FLAG) {\r
+ if ((*((UINT8 *)&Fourth + 2) & IP6_O_CONFIG_FLAG) == IP6_O_CONFIG_FLAG) {\r
Oflag = TRUE;\r
}\r
}\r
//\r
// Process Reachable Time and Retrans Timer fields.\r
//\r
- NetbufCopy (Packet, sizeof (Icmp), sizeof (UINT32), (UINT8 *) &ReachableTime);\r
- NetbufCopy (Packet, sizeof (Icmp) + sizeof (UINT32), sizeof (UINT32), (UINT8 *) &RetransTimer);\r
+ NetbufCopy (Packet, sizeof (Icmp), sizeof (UINT32), (UINT8 *)&ReachableTime);\r
+ NetbufCopy (Packet, sizeof (Icmp) + sizeof (UINT32), sizeof (UINT32), (UINT8 *)&RetransTimer);\r
ReachableTime = NTOHL (ReachableTime);\r
RetransTimer = NTOHL (RetransTimer);\r
\r
- if (ReachableTime != 0 && ReachableTime != IpSb->BaseReachableTime) {\r
+ if ((ReachableTime != 0) && (ReachableTime != IpSb->BaseReachableTime)) {\r
//\r
// If new value is not unspecified and differs from the previous one, record it\r
// in BaseReachableTime and recompute a ReachableTime.\r
// fit within the input packet.\r
//\r
Offset = 16;\r
- while (Offset < (UINT32) Head->PayloadLength) {\r
+ while (Offset < (UINT32)Head->PayloadLength) {\r
NetbufCopy (Packet, Offset, sizeof (UINT8), &Type);\r
switch (Type) {\r
- case Ip6OptionEtherSource:\r
- //\r
- // Update the neighbor cache\r
- //\r
- NetbufCopy (Packet, Offset, sizeof (IP6_ETHER_ADDR_OPTION), (UINT8 *) &LinkLayerOption);\r
+ case Ip6OptionEtherSource:\r
+ //\r
+ // Update the neighbor cache\r
+ //\r
+ NetbufCopy (Packet, Offset, sizeof (IP6_ETHER_ADDR_OPTION), (UINT8 *)&LinkLayerOption);\r
\r
- //\r
- // Option size validity ensured by Ip6IsNDOptionValid().\r
- //\r
- ASSERT (LinkLayerOption.Length != 0);\r
- ASSERT (Offset + (UINT32) LinkLayerOption.Length * 8 <= (UINT32) Head->PayloadLength);\r
+ //\r
+ // Option size validity ensured by Ip6IsNDOptionValid().\r
+ //\r
+ ASSERT (LinkLayerOption.Length != 0);\r
+ ASSERT (Offset + (UINT32)LinkLayerOption.Length * 8 <= (UINT32)Head->PayloadLength);\r
\r
- ZeroMem (&LinkLayerAddress, sizeof (EFI_MAC_ADDRESS));\r
- CopyMem (&LinkLayerAddress, LinkLayerOption.EtherAddr, 6);\r
+ ZeroMem (&LinkLayerAddress, sizeof (EFI_MAC_ADDRESS));\r
+ CopyMem (&LinkLayerAddress, LinkLayerOption.EtherAddr, 6);\r
\r
- if (NeighborCache == NULL) {\r
- NeighborCache = Ip6CreateNeighborEntry (\r
- IpSb,\r
- Ip6OnArpResolved,\r
- &Head->SourceAddress,\r
- &LinkLayerAddress\r
- );\r
if (NeighborCache == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Exit;\r
+ NeighborCache = Ip6CreateNeighborEntry (\r
+ IpSb,\r
+ Ip6OnArpResolved,\r
+ &Head->SourceAddress,\r
+ &LinkLayerAddress\r
+ );\r
+ if (NeighborCache == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
+ }\r
+\r
+ NeighborCache->IsRouter = TRUE;\r
+ NeighborCache->State = EfiNeighborStale;\r
+ NeighborCache->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
+ } else {\r
+ Result = CompareMem (&LinkLayerAddress, &NeighborCache->LinkAddress, 6);\r
+\r
+ //\r
+ // If the link-local address is the same as that already in the cache,\r
+ // the cache entry's state remains unchanged. Otherwise update the\r
+ // reachability state to STALE.\r
+ //\r
+ if ((NeighborCache->State == EfiNeighborInComplete) || (Result != 0)) {\r
+ CopyMem (&NeighborCache->LinkAddress, &LinkLayerAddress, 6);\r
+\r
+ NeighborCache->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
+\r
+ if (NeighborCache->State == EfiNeighborInComplete) {\r
+ //\r
+ // Send queued packets if exist.\r
+ //\r
+ NeighborCache->State = EfiNeighborStale;\r
+ NeighborCache->CallBack ((VOID *)NeighborCache);\r
+ } else {\r
+ NeighborCache->State = EfiNeighborStale;\r
+ }\r
+ }\r
}\r
- NeighborCache->IsRouter = TRUE;\r
- NeighborCache->State = EfiNeighborStale;\r
- NeighborCache->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
- } else {\r
- Result = CompareMem (&LinkLayerAddress, &NeighborCache->LinkAddress, 6);\r
+\r
+ Offset += (UINT32)LinkLayerOption.Length * 8;\r
+ break;\r
+ case Ip6OptionPrefixInfo:\r
+ NetbufCopy (Packet, Offset, sizeof (IP6_PREFIX_INFO_OPTION), (UINT8 *)&PrefixOption);\r
\r
//\r
- // If the link-local address is the same as that already in the cache,\r
- // the cache entry's state remains unchanged. Otherwise update the\r
- // reachability state to STALE.\r
+ // Option size validity ensured by Ip6IsNDOptionValid().\r
//\r
- if ((NeighborCache->State == EfiNeighborInComplete) || (Result != 0)) {\r
- CopyMem (&NeighborCache->LinkAddress, &LinkLayerAddress, 6);\r
+ ASSERT (PrefixOption.Length == 4);\r
+ ASSERT (Offset + (UINT32)PrefixOption.Length * 8 <= (UINT32)Head->PayloadLength);\r
\r
- NeighborCache->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
+ PrefixOption.ValidLifetime = NTOHL (PrefixOption.ValidLifetime);\r
+ PrefixOption.PreferredLifetime = NTOHL (PrefixOption.PreferredLifetime);\r
\r
- if (NeighborCache->State == EfiNeighborInComplete) {\r
- //\r
- // Send queued packets if exist.\r
- //\r
- NeighborCache->State = EfiNeighborStale;\r
- NeighborCache->CallBack ((VOID *) NeighborCache);\r
- } else {\r
- NeighborCache->State = EfiNeighborStale;\r
- }\r
+ //\r
+ // Get L and A flag, recorded in the lower 2 bits of Reserved1\r
+ //\r
+ OnLink = FALSE;\r
+ if ((PrefixOption.Reserved1 & IP6_ON_LINK_FLAG) == IP6_ON_LINK_FLAG) {\r
+ OnLink = TRUE;\r
}\r
- }\r
-\r
- Offset += (UINT32) LinkLayerOption.Length * 8;\r
- break;\r
- case Ip6OptionPrefixInfo:\r
- NetbufCopy (Packet, Offset, sizeof (IP6_PREFIX_INFO_OPTION), (UINT8 *) &PrefixOption);\r
\r
- //\r
- // Option size validity ensured by Ip6IsNDOptionValid().\r
- //\r
- ASSERT (PrefixOption.Length == 4);\r
- ASSERT (Offset + (UINT32) PrefixOption.Length * 8 <= (UINT32) Head->PayloadLength);\r
-\r
- PrefixOption.ValidLifetime = NTOHL (PrefixOption.ValidLifetime);\r
- PrefixOption.PreferredLifetime = NTOHL (PrefixOption.PreferredLifetime);\r
+ Autonomous = FALSE;\r
+ if ((PrefixOption.Reserved1 & IP6_AUTO_CONFIG_FLAG) == IP6_AUTO_CONFIG_FLAG) {\r
+ Autonomous = TRUE;\r
+ }\r
\r
- //\r
- // Get L and A flag, recorded in the lower 2 bits of Reserved1\r
- //\r
- OnLink = FALSE;\r
- if ((PrefixOption.Reserved1 & IP6_ON_LINK_FLAG) == IP6_ON_LINK_FLAG) {\r
- OnLink = TRUE;\r
- }\r
- Autonomous = FALSE;\r
- if ((PrefixOption.Reserved1 & IP6_AUTO_CONFIG_FLAG) == IP6_AUTO_CONFIG_FLAG) {\r
- Autonomous = TRUE;\r
- }\r
+ //\r
+ // If the prefix is the link-local prefix, silently ignore the prefix option.\r
+ //\r
+ if ((PrefixOption.PrefixLength == IP6_LINK_LOCAL_PREFIX_LENGTH) &&\r
+ NetIp6IsLinkLocalAddr (&PrefixOption.Prefix)\r
+ )\r
+ {\r
+ Offset += sizeof (IP6_PREFIX_INFO_OPTION);\r
+ break;\r
+ }\r
\r
- //\r
- // If the prefix is the link-local prefix, silently ignore the prefix option.\r
- //\r
- if (PrefixOption.PrefixLength == IP6_LINK_LOCAL_PREFIX_LENGTH &&\r
- NetIp6IsLinkLocalAddr (&PrefixOption.Prefix)\r
- ) {\r
- Offset += sizeof (IP6_PREFIX_INFO_OPTION);\r
- break;\r
- }\r
- //\r
- // Do following if on-link flag is set according to RFC4861.\r
- //\r
- if (OnLink) {\r
- PrefixList = Ip6FindPrefixListEntry (\r
- IpSb,\r
- TRUE,\r
- PrefixOption.PrefixLength,\r
- &PrefixOption.Prefix\r
- );\r
//\r
- // Create a new entry for the prefix, if the ValidLifetime is zero,\r
- // silently ignore the prefix option.\r
+ // Do following if on-link flag is set according to RFC4861.\r
//\r
- if (PrefixList == NULL && PrefixOption.ValidLifetime != 0) {\r
- PrefixList = Ip6CreatePrefixListEntry (\r
+ if (OnLink) {\r
+ PrefixList = Ip6FindPrefixListEntry (\r
IpSb,\r
TRUE,\r
- PrefixOption.ValidLifetime,\r
- PrefixOption.PreferredLifetime,\r
PrefixOption.PrefixLength,\r
&PrefixOption.Prefix\r
);\r
- if (PrefixList == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Exit;\r
- }\r
- } else if (PrefixList != NULL) {\r
- if (PrefixOption.ValidLifetime != 0) {\r
- PrefixList->ValidLifetime = PrefixOption.ValidLifetime;\r
- } else {\r
- //\r
- // If the prefix exists and incoming ValidLifetime is zero, immediately\r
- // remove the prefix.\r
- Ip6DestroyPrefixListEntry (IpSb, PrefixList, OnLink, TRUE);\r
- }\r
- }\r
- }\r
-\r
- //\r
- // Do following if Autonomous flag is set according to RFC4862.\r
- //\r
- if (Autonomous && PrefixOption.PreferredLifetime <= PrefixOption.ValidLifetime) {\r
- PrefixList = Ip6FindPrefixListEntry (\r
- IpSb,\r
- FALSE,\r
- PrefixOption.PrefixLength,\r
- &PrefixOption.Prefix\r
- );\r
- //\r
- // Create a new entry for the prefix, and form an address by prefix + interface id\r
- // If the sum of the prefix length and interface identifier length\r
- // does not equal 128 bits, the Prefix Information option MUST be ignored.\r
- //\r
- if (PrefixList == NULL &&\r
- PrefixOption.ValidLifetime != 0 &&\r
- PrefixOption.PrefixLength + IpSb->InterfaceIdLen * 8 == 128\r
- ) {\r
//\r
- // Form the address in network order.\r
+ // Create a new entry for the prefix, if the ValidLifetime is zero,\r
+ // silently ignore the prefix option.\r
//\r
- CopyMem (&StatelessAddress, &PrefixOption.Prefix, sizeof (UINT64));\r
- CopyMem (&StatelessAddress.Addr[8], IpSb->InterfaceId, sizeof (UINT64));\r
-\r
- //\r
- // If the address is not yet in the assigned address list, adds it into.\r
- //\r
- if (!Ip6IsOneOfSetAddress (IpSb, &StatelessAddress, NULL, NULL)) {\r
- //\r
- // And also not in the DAD process, check its uniqueness firstly.\r
- //\r
- if (Ip6FindDADEntry (IpSb, &StatelessAddress, NULL) == NULL) {\r
- Status = Ip6SetAddress (\r
- IpSb->DefaultInterface,\r
- &StatelessAddress,\r
- FALSE,\r
- PrefixOption.PrefixLength,\r
- PrefixOption.ValidLifetime,\r
- PrefixOption.PreferredLifetime,\r
- NULL,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Exit;\r
- }\r
+ if ((PrefixList == NULL) && (PrefixOption.ValidLifetime != 0)) {\r
+ PrefixList = Ip6CreatePrefixListEntry (\r
+ IpSb,\r
+ TRUE,\r
+ PrefixOption.ValidLifetime,\r
+ PrefixOption.PreferredLifetime,\r
+ PrefixOption.PrefixLength,\r
+ &PrefixOption.Prefix\r
+ );\r
+ if (PrefixList == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
+ }\r
+ } else if (PrefixList != NULL) {\r
+ if (PrefixOption.ValidLifetime != 0) {\r
+ PrefixList->ValidLifetime = PrefixOption.ValidLifetime;\r
+ } else {\r
+ //\r
+ // If the prefix exists and incoming ValidLifetime is zero, immediately\r
+ // remove the prefix.\r
+ Ip6DestroyPrefixListEntry (IpSb, PrefixList, OnLink, TRUE);\r
}\r
}\r
+ }\r
\r
- //\r
- // Adds the prefix option to stateless prefix option list.\r
- //\r
- PrefixList = Ip6CreatePrefixListEntry (\r
+ //\r
+ // Do following if Autonomous flag is set according to RFC4862.\r
+ //\r
+ if (Autonomous && (PrefixOption.PreferredLifetime <= PrefixOption.ValidLifetime)) {\r
+ PrefixList = Ip6FindPrefixListEntry (\r
IpSb,\r
FALSE,\r
- PrefixOption.ValidLifetime,\r
- PrefixOption.PreferredLifetime,\r
PrefixOption.PrefixLength,\r
&PrefixOption.Prefix\r
);\r
- if (PrefixList == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Exit;\r
- }\r
- } else if (PrefixList != NULL) {\r
-\r
//\r
- // Reset the preferred lifetime of the address if the advertised prefix exists.\r
- // Perform specific action to valid lifetime together.\r
+ // Create a new entry for the prefix, and form an address by prefix + interface id\r
+ // If the sum of the prefix length and interface identifier length\r
+ // does not equal 128 bits, the Prefix Information option MUST be ignored.\r
//\r
- PrefixList->PreferredLifetime = PrefixOption.PreferredLifetime;\r
- if ((PrefixOption.ValidLifetime > 7200) ||\r
- (PrefixOption.ValidLifetime > PrefixList->ValidLifetime)) {\r
+ if ((PrefixList == NULL) &&\r
+ (PrefixOption.ValidLifetime != 0) &&\r
+ (PrefixOption.PrefixLength + IpSb->InterfaceIdLen * 8 == 128)\r
+ )\r
+ {\r
//\r
- // If the received Valid Lifetime is greater than 2 hours or\r
- // greater than RemainingLifetime, set the valid lifetime of the\r
- // corresponding address to the advertised Valid Lifetime.\r
+ // Form the address in network order.\r
//\r
- PrefixList->ValidLifetime = PrefixOption.ValidLifetime;\r
+ CopyMem (&StatelessAddress, &PrefixOption.Prefix, sizeof (UINT64));\r
+ CopyMem (&StatelessAddress.Addr[8], IpSb->InterfaceId, sizeof (UINT64));\r
\r
- } else if (PrefixList->ValidLifetime <= 7200) {\r
//\r
- // If RemainingLifetime is less than or equals to 2 hours, ignore the\r
- // Prefix Information option with regards to the valid lifetime.\r
- // TODO: If this option has been authenticated, set the valid lifetime.\r
+ // If the address is not yet in the assigned address list, adds it into.\r
//\r
- } else {\r
+ if (!Ip6IsOneOfSetAddress (IpSb, &StatelessAddress, NULL, NULL)) {\r
+ //\r
+ // And also not in the DAD process, check its uniqueness firstly.\r
+ //\r
+ if (Ip6FindDADEntry (IpSb, &StatelessAddress, NULL) == NULL) {\r
+ Status = Ip6SetAddress (\r
+ IpSb->DefaultInterface,\r
+ &StatelessAddress,\r
+ FALSE,\r
+ PrefixOption.PrefixLength,\r
+ PrefixOption.ValidLifetime,\r
+ PrefixOption.PreferredLifetime,\r
+ NULL,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Exit;\r
+ }\r
+ }\r
+ }\r
+\r
//\r
- // Otherwise, reset the valid lifetime of the corresponding\r
- // address to 2 hours.\r
+ // Adds the prefix option to stateless prefix option list.\r
+ //\r
+ PrefixList = Ip6CreatePrefixListEntry (\r
+ IpSb,\r
+ FALSE,\r
+ PrefixOption.ValidLifetime,\r
+ PrefixOption.PreferredLifetime,\r
+ PrefixOption.PrefixLength,\r
+ &PrefixOption.Prefix\r
+ );\r
+ if (PrefixList == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
+ }\r
+ } else if (PrefixList != NULL) {\r
//\r
- PrefixList->ValidLifetime = 7200;\r
+ // Reset the preferred lifetime of the address if the advertised prefix exists.\r
+ // Perform specific action to valid lifetime together.\r
+ //\r
+ PrefixList->PreferredLifetime = PrefixOption.PreferredLifetime;\r
+ if ((PrefixOption.ValidLifetime > 7200) ||\r
+ (PrefixOption.ValidLifetime > PrefixList->ValidLifetime))\r
+ {\r
+ //\r
+ // If the received Valid Lifetime is greater than 2 hours or\r
+ // greater than RemainingLifetime, set the valid lifetime of the\r
+ // corresponding address to the advertised Valid Lifetime.\r
+ //\r
+ PrefixList->ValidLifetime = PrefixOption.ValidLifetime;\r
+ } else if (PrefixList->ValidLifetime <= 7200) {\r
+ //\r
+ // If RemainingLifetime is less than or equals to 2 hours, ignore the\r
+ // Prefix Information option with regards to the valid lifetime.\r
+ // TODO: If this option has been authenticated, set the valid lifetime.\r
+ //\r
+ } else {\r
+ //\r
+ // Otherwise, reset the valid lifetime of the corresponding\r
+ // address to 2 hours.\r
+ //\r
+ PrefixList->ValidLifetime = 7200;\r
+ }\r
}\r
}\r
- }\r
\r
- Offset += sizeof (IP6_PREFIX_INFO_OPTION);\r
- break;\r
- case Ip6OptionMtu:\r
- NetbufCopy (Packet, Offset, sizeof (IP6_MTU_OPTION), (UINT8 *) &MTUOption);\r
+ Offset += sizeof (IP6_PREFIX_INFO_OPTION);\r
+ break;\r
+ case Ip6OptionMtu:\r
+ NetbufCopy (Packet, Offset, sizeof (IP6_MTU_OPTION), (UINT8 *)&MTUOption);\r
\r
- //\r
- // Option size validity ensured by Ip6IsNDOptionValid().\r
- //\r
- ASSERT (MTUOption.Length == 1);\r
- ASSERT (Offset + (UINT32) MTUOption.Length * 8 <= (UINT32) Head->PayloadLength);\r
+ //\r
+ // Option size validity ensured by Ip6IsNDOptionValid().\r
+ //\r
+ ASSERT (MTUOption.Length == 1);\r
+ ASSERT (Offset + (UINT32)MTUOption.Length * 8 <= (UINT32)Head->PayloadLength);\r
\r
- //\r
- // Use IPv6 minimum link MTU 1280 bytes as the maximum packet size in order\r
- // to omit implementation of Path MTU Discovery. Thus ignore the MTU option\r
- // in Router Advertisement.\r
- //\r
+ //\r
+ // Use IPv6 minimum link MTU 1280 bytes as the maximum packet size in order\r
+ // to omit implementation of Path MTU Discovery. Thus ignore the MTU option\r
+ // in Router Advertisement.\r
+ //\r
\r
- Offset += sizeof (IP6_MTU_OPTION);\r
- break;\r
- default:\r
- //\r
- // Silently ignore unrecognized options\r
- //\r
- NetbufCopy (Packet, Offset + sizeof (UINT8), sizeof (UINT8), &Length);\r
+ Offset += sizeof (IP6_MTU_OPTION);\r
+ break;\r
+ default:\r
+ //\r
+ // Silently ignore unrecognized options\r
+ //\r
+ NetbufCopy (Packet, Offset + sizeof (UINT8), sizeof (UINT8), &Length);\r
\r
- ASSERT (Length != 0);\r
+ ASSERT (Length != 0);\r
\r
- Offset += (UINT32) Length * 8;\r
- break;\r
+ Offset += (UINT32)Length * 8;\r
+ break;\r
}\r
}\r
\r
**/\r
EFI_STATUS\r
Ip6ProcessRedirect (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IP6_HEADER *Head,\r
- IN NET_BUF *Packet\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IP6_HEADER *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IP6_ICMP_INFORMATION_HEAD *Icmp;\r
- EFI_IPv6_ADDRESS *Target;\r
- EFI_IPv6_ADDRESS *IcmpDest;\r
- UINT8 *Option;\r
- UINT16 OptionLen;\r
- IP6_ROUTE_ENTRY *RouteEntry;\r
- IP6_ROUTE_CACHE_ENTRY *RouteCache;\r
- IP6_NEIGHBOR_ENTRY *NeighborCache;\r
- INT32 Length;\r
- UINT8 OptLen;\r
- IP6_ETHER_ADDR_OPTION *LinkLayerOption;\r
- EFI_MAC_ADDRESS Mac;\r
- UINT32 Index;\r
- BOOLEAN IsRouter;\r
- EFI_STATUS Status;\r
- INTN Result;\r
+ IP6_ICMP_INFORMATION_HEAD *Icmp;\r
+ EFI_IPv6_ADDRESS *Target;\r
+ EFI_IPv6_ADDRESS *IcmpDest;\r
+ UINT8 *Option;\r
+ UINT16 OptionLen;\r
+ IP6_ROUTE_ENTRY *RouteEntry;\r
+ IP6_ROUTE_CACHE_ENTRY *RouteCache;\r
+ IP6_NEIGHBOR_ENTRY *NeighborCache;\r
+ INT32 Length;\r
+ UINT8 OptLen;\r
+ IP6_ETHER_ADDR_OPTION *LinkLayerOption;\r
+ EFI_MAC_ADDRESS Mac;\r
+ UINT32 Index;\r
+ BOOLEAN IsRouter;\r
+ EFI_STATUS Status;\r
+ INTN Result;\r
\r
Status = EFI_INVALID_PARAMETER;\r
\r
- Icmp = (IP6_ICMP_INFORMATION_HEAD *) NetbufGetByte (Packet, 0, NULL);\r
+ Icmp = (IP6_ICMP_INFORMATION_HEAD *)NetbufGetByte (Packet, 0, NULL);\r
if (Icmp == NULL) {\r
goto Exit;\r
}\r
// ICMP Code is 0.\r
// ICMP length (derived from the IP length) is 40 or more octets.\r
//\r
- if (Head->HopLimit != IP6_HOP_LIMIT || Icmp->Head.Code != 0 ||\r
- Head->PayloadLength < IP6_REDITECT_LENGTH) {\r
+ if ((Head->HopLimit != IP6_HOP_LIMIT) || (Icmp->Head.Code != 0) ||\r
+ (Head->PayloadLength < IP6_REDITECT_LENGTH))\r
+ {\r
goto Exit;\r
}\r
\r
//\r
// All included options have a length that is greater than zero.\r
//\r
- OptionLen = (UINT16) (Head->PayloadLength - IP6_REDITECT_LENGTH);\r
+ OptionLen = (UINT16)(Head->PayloadLength - IP6_REDITECT_LENGTH);\r
if (OptionLen != 0) {\r
- Option = NetbufGetByte (Packet, IP6_REDITECT_LENGTH, NULL);\r
+ Option = NetbufGetByte (Packet, IP6_REDITECT_LENGTH, NULL);\r
ASSERT (Option != NULL);\r
\r
if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
}\r
}\r
\r
- Target = (EFI_IPv6_ADDRESS *) (Icmp + 1);\r
+ Target = (EFI_IPv6_ADDRESS *)(Icmp + 1);\r
IcmpDest = Target + 1;\r
\r
//\r
// address option.\r
//\r
Length = Packet->TotalSize - 40;\r
- Option = (UINT8 *) (IcmpDest + 1);\r
+ Option = (UINT8 *)(IcmpDest + 1);\r
LinkLayerOption = NULL;\r
while (Length > 0) {\r
switch (*Option) {\r
- case Ip6OptionEtherTarget:\r
+ case Ip6OptionEtherTarget:\r
\r
- LinkLayerOption = (IP6_ETHER_ADDR_OPTION *) Option;\r
- OptLen = LinkLayerOption->Length;\r
- if (OptLen != 1) {\r
- //\r
- // For ethernet, the length must be 1.\r
- //\r
- goto Exit;\r
- }\r
- break;\r
+ LinkLayerOption = (IP6_ETHER_ADDR_OPTION *)Option;\r
+ OptLen = LinkLayerOption->Length;\r
+ if (OptLen != 1) {\r
+ //\r
+ // For ethernet, the length must be 1.\r
+ //\r
+ goto Exit;\r
+ }\r
\r
- default:\r
+ break;\r
\r
- OptLen = *(Option + 1);\r
- if (OptLen == 0) {\r
- //\r
- // A length of 0 is invalid.\r
- //\r
- goto Exit;\r
- }\r
- break;\r
+ default:\r
+\r
+ OptLen = *(Option + 1);\r
+ if (OptLen == 0) {\r
+ //\r
+ // A length of 0 is invalid.\r
+ //\r
+ goto Exit;\r
+ }\r
+\r
+ break;\r
}\r
\r
Length -= 8 * OptLen;\r
IP6_COPY_ADDRESS (&RouteCache->NextHop, Target);\r
\r
if (!IsRouter) {\r
- RouteEntry = (IP6_ROUTE_ENTRY *) RouteCache->Tag;\r
+ RouteEntry = (IP6_ROUTE_ENTRY *)RouteCache->Tag;\r
RouteEntry->Flag = RouteEntry->Flag | IP6_DIRECT_ROUTE;\r
}\r
-\r
} else {\r
//\r
// Get the Route Entry.\r
IcmpDest,\r
&Head->DestinationAddress,\r
Target,\r
- (UINTN) RouteEntry\r
+ (UINTN)RouteEntry\r
);\r
if (RouteCache == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
}\r
\r
NeighborCache->State = EfiNeighborStale;\r
- NeighborCache->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
+ NeighborCache->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
} else {\r
Result = CompareMem (LinkLayerOption->EtherAddr, &NeighborCache->LinkAddress, 6);\r
\r
if ((NeighborCache->State == EfiNeighborInComplete) || (Result != 0)) {\r
CopyMem (&NeighborCache->LinkAddress, LinkLayerOption->EtherAddr, 6);\r
\r
- NeighborCache->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
+ NeighborCache->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
\r
if (NeighborCache->State == EfiNeighborInComplete) {\r
//\r
// Send queued packets if exist.\r
//\r
NeighborCache->State = EfiNeighborStale;\r
- NeighborCache->CallBack ((VOID *) NeighborCache);\r
+ NeighborCache->CallBack ((VOID *)NeighborCache);\r
} else {\r
NeighborCache->State = EfiNeighborStale;\r
}\r
}\r
}\r
\r
- if (NeighborCache != NULL && IsRouter) {\r
+ if ((NeighborCache != NULL) && IsRouter) {\r
//\r
// The Target is a router, set IsRouter to TRUE.\r
//\r
**/\r
EFI_STATUS\r
Ip6AddNeighbor (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
- IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r
- IN UINT32 Timeout,\r
- IN BOOLEAN Override\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
+ IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r
+ IN UINT32 Timeout,\r
+ IN BOOLEAN Override\r
)\r
{\r
- IP6_NEIGHBOR_ENTRY *Neighbor;\r
+ IP6_NEIGHBOR_ENTRY *Neighbor;\r
\r
Neighbor = Ip6FindNeighborEntry (IpSb, TargetIp6Address);\r
if (Neighbor != NULL) {\r
Neighbor->Ticks = IP6_GET_TICKS (Timeout / TICKS_PER_MS);\r
Neighbor->Dynamic = TRUE;\r
} else {\r
- Neighbor->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
+ Neighbor->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
}\r
\r
return EFI_SUCCESS;\r
**/\r
EFI_STATUS\r
Ip6DelNeighbor (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
- IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r
- IN UINT32 Timeout,\r
- IN BOOLEAN Override\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
+ IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r
+ IN UINT32 Timeout,\r
+ IN BOOLEAN Override\r
)\r
{\r
- IP6_NEIGHBOR_ENTRY *Neighbor;\r
+ IP6_NEIGHBOR_ENTRY *Neighbor;\r
\r
Neighbor = Ip6FindNeighborEntry (IpSb, TargetIp6Address);\r
if (Neighbor == NULL) {\r
VOID\r
EFIAPI\r
Ip6NdFasterTimerTicking (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- LIST_ENTRY *Next;\r
- LIST_ENTRY *Entry2;\r
- IP6_INTERFACE *IpIf;\r
- IP6_DELAY_JOIN_LIST *DelayNode;\r
- EFI_IPv6_ADDRESS Source;\r
- IP6_DAD_ENTRY *DupAddrDetect;\r
- EFI_STATUS Status;\r
- IP6_NEIGHBOR_ENTRY *NeighborCache;\r
- EFI_IPv6_ADDRESS Destination;\r
- IP6_SERVICE *IpSb;\r
- BOOLEAN Flag;\r
-\r
- IpSb = (IP6_SERVICE *) Context;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Next;\r
+ LIST_ENTRY *Entry2;\r
+ IP6_INTERFACE *IpIf;\r
+ IP6_DELAY_JOIN_LIST *DelayNode;\r
+ EFI_IPv6_ADDRESS Source;\r
+ IP6_DAD_ENTRY *DupAddrDetect;\r
+ EFI_STATUS Status;\r
+ IP6_NEIGHBOR_ENTRY *NeighborCache;\r
+ EFI_IPv6_ADDRESS Destination;\r
+ IP6_SERVICE *IpSb;\r
+ BOOLEAN Flag;\r
+\r
+ IpSb = (IP6_SERVICE *)Context;\r
NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
\r
ZeroMem (&Source, sizeof (EFI_IPv6_ADDRESS));\r
//\r
if ((IpSb->Ip6ConfigInstance.Policy == Ip6ConfigPolicyAutomatic) &&\r
!IpSb->RouterAdvertiseReceived &&\r
- IpSb->SolicitTimer > 0\r
- ) {\r
+ (IpSb->SolicitTimer > 0)\r
+ )\r
+ {\r
if ((IpSb->Ticks == 0) || (--IpSb->Ticks == 0)) {\r
Status = Ip6SendRouterSolicit (IpSb, NULL, NULL, NULL, NULL);\r
if (!EFI_ERROR (Status)) {\r
IpSb->SolicitTimer--;\r
- IpSb->Ticks = (UINT32) IP6_GET_TICKS (IP6_RTR_SOLICITATION_INTERVAL);\r
+ IpSb->Ticks = (UINT32)IP6_GET_TICKS (IP6_RTR_SOLICITATION_INTERVAL);\r
}\r
}\r
}\r
//\r
Flag = FALSE;\r
if ((DupAddrDetect->Receive == 0) ||\r
- (DupAddrDetect->Transmit <= DupAddrDetect->Receive)) {\r
+ (DupAddrDetect->Transmit <= DupAddrDetect->Receive))\r
+ {\r
Flag = TRUE;\r
}\r
\r
NeighborCache = NET_LIST_USER_STRUCT (Entry, IP6_NEIGHBOR_ENTRY, Link);\r
\r
switch (NeighborCache->State) {\r
- case EfiNeighborInComplete:\r
- if (NeighborCache->Ticks > 0) {\r
- --NeighborCache->Ticks;\r
- }\r
-\r
- //\r
- // Retransmit Neighbor Solicitation messages approximately every\r
- // RetransTimer milliseconds while awaiting a response.\r
- //\r
- if (NeighborCache->Ticks == 0) {\r
- if (NeighborCache->Transmit > 1) {\r
- //\r
- // Send out multicast neighbor solicitation for address resolution.\r
- // After last neighbor solicitation message has been sent out, wait\r
- // for RetransTimer and then remove entry if no response is received.\r
- //\r
- Ip6CreateSNMulticastAddr (&NeighborCache->Neighbor, &Destination);\r
- Status = Ip6SelectSourceAddress (IpSb, &NeighborCache->Neighbor, &Source);\r
- if (EFI_ERROR (Status)) {\r
- return;\r
- }\r
-\r
- Status = Ip6SendNeighborSolicit (\r
- IpSb,\r
- &Source,\r
- &Destination,\r
- &NeighborCache->Neighbor,\r
- &IpSb->SnpMode.CurrentAddress\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return;\r
- }\r
+ case EfiNeighborInComplete:\r
+ if (NeighborCache->Ticks > 0) {\r
+ --NeighborCache->Ticks;\r
}\r
\r
//\r
- // Update the retransmit times.\r
+ // Retransmit Neighbor Solicitation messages approximately every\r
+ // RetransTimer milliseconds while awaiting a response.\r
//\r
- if (NeighborCache->Transmit > 0) {\r
- --NeighborCache->Transmit;\r
- NeighborCache->Ticks = IP6_GET_TICKS (IpSb->RetransTimer);\r
- }\r
- }\r
-\r
- if (NeighborCache->Transmit == 0) {\r
- //\r
- // Timeout, send ICMP destination unreachable packet and then remove entry\r
- //\r
- Status = Ip6FreeNeighborEntry (\r
- IpSb,\r
- NeighborCache,\r
- TRUE,\r
- TRUE,\r
- EFI_ICMP_ERROR,\r
- NULL,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return;\r
- }\r
- }\r
+ if (NeighborCache->Ticks == 0) {\r
+ if (NeighborCache->Transmit > 1) {\r
+ //\r
+ // Send out multicast neighbor solicitation for address resolution.\r
+ // After last neighbor solicitation message has been sent out, wait\r
+ // for RetransTimer and then remove entry if no response is received.\r
+ //\r
+ Ip6CreateSNMulticastAddr (&NeighborCache->Neighbor, &Destination);\r
+ Status = Ip6SelectSourceAddress (IpSb, &NeighborCache->Neighbor, &Source);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
\r
- break;\r
+ Status = Ip6SendNeighborSolicit (\r
+ IpSb,\r
+ &Source,\r
+ &Destination,\r
+ &NeighborCache->Neighbor,\r
+ &IpSb->SnpMode.CurrentAddress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+ }\r
\r
- case EfiNeighborReachable:\r
- //\r
- // This entry is inserted by EfiIp6Neighbors() as static entry\r
- // and will not timeout.\r
- //\r
- if (!NeighborCache->Dynamic && (NeighborCache->Ticks == IP6_INFINIT_LIFETIME)) {\r
- break;\r
- }\r
+ //\r
+ // Update the retransmit times.\r
+ //\r
+ if (NeighborCache->Transmit > 0) {\r
+ --NeighborCache->Transmit;\r
+ NeighborCache->Ticks = IP6_GET_TICKS (IpSb->RetransTimer);\r
+ }\r
+ }\r
\r
- if ((NeighborCache->Ticks == 0) || (--NeighborCache->Ticks == 0)) {\r
- if (NeighborCache->Dynamic) {\r
+ if (NeighborCache->Transmit == 0) {\r
//\r
- // This entry is inserted by EfiIp6Neighbors() as dynamic entry\r
- // and will be deleted after timeout.\r
+ // Timeout, send ICMP destination unreachable packet and then remove entry\r
//\r
Status = Ip6FreeNeighborEntry (\r
IpSb,\r
NeighborCache,\r
- FALSE,\r
TRUE,\r
- EFI_TIMEOUT,\r
+ TRUE,\r
+ EFI_ICMP_ERROR,\r
NULL,\r
NULL\r
);\r
if (EFI_ERROR (Status)) {\r
return;\r
}\r
- } else {\r
- NeighborCache->State = EfiNeighborStale;\r
- NeighborCache->Ticks = (UINT32) IP6_INFINIT_LIFETIME;\r
}\r
- }\r
\r
- break;\r
-\r
- case EfiNeighborDelay:\r
- if ((NeighborCache->Ticks == 0) || (--NeighborCache->Ticks == 0)) {\r
+ break;\r
\r
- NeighborCache->State = EfiNeighborProbe;\r
- NeighborCache->Ticks = IP6_GET_TICKS (IpSb->RetransTimer);\r
- NeighborCache->Transmit = IP6_MAX_UNICAST_SOLICIT + 1;\r
+ case EfiNeighborReachable:\r
//\r
- // Send out unicast neighbor solicitation for Neighbor Unreachability Detection\r
+ // This entry is inserted by EfiIp6Neighbors() as static entry\r
+ // and will not timeout.\r
//\r
- Status = Ip6SelectSourceAddress (IpSb, &NeighborCache->Neighbor, &Source);\r
- if (EFI_ERROR (Status)) {\r
- return;\r
+ if (!NeighborCache->Dynamic && (NeighborCache->Ticks == IP6_INFINIT_LIFETIME)) {\r
+ break;\r
}\r
\r
- Status = Ip6SendNeighborSolicit (\r
- IpSb,\r
- &Source,\r
- &NeighborCache->Neighbor,\r
- &NeighborCache->Neighbor,\r
- &IpSb->SnpMode.CurrentAddress\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return;\r
+ if ((NeighborCache->Ticks == 0) || (--NeighborCache->Ticks == 0)) {\r
+ if (NeighborCache->Dynamic) {\r
+ //\r
+ // This entry is inserted by EfiIp6Neighbors() as dynamic entry\r
+ // and will be deleted after timeout.\r
+ //\r
+ Status = Ip6FreeNeighborEntry (\r
+ IpSb,\r
+ NeighborCache,\r
+ FALSE,\r
+ TRUE,\r
+ EFI_TIMEOUT,\r
+ NULL,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+ } else {\r
+ NeighborCache->State = EfiNeighborStale;\r
+ NeighborCache->Ticks = (UINT32)IP6_INFINIT_LIFETIME;\r
+ }\r
}\r
\r
- NeighborCache->Transmit--;\r
- }\r
-\r
- break;\r
-\r
- case EfiNeighborProbe:\r
- if (NeighborCache->Ticks > 0) {\r
- --NeighborCache->Ticks;\r
- }\r
+ break;\r
\r
- //\r
- // Retransmit Neighbor Solicitation messages approximately every\r
- // RetransTimer milliseconds while awaiting a response.\r
- //\r
- if (NeighborCache->Ticks == 0) {\r
- if (NeighborCache->Transmit > 1) {\r
+ case EfiNeighborDelay:\r
+ if ((NeighborCache->Ticks == 0) || (--NeighborCache->Ticks == 0)) {\r
+ NeighborCache->State = EfiNeighborProbe;\r
+ NeighborCache->Ticks = IP6_GET_TICKS (IpSb->RetransTimer);\r
+ NeighborCache->Transmit = IP6_MAX_UNICAST_SOLICIT + 1;\r
//\r
- // Send out unicast neighbor solicitation for Neighbor Unreachability\r
- // Detection. After last neighbor solicitation message has been sent out,\r
- // wait for RetransTimer and then remove entry if no response is received.\r
+ // Send out unicast neighbor solicitation for Neighbor Unreachability Detection\r
//\r
Status = Ip6SelectSourceAddress (IpSb, &NeighborCache->Neighbor, &Source);\r
if (EFI_ERROR (Status)) {\r
if (EFI_ERROR (Status)) {\r
return;\r
}\r
+\r
+ NeighborCache->Transmit--;\r
}\r
\r
- //\r
- // Update the retransmit times.\r
- //\r
- if (NeighborCache->Transmit > 0) {\r
- --NeighborCache->Transmit;\r
- NeighborCache->Ticks = IP6_GET_TICKS (IpSb->RetransTimer);\r
+ break;\r
+\r
+ case EfiNeighborProbe:\r
+ if (NeighborCache->Ticks > 0) {\r
+ --NeighborCache->Ticks;\r
}\r
- }\r
\r
- if (NeighborCache->Transmit == 0) {\r
//\r
- // Delete the neighbor entry.\r
+ // Retransmit Neighbor Solicitation messages approximately every\r
+ // RetransTimer milliseconds while awaiting a response.\r
//\r
- Status = Ip6FreeNeighborEntry (\r
- IpSb,\r
- NeighborCache,\r
- FALSE,\r
- TRUE,\r
- EFI_TIMEOUT,\r
- NULL,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return;\r
+ if (NeighborCache->Ticks == 0) {\r
+ if (NeighborCache->Transmit > 1) {\r
+ //\r
+ // Send out unicast neighbor solicitation for Neighbor Unreachability\r
+ // Detection. After last neighbor solicitation message has been sent out,\r
+ // wait for RetransTimer and then remove entry if no response is received.\r
+ //\r
+ Status = Ip6SelectSourceAddress (IpSb, &NeighborCache->Neighbor, &Source);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+\r
+ Status = Ip6SendNeighborSolicit (\r
+ IpSb,\r
+ &Source,\r
+ &NeighborCache->Neighbor,\r
+ &NeighborCache->Neighbor,\r
+ &IpSb->SnpMode.CurrentAddress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Update the retransmit times.\r
+ //\r
+ if (NeighborCache->Transmit > 0) {\r
+ --NeighborCache->Transmit;\r
+ NeighborCache->Ticks = IP6_GET_TICKS (IpSb->RetransTimer);\r
+ }\r
}\r
- }\r
\r
- break;\r
+ if (NeighborCache->Transmit == 0) {\r
+ //\r
+ // Delete the neighbor entry.\r
+ //\r
+ Status = Ip6FreeNeighborEntry (\r
+ IpSb,\r
+ NeighborCache,\r
+ FALSE,\r
+ TRUE,\r
+ EFI_TIMEOUT,\r
+ NULL,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+ }\r
\r
- default:\r
- break;\r
+ break;\r
+\r
+ default:\r
+ break;\r
}\r
}\r
}\r
**/\r
VOID\r
Ip6NdTimerTicking (\r
- IN IP6_SERVICE *IpSb\r
+ IN IP6_SERVICE *IpSb\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- LIST_ENTRY *Next;\r
- IP6_DEFAULT_ROUTER *DefaultRouter;\r
- IP6_PREFIX_LIST_ENTRY *PrefixOption;\r
- UINT8 Index;\r
- IP6_ROUTE_CACHE_ENTRY *RouteCache;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Next;\r
+ IP6_DEFAULT_ROUTER *DefaultRouter;\r
+ IP6_PREFIX_LIST_ENTRY *PrefixOption;\r
+ UINT8 Index;\r
+ IP6_ROUTE_CACHE_ENTRY *RouteCache;\r
\r
//\r
// Decrease the lifetime of default router, if expires remove it from default router list.\r
//\r
NET_LIST_FOR_EACH_SAFE (Entry, Next, &IpSb->AutonomousPrefix) {\r
PrefixOption = NET_LIST_USER_STRUCT (Entry, IP6_PREFIX_LIST_ENTRY, Link);\r
- if (PrefixOption->ValidLifetime != (UINT32) IP6_INFINIT_LIFETIME) {\r
+ if (PrefixOption->ValidLifetime != (UINT32)IP6_INFINIT_LIFETIME) {\r
if ((PrefixOption->ValidLifetime > 0) && (--PrefixOption->ValidLifetime > 0)) {\r
- if ((PrefixOption->PreferredLifetime != (UINT32) IP6_INFINIT_LIFETIME) &&\r
+ if ((PrefixOption->PreferredLifetime != (UINT32)IP6_INFINIT_LIFETIME) &&\r
(PrefixOption->PreferredLifetime > 0)\r
- ) {\r
+ )\r
+ {\r
--PrefixOption->PreferredLifetime;\r
}\r
} else {\r
\r
NET_LIST_FOR_EACH_SAFE (Entry, Next, &IpSb->OnlinkPrefix) {\r
PrefixOption = NET_LIST_USER_STRUCT (Entry, IP6_PREFIX_LIST_ENTRY, Link);\r
- if (PrefixOption->ValidLifetime != (UINT32) IP6_INFINIT_LIFETIME) {\r
+ if (PrefixOption->ValidLifetime != (UINT32)IP6_INFINIT_LIFETIME) {\r
if ((PrefixOption->ValidLifetime == 0) || (--PrefixOption->ValidLifetime == 0)) {\r
Ip6DestroyPrefixListEntry (IpSb, PrefixOption, TRUE, TRUE);\r
}\r
}\r
}\r
}\r
-\r