1 /** @file
2   The miscellaneous structure definitions for WiFi connection driver.
3 
4   Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
5 
6   SPDX-License-Identifier: BSD-2-Clause-Patent
7 
8 **/
9 
10 #ifndef __EFI_WIFI_MGR_DXE_H__
11 #define __EFI_WIFI_MGR_DXE_H__
12 
13 #include <Uefi.h>
14 
15 //
16 // Libraries
17 //
18 #include <Library/UefiBootServicesTableLib.h>
19 #include <Library/UefiRuntimeServicesTableLib.h>
20 #include <Library/MemoryAllocationLib.h>
21 #include <Library/BaseMemoryLib.h>
22 #include <Library/BaseLib.h>
23 #include <Library/UefiLib.h>
24 #include <Library/DevicePathLib.h>
25 #include <Library/DebugLib.h>
26 #include <Library/HiiLib.h>
27 #include <Library/NetLib.h>
28 #include <Library/PrintLib.h>
29 #include <Library/UefiHiiServicesLib.h>
30 #include <Library/FileExplorerLib.h>
31 
32 //
33 // UEFI Driver Model Protocols
34 //
35 #include <Protocol/DriverBinding.h>
36 #include <Protocol/HiiDatabase.h>
37 #include <Protocol/HiiPackageList.h>
38 #include <Protocol/ComponentName2.h>
39 #include <Protocol/ComponentName.h>
40 
41 //
42 // Consumed Protocols
43 //
44 #include <Protocol/WiFi2.h>
45 #include <Protocol/AdapterInformation.h>
46 #include <Protocol/Supplicant.h>
47 #include <Protocol/SimpleNetwork.h>
48 #include <Protocol/SimpleFileSystem.h>
49 #include <Protocol/EapConfiguration.h>
50 
51 //
52 // Produced Protocols
53 //
54 #include <Protocol/HiiConfigAccess.h>
55 
56 //
57 // Guids
58 //
59 #include <Guid/ImageAuthentication.h>
60 #include <Guid/MdeModuleHii.h>
61 #include <Guid/WifiConnectionManagerConfigHii.h>
62 
63 //
64 // NvData struct definition
65 //
66 #include "WifiConnectionMgrConfigNVDataStruct.h"
67 #include "WifiConnectionMgrConfig.h"
68 #include "EapContext.h"
69 #include "WifiConnectionMgrConfigHii.h"
70 
71 //
72 // Driver Version
73 //
74 #define WIFI_MGR_DXE_VERSION  0xb
75 
76 #define OUI_IEEE_80211I 0xAC0F00
77 
78 typedef enum {
79   Ieee80211PairwiseCipherSuiteUseGroupCipherSuite = 0,
80   Ieee80211PairwiseCipherSuiteWEP40  = 1,
81   Ieee80211PairwiseCipherSuiteTKIP   = 2,
82   Ieee80211PairwiseCipherSuiteCCMP   = 4,
83   Ieee80211PairwiseCipherSuiteWEP104 = 5,
84   Ieee80211PairwiseCipherSuiteBIP    = 6,
85   //...
86 } IEEE_80211_PAIRWISE_CIPHER_SUITE;
87 
88 #define IEEE_80211_PAIRWISE_CIPHER_SUITE_USE_GROUP   (OUI_IEEE_80211I | (Ieee80211PairwiseCipherSuiteUseGroupCipherSuite << 24))
89 #define IEEE_80211_PAIRWISE_CIPHER_SUITE_WEP40       (OUI_IEEE_80211I | (Ieee80211PairwiseCipherSuiteWEP40 << 24))
90 #define IEEE_80211_PAIRWISE_CIPHER_SUITE_TKIP        (OUI_IEEE_80211I | (Ieee80211PairwiseCipherSuiteTKIP << 24))
91 #define IEEE_80211_PAIRWISE_CIPHER_SUITE_CCMP        (OUI_IEEE_80211I | (Ieee80211PairwiseCipherSuiteCCMP << 24))
92 #define IEEE_80211_PAIRWISE_CIPHER_SUITE_WEP104      (OUI_IEEE_80211I | (Ieee80211PairwiseCipherSuiteWEP104 << 24))
93 #define IEEE_80211_PAIRWISE_CIPHER_SUITE_BIP         (OUI_IEEE_80211I | (Ieee80211PairwiseCipherSuiteBIP << 24))
94 
95 typedef enum {
96   Ieee80211AkmSuite8021XOrPMKSA       = 1,
97   Ieee80211AkmSuitePSK                = 2,
98   Ieee80211AkmSuite8021XOrPMKSASHA256 = 5,
99   Ieee80211AkmSuitePSKSHA256          = 6
100   //...
101 } IEEE_80211_AKM_SUITE;
102 
103 #define IEEE_80211_AKM_SUITE_8021X_OR_PMKSA         (OUI_IEEE_80211I | (Ieee80211AkmSuite8021XOrPMKSA << 24))
104 #define IEEE_80211_AKM_SUITE_PSK                    (OUI_IEEE_80211I | (Ieee80211AkmSuitePSK << 24))
105 #define IEEE_80211_AKM_SUITE_8021X_OR_PMKSA_SHA256  (OUI_IEEE_80211I | (Ieee80211AkmSuite8021XOrPMKSASHA256 << 24))
106 #define IEEE_80211_AKM_SUITE_PSK_SHA256             (OUI_IEEE_80211I | (Ieee80211AkmSuitePSKSHA256 << 24))
107 
108 //
109 // Protocol instances
110 //
111 extern EFI_DRIVER_BINDING_PROTOCOL       gWifiMgrDxeDriverBinding;
112 extern EFI_COMPONENT_NAME2_PROTOCOL      gWifiMgrDxeComponentName2;
113 extern EFI_COMPONENT_NAME_PROTOCOL       gWifiMgrDxeComponentName;
114 extern EFI_HII_CONFIG_ACCESS_PROTOCOL    gWifiMgrDxeHiiConfigAccess;
115 
116 //
117 // Private Context Data Structure
118 //
119 typedef enum {
120   WifiMgrDisconnected,
121   WifiMgrConnectingToAp,
122   WifiMgrConnectedToAp,
123   WifiMgrDisconnectingToAp,
124   WifiMgrConnectStateMaximum
125 } WIFI_MGR_CONNECT_STATE;
126 
127 typedef enum {
128   WifiMgrScanFinished,
129   WifiMgrScanning,
130   WifiMgrScanStateMaximum
131 } WIFI_MGR_SCAN_STATE;
132 
133 #define  WIFI_SCAN_FREQUENCY    30
134 
135 typedef struct _WIFI_MGR_SUPPORTED_SUITES {
136   EFI_80211_AKM_SUITE_SELECTOR     *SupportedAKMSuites;
137   EFI_80211_CIPHER_SUITE_SELECTOR  *SupportedSwCipherSuites;
138   EFI_80211_CIPHER_SUITE_SELECTOR  *SupportedHwCipherSuites;
139 } WIFI_MGR_SUPPORTED_SUITES;
140 
141 #define EFI_WIFIMGR_PRIVATE_GUID \
142   { \
143     0x99b7c019, 0x4789, 0x4829, { 0xa7, 0xbd, 0x0d, 0x4b, 0xaa, 0x62, 0x28, 0x72 } \
144   }
145 
146 typedef struct _WIFI_MGR_PRIVATE_DATA  WIFI_MGR_PRIVATE_DATA;
147 
148 typedef struct _WIFI_MGR_PRIVATE_PROTOCOL {
149   UINT32  Reserved;
150 } WIFI_MGR_PRIVATE_PROTOCOL;
151 
152 typedef struct _WIFI_MGR_FILE_CONTEXT {
153   EFI_FILE_HANDLE                   FHandle;
154   UINT16                            *FileName;
155 } WIFI_MGR_FILE_CONTEXT;
156 
157 typedef enum {
158   FileTypeCACert,
159   FileTypeClientCert,
160   FileTypeMax
161 } WIFI_MGR_FILE_TYPE;
162 
163 typedef struct {
164   UINT32                                     Signature;
165   EFI_HANDLE                                 DriverHandle;
166   EFI_HANDLE                                 ControllerHandle;
167   EFI_EVENT                                  TickTimer;
168   WIFI_MGR_PRIVATE_DATA                      *Private;
169 
170   //
171   // Pointers to consumed protocols
172   //
173   EFI_WIRELESS_MAC_CONNECTION_II_PROTOCOL    *Wmp;
174   EFI_SUPPLICANT_PROTOCOL                    *Supplicant;
175   EFI_EAP_CONFIGURATION_PROTOCOL             *EapConfig;
176 
177   //
178   // Produced protocols
179   //
180   WIFI_MGR_PRIVATE_PROTOCOL                   WifiMgrIdentifier;
181 
182   //
183   // Private functions and data fields
184   //
185   LIST_ENTRY                                  Link;  // Link to the NicList in global private data structure.
186   UINT32                                      NicIndex;
187   EFI_80211_MAC_ADDRESS                       MacAddress;
188   WIFI_MGR_SUPPORTED_SUITES                   SupportedSuites;
189   EFI_ADAPTER_INFO_MEDIA_STATE                LastLinkState;
190 
191   //
192   // The network is currently connected, connecting or disconnecting.
193   // Only one network can be operated at one time.
194   //
195   WIFI_MGR_NETWORK_PROFILE                    *CurrentOperateNetwork;
196   WIFI_MGR_NETWORK_PROFILE                    *ConnectPendingNetwork;
197   BOOLEAN                                     HasDisconnectPendingNetwork;
198 
199   //
200   //Profile related data fields
201   //
202   LIST_ENTRY                                  ProfileList; // List of WIFI_MGR_NETWORK_PROFILE
203   UINT32                                      AvailableCount;
204   UINT32                                      MaxProfileIndex;
205   WIFI_MGR_NETWORK_PROFILE                    *UserSelectedProfile;
206 
207   //
208   // Data fields for Hii functionlity
209   //
210   BOOLEAN                                     OneTimeScanRequest;
211   BOOLEAN                                     OneTimeConnectRequest;
212   BOOLEAN                                     OneTimeDisconnectRequest;
213   WIFI_MGR_SCAN_STATE                         ScanState;
214   UINTN                                       ScanTickTime;
215   WIFI_MGR_CONNECT_STATE                      ConnectState;
216   BOOLEAN                                     ConnectStateChanged;
217 } WIFI_MGR_DEVICE_DATA;
218 
219 #define WIFI_MGR_DEVICE_DATA_SIGNATURE  SIGNATURE_32 ('W','M','D','D')
220 
221 #define WIFI_MGR_DEVICE_DATA_FROM_IDENTIFIER(Identifier) \
222   CR ( \
223     Identifier, \
224     WIFI_MGR_DEVICE_DATA, \
225     WifiMgrIdentifier, \
226     WIFI_MGR_DEVICE_DATA_SIGNATURE \
227     )
228 
229 typedef struct {
230   UINT32                                     Signature;
231   LIST_ENTRY                                 Link;
232   CHAR16                                     SSId[SSID_STORAGE_SIZE];
233 } WIFI_HIDDEN_NETWORK_DATA;
234 
235 #define WIFI_MGR_HIDDEN_NETWORK_SIGNATURE  SIGNATURE_32 ('W','M','H','N')
236 
237 #define WIFI_MGR_HIDDEN_NETWORK_FROM_IDENTIFIER(Identifier) \
238   CR ( \
239     Identifier, \
240     WIFI_HIDDEN_NETWORK_DATA, \
241     WifiMgrIdentifier, \
242     WIFI_MGR_HIDDEN_NETWORK_SIGNATURE \
243     )
244 
245 //
246 // Global private data struct
247 //
248 struct _WIFI_MGR_PRIVATE_DATA {
249 
250   UINT32                            Signature;
251   EFI_HANDLE                        DriverHandle;
252   EFI_HII_HANDLE                    RegisteredHandle;
253   EFI_HII_CONFIG_ACCESS_PROTOCOL    ConfigAccess;
254 
255   UINT32                            NicCount;
256   LIST_ENTRY                        NicList;
257   WIFI_MGR_DEVICE_DATA              *CurrentNic;
258 
259   //
260   // Data fields for Hii functionlity
261   //
262   EFI_EVENT                         NetworkListRefreshEvent;        // Event to refresh the network list form
263   EFI_EVENT                         ConnectFormRefreshEvent;        // Event to refresh the connect form
264   EFI_EVENT                         MainPageRefreshEvent;           // Event to refresh the main page
265 
266   //
267   //User Input Record
268   //
269   UINT8                             SecurityType;
270   UINT8                             EapAuthMethod;
271   UINT8                             EapSecondAuthMethod;
272   CHAR16                            EapIdentity[EAP_IDENTITY_SIZE];
273 
274   WIFI_MGR_FILE_CONTEXT             *FileContext;
275   WIFI_MGR_FILE_TYPE                FileType;
276 
277   UINT32                            HiddenNetworkCount;
278   LIST_ENTRY                        HiddenNetworkList;
279 };
280 
281 #define WIFI_MGR_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('W','M','P','D')
282 
283 #define WIFI_MGR_PRIVATE_DATA_FROM_CONFIG_ACCESS(This) \
284   CR ( \
285     This, \
286     WIFI_MGR_PRIVATE_DATA, \
287     ConfigAccess, \
288     WIFI_MGR_PRIVATE_DATA_SIGNATURE \
289     )
290 extern    WIFI_MGR_PRIVATE_DATA    *mPrivate;
291 
292 typedef enum {
293   TokenTypeGetNetworksToken,
294   TokenTypeConnectNetworkToken,
295   TokenTypeDisconnectNetworkToken,
296   TokenTypeMax,
297 } WIFI_MGR_MAC_CONFIG_TOKEN_TYPE;
298 
299 typedef union {
300   EFI_80211_GET_NETWORKS_TOKEN         *GetNetworksToken;
301   EFI_80211_CONNECT_NETWORK_TOKEN      *ConnectNetworkToken;
302   EFI_80211_DISCONNECT_NETWORK_TOKEN   *DisconnectNetworkToken;
303 } MAC_CONNECTION2_ADAPTER_TOKEN;
304 
305 typedef struct {
306   WIFI_MGR_DEVICE_DATA            *Nic;
307   WIFI_MGR_MAC_CONFIG_TOKEN_TYPE  Type;
308   MAC_CONNECTION2_ADAPTER_TOKEN   Token;
309 } WIFI_MGR_MAC_CONFIG_TOKEN;
310 
311 //
312 // Include files with function prototypes
313 //
314 #include "WifiConnectionMgrDriverBinding.h"
315 #include "WifiConnectionMgrImpl.h"
316 #include "WifiConnectionMgrComponentName.h"
317 #include "WifiConnectionMgrHiiConfigAccess.h"
318 #include "WifiConnectionMgrMisc.h"
319 #include "WifiConnectionMgrFileUtil.h"
320 
321 #endif
322