summaryrefslogtreecommitdiffstats
path: root/NetworkPkg/Application/IpsecConfig/ForEach.c
blob: 6d82ee292b0cb1fad425d4ae10614c5a9507f42a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/** @file
  The implementation to go through each entry in IpSecConfig application.

  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#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;
}