1 /** @file
2 The implementation to go through each entry in IpSecConfig application.
3
4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
5
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 **/
15
16 #include "IpSecConfig.h"
17 #include "ForEach.h"
18
19
20 /**
21 Enumerate all entries in the database to execute specified operations according to datatype.
22
23 @param[in] DataType The value of EFI_IPSEC_CONFIG_DATA_TYPE.
24 @param[in] Routine The pointer to the function of a specified operation.
25 @param[in] Context The pointer to the context of a function.
26
27 @retval EFI_SUCCESS Execute specified operation successfully.
28 **/
29 EFI_STATUS
ForeachPolicyEntry(IN EFI_IPSEC_CONFIG_DATA_TYPE DataType,IN VISIT_POLICY_ENTRY Routine,IN VOID * Context)30 ForeachPolicyEntry (
31 IN EFI_IPSEC_CONFIG_DATA_TYPE DataType,
32 IN VISIT_POLICY_ENTRY Routine,
33 IN VOID *Context
34 )
35 {
36 EFI_STATUS GetNextStatus;
37 EFI_STATUS GetDataStatus;
38 EFI_IPSEC_CONFIG_SELECTOR *Selector;
39 VOID *Data;
40 UINTN SelectorSize;
41 UINTN DataSize;
42 BOOLEAN FirstGetNext;
43
44 FirstGetNext = TRUE;
45 SelectorSize = sizeof (EFI_IPSEC_CONFIG_SELECTOR);
46 Selector = AllocateZeroPool (SelectorSize);
47
48 DataSize = 0;
49 Data = NULL;
50
51 while (TRUE) {
52 GetNextStatus = mIpSecConfig->GetNextSelector (
53 mIpSecConfig,
54 DataType,
55 &SelectorSize,
56 Selector
57 );
58 if (GetNextStatus == EFI_BUFFER_TOO_SMALL) {
59 gBS->FreePool (Selector);
60 Selector = FirstGetNext ? AllocateZeroPool (SelectorSize) : AllocatePool (SelectorSize);
61
62 GetNextStatus = mIpSecConfig->GetNextSelector (
63 mIpSecConfig,
64 DataType,
65 &SelectorSize,
66 Selector
67 );
68 }
69
70 if (EFI_ERROR (GetNextStatus)) {
71 break;
72 }
73
74 FirstGetNext = FALSE;
75
76 GetDataStatus = mIpSecConfig->GetData (
77 mIpSecConfig,
78 DataType,
79 Selector,
80 &DataSize,
81 Data
82 );
83 if (GetDataStatus == EFI_BUFFER_TOO_SMALL) {
84 if (Data != NULL) {
85 gBS->FreePool (Data);
86 }
87
88 Data = AllocateZeroPool (DataSize);
89 GetDataStatus = mIpSecConfig->GetData (
90 mIpSecConfig,
91 DataType,
92 Selector,
93 &DataSize,
94 Data
95 );
96 }
97
98 ASSERT_EFI_ERROR (GetDataStatus);
99
100 if (EFI_ERROR (Routine (Selector, Data, Context))) {
101 break;
102 }
103 }
104
105 if (Data != NULL) {
106 gBS->FreePool (Data);
107 }
108
109 if (Selector != NULL) {
110 gBS->FreePool (Selector);
111 }
112
113 return EFI_SUCCESS;
114 }
115
116