| /** @file | |
| The implementation to go through each entry in IpSecConfig application. | |
| Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php. | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include "IpSecConfig.h" | |
| #include "ForEach.h" | |
| /** | |
| Enumerate all entries in the database to execute specified operations according to datatype. | |
| @param[in] DataType The value of EFI_IPSEC_CONFIG_DATA_TYPE. | |
| @param[in] Routine The pointer to the function of a specified operation. | |
| @param[in] Context The pointer to the context of a function. | |
| @retval EFI_SUCCESS Execute specified operation successfully. | |
| **/ | |
| EFI_STATUS | |
| ForeachPolicyEntry ( | |
| IN EFI_IPSEC_CONFIG_DATA_TYPE DataType, | |
| IN VISIT_POLICY_ENTRY Routine, | |
| IN VOID *Context | |
| ) | |
| { | |
| EFI_STATUS GetNextStatus; | |
| EFI_STATUS GetDataStatus; | |
| EFI_IPSEC_CONFIG_SELECTOR *Selector; | |
| VOID *Data; | |
| UINTN SelectorSize; | |
| UINTN DataSize; | |
| BOOLEAN FirstGetNext; | |
| FirstGetNext = TRUE; | |
| SelectorSize = sizeof (EFI_IPSEC_CONFIG_SELECTOR); | |
| Selector = AllocateZeroPool (SelectorSize); | |
| DataSize = 0; | |
| Data = NULL; | |
| while (TRUE) { | |
| GetNextStatus = mIpSecConfig->GetNextSelector ( | |
| mIpSecConfig, | |
| DataType, | |
| &SelectorSize, | |
| Selector | |
| ); | |
| if (GetNextStatus == EFI_BUFFER_TOO_SMALL) { | |
| gBS->FreePool (Selector); | |
| Selector = FirstGetNext ? AllocateZeroPool (SelectorSize) : AllocatePool (SelectorSize); | |
| GetNextStatus = mIpSecConfig->GetNextSelector ( | |
| mIpSecConfig, | |
| DataType, | |
| &SelectorSize, | |
| Selector | |
| ); | |
| } | |
| if (EFI_ERROR (GetNextStatus)) { | |
| break; | |
| } | |
| FirstGetNext = FALSE; | |
| GetDataStatus = mIpSecConfig->GetData ( | |
| mIpSecConfig, | |
| DataType, | |
| Selector, | |
| &DataSize, | |
| Data | |
| ); | |
| if (GetDataStatus == EFI_BUFFER_TOO_SMALL) { | |
| if (Data != NULL) { | |
| gBS->FreePool (Data); | |
| } | |
| Data = AllocateZeroPool (DataSize); | |
| GetDataStatus = mIpSecConfig->GetData ( | |
| mIpSecConfig, | |
| DataType, | |
| Selector, | |
| &DataSize, | |
| Data | |
| ); | |
| } | |
| ASSERT_EFI_ERROR (GetDataStatus); | |
| if (EFI_ERROR (Routine (Selector, Data, Context))) { | |
| break; | |
| } | |
| } | |
| if (Data != NULL) { | |
| gBS->FreePool (Data); | |
| } | |
| if (Selector != NULL) { | |
| gBS->FreePool (Selector); | |
| } | |
| return EFI_SUCCESS; | |
| } | |