/** Cancel the tokens in the specific token list. @param[in] Token Pointer to the Token. If NULL, all tokens in SpecifiedTokenList will be canceled. @param[in, out] SpecifiedTokenList Pointer to the token list to be checked. @retval EFI_SUCCESS Cancel the tokens in the specific token listsuccessfully. @retval EFI_NOT_FOUND The Token is not found in SpecifiedTokenList. **/ EFI_STATUS SockCancelToken ( IN SOCK_COMPLETION_TOKEN *Token, IN OUT LIST_ENTRY *SpecifiedTokenList ) { EFI_STATUS Status; LIST_ENTRY *Entry; SOCK_TOKEN *SockToken; Status = EFI_SUCCESS; Entry = NULL; SockToken = NULL; if (IsListEmpty (SpecifiedTokenList) && Token != NULL) { return EFI_NOT_FOUND; } // // Iterate through the SpecifiedTokenList. // Entry = SpecifiedTokenList->ForwardLink; while (Entry != SpecifiedTokenList) { SockToken = NET_LIST_USER_STRUCT (Entry, SOCK_TOKEN, TokenList); if (Token == NULL) { SIGNAL_TOKEN (SockToken->Token, EFI_ABORTED); RemoveEntryList (&SockToken->TokenList); FreePool (SockToken); Entry = SpecifiedTokenList->ForwardLink; Status = EFI_SUCCESS; } else { if (Token == (VOID *) SockToken->Token) { SIGNAL_TOKEN (Token, EFI_ABORTED); RemoveEntryList (&(SockToken->TokenList)); FreePool (SockToken); return EFI_SUCCESS; } Status = EFI_NOT_FOUND; Entry = Entry->ForwardLink; } } ASSERT (IsListEmpty (SpecifiedTokenList) || Token != NULL); return Status; }
/** Get the next buffer block in the specific socket buffer. @param Sockbuf Pointer to the socket buffer. @param SockEntry Pointer to the buffer block prior to the required one. @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is the tail or head entry. **/ NET_BUF * SockBufNext ( IN SOCK_BUFFER *Sockbuf, IN NET_BUF *SockEntry ) { LIST_ENTRY *NetbufList; NetbufList = &(Sockbuf->DataQueue->BufList); if ((SockEntry->List.ForwardLink == NetbufList) || (SockEntry->List.BackLink == &SockEntry->List) || (SockEntry->List.ForwardLink == &SockEntry->List)) { return NULL; } return NET_LIST_USER_STRUCT (SockEntry->List.ForwardLink, NET_BUF, List); }
/** Check whether the Event is in the List. @param[in] List Pointer to the token list to be searched. @param[in] Event The event to be checked. @retval TRUE The specific Event exists in the List. @retval FALSE The specific Event is not in the List. **/ BOOLEAN SockTokenExistedInList ( IN LIST_ENTRY *List, IN EFI_EVENT Event ) { LIST_ENTRY *ListEntry; SOCK_TOKEN *SockToken; NET_LIST_FOR_EACH (ListEntry, List) { SockToken = NET_LIST_USER_STRUCT ( ListEntry, SOCK_TOKEN, TokenList ); if (Event == SockToken->Token->Event) { return TRUE; } }
STATIC BOOLEAN SockTokenExistedInList ( IN NET_LIST_ENTRY *List, IN EFI_EVENT Event ) /*++ Routine Description: Check whether the Event is in the List. Arguments: List - Pointer to the token list to be searched. Event - The event to be checked. Returns: BOOLEAN - If TRUE, the specific Event exists in the List. If FALSE, the specific Event is not in the List. --*/ { NET_LIST_ENTRY *ListEntry; SOCK_TOKEN *SockToken; NET_LIST_FOR_EACH (ListEntry, List) { SockToken = NET_LIST_USER_STRUCT ( ListEntry, SOCK_TOKEN, TokenList ); if (Event == SockToken->Token->Event) { return TRUE; } }
/** Remove the block number from the block range list. @param[in] Head The block range list to remove from. @param[in] Num The block number to remove. @param[in] Completed Whether Num is the last block number @param[out] TotalBlock The continuous block number in all @retval EFI_NOT_FOUND The block number isn't in the block range list. @retval EFI_SUCCESS The block number has been removed from the list. @retval EFI_OUT_OF_RESOURCES Failed to allocate resources. **/ EFI_STATUS Mtftp6RemoveBlockNum ( IN LIST_ENTRY *Head, IN UINT16 Num, IN BOOLEAN Completed, OUT UINT64 *TotalBlock ) { MTFTP6_BLOCK_RANGE *Range; MTFTP6_BLOCK_RANGE *NewRange; LIST_ENTRY *Entry; NET_LIST_FOR_EACH (Entry, Head) { // // Each block represents a hole [Start, End] in the file, // skip to the first range with End >= Num // Range = NET_LIST_USER_STRUCT (Entry, MTFTP6_BLOCK_RANGE, Link); if (Range->End < Num) { continue; } // // There are three different cases for Start // 1. (Start > Num) && (End >= Num): // because all the holes before this one has the condition of // End < Num, so this block number has been removed. // // 2. (Start == Num) && (End >= Num): // Need to increase the Start by one, and if End == Num, this // hole has been removed completely, remove it. // // 3. (Start < Num) && (End >= Num): // if End == Num, only need to decrease the End by one because // we have (Start < Num) && (Num == End), so (Start <= End - 1). // if (End > Num), the hold is splited into two holes, with // [Start, Num - 1] and [Num + 1, End]. // if (Range->Start > Num) { return EFI_NOT_FOUND; } else if (Range->Start == Num) { Range->Start++; // // Note that: RFC 1350 does not mention block counter roll-over, // but several TFTP hosts implement the roll-over be able to accept // transfers of unlimited size. There is no consensus, however, whether // the counter should wrap around to zero or to one. Many implementations // wrap to zero, because this is the simplest to implement. Here we choose // this solution. // *TotalBlock = Num; if (Range->Round > 0) { *TotalBlock += Range->Bound + MultU64x32 (Range->Round - 1, (UINT32)(Range->Bound + 1)) + 1; } if (Range->Start > Range->Bound) { Range->Start = 0; Range->Round ++; } if ((Range->Start > Range->End) || Completed) { RemoveEntryList (&Range->Link); FreePool (Range); } return EFI_SUCCESS; } else { if (Range->End == Num) { Range->End--; } else { NewRange = Mtftp6AllocateRange ((UINT16) (Num + 1), (UINT16) Range->End); if (NewRange == NULL) { return EFI_OUT_OF_RESOURCES; } Range->End = Num - 1; NetListInsertAfter (&Range->Link, &NewRange->Link); } return EFI_SUCCESS; } }
EFI_STATUS Mtftp4RemoveBlockNum ( IN NET_LIST_ENTRY *Head, IN UINT16 Num ) /*++ Routine Description: Remove the block number from the block range list. Arguments: Head - The block range list to remove from Num - The block number to remove Returns: EFI_NOT_FOUND - The block number isn't in the block range list EFI_SUCCESS - The block number has been removed from the list EFI_OUT_OF_RESOURCES - Failed to allocate resource --*/ { MTFTP4_BLOCK_RANGE *Range; MTFTP4_BLOCK_RANGE *NewRange; NET_LIST_ENTRY *Entry; NET_LIST_FOR_EACH (Entry, Head) { // // Each block represents a hole [Start, End] in the file, // skip to the first range with End >= Num // Range = NET_LIST_USER_STRUCT (Entry, MTFTP4_BLOCK_RANGE, Link); if (Range->End < Num) { continue; } // // There are three different cases for Start // 1. (Start > Num) && (End >= Num): // because all the holes before this one has the condition of // End < Num, so this block number has been removed. // // 2. (Start == Num) && (End >= Num): // Need to increase the Start by one, and if End == Num, this // hole has been removed completely, remove it. // // 3. (Start < Num) && (End >= Num): // if End == Num, only need to decrease the End by one because // we have (Start < Num) && (Num == End), so (Start <= End - 1). // if (End > Num), the hold is splited into two holes, with // [Start, Num - 1] and [Num + 1, End]. // if (Range->Start > Num) { return EFI_NOT_FOUND; } else if (Range->Start == Num) { Range->Start++; if (Range->Start > Range->End) { NetListRemoveEntry (&Range->Link); NetFreePool (Range); } return EFI_SUCCESS; } else { if (Range->End == Num) { Range->End--; } else { NewRange = Mtftp4AllocateRange (Num + 1, (UINT16) Range->End); if (NewRange == NULL) { return EFI_OUT_OF_RESOURCES; } Range->End = Num - 1; NetListInsertAfter (&Range->Link, &NewRange->Link); } return EFI_SUCCESS; } }
/** The list process of the ifconfig command. @param[in] IfList The pointer of IfList(interface list). @retval SHELL_SUCCESS The ifconfig command list processed successfully. @retval others The ifconfig command list process failed. **/ SHELL_STATUS IfConfigShowInterfaceInfo ( IN LIST_ENTRY *IfList ) { LIST_ENTRY *Entry; LIST_ENTRY *Next; IFCONFIG_INTERFACE_CB *IfCb; BOOLEAN MediaPresent; EFI_IPv4_ADDRESS Gateway; UINT32 Index; MediaPresent = TRUE; if (IsListEmpty (IfList)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); } // // Go through the interface list. // NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) { IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle); // // Print interface name. // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name); // // Get Media State. // NetLibDetectMedia (IfCb->NicHandle, &MediaPresent); if (!MediaPresent) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media disconnected"); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present"); } // // Print interface config policy. // if (IfCb->Policy == Ip4Config2PolicyDhcp) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_DHCP), gShellNetwork1HiiHandle); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle); } // // Print mac address of the interface. // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle); IfConfigPrintMacAddr ( IfCb->IfInfo->HwAddress.Addr, IfCb->IfInfo->HwAddressSize ); // // Print IPv4 address list of the interface. // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)IfCb->IfInfo->StationAddress.Addr[0], (UINTN)IfCb->IfInfo->StationAddress.Addr[1], (UINTN)IfCb->IfInfo->StationAddress.Addr[2], (UINTN)IfCb->IfInfo->StationAddress.Addr[3] ); // // Print subnet mask list of the interface. // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)IfCb->IfInfo->SubnetMask.Addr[0], (UINTN)IfCb->IfInfo->SubnetMask.Addr[1], (UINTN)IfCb->IfInfo->SubnetMask.Addr[2], (UINTN)IfCb->IfInfo->SubnetMask.Addr[3] ); // // Print default gateway of the interface. // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle); ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS)); for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) { if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) && (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS)); } } ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)Gateway.Addr[0], (UINTN)Gateway.Addr[1], (UINTN)Gateway.Addr[2], (UINTN)Gateway.Addr[3] ); // // Print route table entry. // ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize); for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) { ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), gShellNetwork1HiiHandle, L"Subnet ", (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0], (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1], (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2], (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3] ); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), gShellNetwork1HiiHandle, L"Netmask", (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0], (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1], (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2], (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3] ); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), gShellNetwork1HiiHandle, L"Gateway", (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0], (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1], (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2], (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3] ); } // // Print dns server addresses list of the interface if has. // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle); for (Index = 0; Index < IfCb->DnsCnt; Index++) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN) IfCb->DnsAddr[Index].Addr[0], (UINTN) IfCb->DnsAddr[Index].Addr[1], (UINTN) IfCb->DnsAddr[Index].Addr[2], (UINTN) IfCb->DnsAddr[Index].Addr[3] ); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle); } }
/** Unloads an image. @param ImageHandle Handle that identifies the image to be unloaded. @retval EFI_SUCCESS The image has been unloaded. @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle. **/ EFI_STATUS EFIAPI DnsUnload ( IN EFI_HANDLE ImageHandle ) { EFI_STATUS Status; LIST_ENTRY *Entry; DNS4_CACHE *ItemCache4; DNS4_SERVER_IP *ItemServerIp4; DNS6_CACHE *ItemCache6; DNS6_SERVER_IP *ItemServerIp6; ItemCache4 = NULL; ItemServerIp4 = NULL; ItemCache6 = NULL; ItemServerIp6 = NULL; // // Disconnect the driver specified by ImageHandle // Status = NetLibDefaultUnload(ImageHandle); if (EFI_ERROR (Status)) { return Status; } // // Free mDriverData. // if (mDriverData != NULL) { if (mDriverData->Timer != NULL) { gBS->CloseEvent (mDriverData->Timer); } while (!IsListEmpty (&mDriverData->Dns4CacheList)) { Entry = NetListRemoveHead (&mDriverData->Dns4CacheList); ItemCache4 = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink); if (ItemCache4->DnsCache.HostName != NULL) { FreePool (ItemCache4->DnsCache.HostName); } if (ItemCache4->DnsCache.IpAddress != NULL) { FreePool (ItemCache4->DnsCache.IpAddress); } FreePool (ItemCache4); } while (!IsListEmpty (&mDriverData->Dns4ServerList)) { Entry = NetListRemoveHead (&mDriverData->Dns4ServerList); ItemServerIp4 = NET_LIST_USER_STRUCT (Entry, DNS4_SERVER_IP, AllServerLink); FreePool (ItemServerIp4); } while (!IsListEmpty (&mDriverData->Dns6CacheList)) { Entry = NetListRemoveHead (&mDriverData->Dns6CacheList); ItemCache6 = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink); if (ItemCache6->DnsCache.HostName != NULL) { FreePool (ItemCache6->DnsCache.HostName); } if (ItemCache6->DnsCache.IpAddress != NULL) { FreePool (ItemCache6->DnsCache.IpAddress); } FreePool (ItemCache6); } while (!IsListEmpty (&mDriverData->Dns6ServerList)) { Entry = NetListRemoveHead (&mDriverData->Dns6ServerList); ItemServerIp6 = NET_LIST_USER_STRUCT (Entry, DNS6_SERVER_IP, AllServerLink); FreePool (ItemServerIp6); } FreePool (mDriverData); } return Status; }