1 /* 2 * Copyright 2023, Cypress Semiconductor Corporation (an Infineon company) 3 * SPDX-License-Identifier: Apache-2.0 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /** @file whd_events.h 19 * Header for Event detection 20 * 21 * Provides constants and prototypes for functions that allow 22 * user applications to receive event callbacks and set event handlers 23 */ 24 #ifndef INCLUDED_WHD_EVENTS_API_H 25 #define INCLUDED_WHD_EVENTS_API_H 26 27 #include "whd.h" 28 29 #ifdef __cplusplus 30 extern "C" 31 { 32 #endif 33 34 /* List of events */ 35 #define WLC_E_NONE (0x7FFFFFFE) /**< Indicates the end of the event array list */ 36 37 #define WLC_E_SET_SSID 0 /**< Indicates status of set SSID. This event occurs when STA tries to join the AP*/ 38 #define WLC_E_AUTH 3 /**< 802.11 AUTH request event occurs when STA tries to get authenticated with the AP */ 39 #define WLC_E_DEAUTH 5 /**< 802.11 DEAUTH request event occurs when the the SOFTAP is stopped to deuthenticate the connected stations*/ 40 #define WLC_E_DEAUTH_IND 6 /**< 802.11 DEAUTH indication event occurs when the STA gets deauthenticated by the AP */ 41 #define WLC_E_ASSOC 7 /**< 802.11 ASSOC request event occurs when STA joins the AP */ 42 #define WLC_E_ASSOC_IND 8 /**< 802.11 ASSOC indication occurs when a station joins the SOFTAP that is started */ 43 #define WLC_E_REASSOC 9 /**< 802.11 REASSOC request event when the STA again gets associated with the AP */ 44 #define WLC_E_REASSOC_IND 10 /**< 802.11 REASSOC indication occurs when a station again reassociates with the SOFTAP*/ 45 #define WLC_E_DISASSOC 11 /**< 802.11 DISASSOC request occurs when the STA the tries to leave the AP*/ 46 #define WLC_E_DISASSOC_IND 12 /**< 802.11 DISASSOC indication occurs when the connected station gets disassociates from SOFTAP, 47 also when STA gets diassociated by the AP*/ 48 #define WLC_E_LINK 16 /**< generic link indication */ 49 #define WLC_E_PROBREQ_MSG 44 /**< Indicates probe request received for the SOFTAP started*/ 50 #define WLC_E_PSK_SUP 46 /**< WPA Handshake fail during association*/ 51 #define WLC_E_ACTION_FRAME 59 /**< Indicates Action frame Rx */ 52 #define WLC_E_ACTION_FRAME_COMPLETE 60 /**< Indicates Action frame Tx complete */ 53 #define WLC_E_ESCAN_RESULT 69 /**< escan result event occurs when we scan for the networks */ 54 #define WLC_E_EXT_AUTH_REQ 187 /**< authentication request received */ 55 #define WLC_E_EXT_AUTH_FRAME_RX 188 /**< authentication request received */ 56 #define WLC_E_MGMT_FRAME_TXSTATUS 189 /**< mgmt frame Tx complete */ 57 58 /* List of status codes - Applicable for any event type */ 59 #define WLC_E_STATUS_SUCCESS 0 /**< operation was successful */ 60 #define WLC_E_STATUS_FAIL 1 /**< operation failed */ 61 #define WLC_E_STATUS_TIMEOUT 2 /**< operation timed out */ 62 #define WLC_E_STATUS_NO_NETWORKS 3 /**< failed due to no matching network found */ 63 #define WLC_E_STATUS_ABORT 4 /**< operation was aborted */ 64 #define WLC_E_STATUS_NO_ACK 5 /**< protocol failure: packet not ack'd */ 65 #define WLC_E_STATUS_UNSOLICITED 6 /**< AUTH or ASSOC packet was unsolicited */ 66 #define WLC_E_STATUS_ATTEMPT 7 /**< attempt to assoc to an auto auth configuration */ 67 #define WLC_E_STATUS_PARTIAL 8 /**< scan results are incomplete */ 68 #define WLC_E_STATUS_NEWSCAN 9 /**< scan aborted by another scan */ 69 #define WLC_E_STATUS_NEWASSOC 10 /**< scan aborted due to assoc in progress */ 70 #define WLC_E_STATUS_11HQUIET 11 /**< 802.11h quiet period started */ 71 #define WLC_E_STATUS_SUPPRESS 12 /**< user disabled scanning (WLC_SET_SCANSUPPRESS) */ 72 #define WLC_E_STATUS_NOCHANS 13 /**< no allowable channels to scan */ 73 #define WLC_E_STATUS_CCXFASTRM 14 /**< scan aborted due to CCX fast roam */ 74 #define WLC_E_STATUS_CS_ABORT 15 /**< abort channel select */ 75 #define WLC_E_STATUS_ERROR 16 /**< request failed due to error */ 76 #define WLC_E_STATUS_INVALID 0xff /**< Invalid status code to init variables. */ 77 78 #define WLC_SUP_STATUS_OFFSET (256) /**< Status offset added to the status codes to match the values from firmware. */ 79 80 /** 81 * @brief Status code for event WLC_E_PSK_SUP 82 * 83 * -Basic supplicant authentication states 84 * 85 * + WLC_SUP_DISCONNECTED 86 * + WLC_SUP_CONNECTING 87 * + WLC_SUP_IDREQUIRED 88 * + WLC_SUP_AUTHENTICATING 89 * + WLC_SUP_AUTHENTICATED 90 * + WLC_SUP_KEYXCHANGE 91 * + WLC_SUP_KEYED 92 * + WLC_SUP_TIMEOUT 93 * + WLC_SUP_LAST_BASIC_STATE 94 * 95 * -Extended supplicant authentication states 96 * 97 * + WLC_SUP_KEYXCHANGE_WAIT_M1 98 * + WLC_SUP_KEYXCHANGE_PREP_M2 99 * + WLC_SUP_KEYXCHANGE_WAIT_M3 100 * + WLC_SUP_KEYXCHANGE_PREP_M4 101 * + WLC_SUP_KEYXCHANGE_WAIT_G1 102 * + WLC_SUP_KEYXCHANGE_PREP_G2 103 */ 104 typedef enum sup_auth_status 105 { 106 WLC_SUP_DISCONNECTED = 0 + WLC_SUP_STATUS_OFFSET, /**< Disconnected */ 107 WLC_SUP_CONNECTING = 1 + WLC_SUP_STATUS_OFFSET, /**< Connecting */ 108 WLC_SUP_IDREQUIRED = 2 + WLC_SUP_STATUS_OFFSET, /**< ID Required */ 109 WLC_SUP_AUTHENTICATING = 3 + WLC_SUP_STATUS_OFFSET, /**< Authenticating */ 110 WLC_SUP_AUTHENTICATED = 4 + WLC_SUP_STATUS_OFFSET, /**< Authenticated */ 111 WLC_SUP_KEYXCHANGE = 5 + WLC_SUP_STATUS_OFFSET, /**< Key Exchange */ 112 WLC_SUP_KEYED = 6 + WLC_SUP_STATUS_OFFSET, /**< Key Exchanged */ 113 WLC_SUP_TIMEOUT = 7 + WLC_SUP_STATUS_OFFSET, /**< Timeout */ 114 WLC_SUP_LAST_BASIC_STATE = 8 + WLC_SUP_STATUS_OFFSET, /**< Last Basic State */ 115 WLC_SUP_KEYXCHANGE_WAIT_M1 = WLC_SUP_AUTHENTICATED, /**< Waiting to receive handshake msg M1 */ 116 WLC_SUP_KEYXCHANGE_PREP_M2 = WLC_SUP_KEYXCHANGE, /**< Preparing to send handshake msg M2 */ 117 WLC_SUP_KEYXCHANGE_WAIT_M3 = WLC_SUP_LAST_BASIC_STATE, /**< Waiting to receive handshake msg M3 */ 118 WLC_SUP_KEYXCHANGE_PREP_M4 = 9 + WLC_SUP_STATUS_OFFSET, /**< Preparing to send handshake msg M4 */ 119 WLC_SUP_KEYXCHANGE_WAIT_G1 = 10 + WLC_SUP_STATUS_OFFSET, /**< Waiting to receive handshake msg G1 */ 120 WLC_SUP_KEYXCHANGE_PREP_G2 = 11 + WLC_SUP_STATUS_OFFSET /**< Preparing to send handshake msg G2 */ 121 } sup_auth_status_t; 122 123 #define WHD_MSG_IFNAME_MAX 16 /**< Max length of Interface name */ 124 125 /* Reason codes for LINK */ 126 #define WLC_E_LINK_BCN_LOSS 1 /**< Link down because of beacon loss */ 127 #define WLC_E_LINK_DISASSOC 2 /**< Link down because of disassoc */ 128 #define WLC_E_LINK_ASSOC_REC 3 /**< Link down because assoc recreate failed */ 129 #define WLC_E_LINK_BSSCFG_DIS 4 /**< Link down due to bsscfg down */ 130 131 #pragma pack(1) 132 133 /** 134 * Structure to store ethernet header fields in event packets 135 */ 136 typedef struct whd_event_eth_hdr 137 { 138 uint16_t subtype; /**< Vendor specific..32769 */ 139 uint16_t length; /**< Length of ethernet header*/ 140 uint8_t version; /**< Version is 0 */ 141 uint8_t oui[3]; /**< Organizationally Unique Identifier */ 142 uint16_t usr_subtype; /**< User specific data */ 143 } whd_event_eth_hdr_t; 144 145 /** 146 * Structure to store ethernet destination, source and ethertype in event packets 147 */ 148 typedef struct whd_event_ether_header 149 { 150 whd_mac_t destination_address; /**< Ethernet destination address */ 151 whd_mac_t source_address; /**< Ethernet source address */ 152 uint16_t ethertype; /**< Ethertype for identifying event packets */ 153 } whd_event_ether_header_t; 154 155 /** 156 * Structure to store fields after ethernet header in event message 157 */ 158 struct whd_event_msg 159 { 160 uint16_t version; /**< Version */ 161 uint16_t flags; /**< see flags below */ 162 uint32_t event_type; /**< Event type indicating a response from firmware for IOCTLs/IOVARs sent */ 163 uint32_t status; /**< Status code corresponding to any event type */ 164 uint32_t reason; /**< Reason code associated with the event occurred */ 165 uint32_t auth_type; /**< WLC_E_AUTH: 802.11 AUTH request */ 166 uint32_t datalen; /**< Length of data in event message */ 167 whd_mac_t addr; /**< Station address (if applicable) */ 168 char ifname[WHD_MSG_IFNAME_MAX]; /**< name of the incoming packet interface */ 169 uint8_t ifidx; /**< destination OS i/f index */ 170 uint8_t bsscfgidx; /**< source bsscfg index */ 171 }; 172 173 /** 174 * Event structure used by driver msgs 175 */ 176 typedef struct whd_event 177 { 178 whd_event_ether_header_t eth; /**< Variable to store ethernet destination, source and ethertype in event packets */ 179 whd_event_eth_hdr_t eth_evt_hdr; /**< Variable to store ethernet header fields in event message */ 180 whd_event_header_t whd_event; /**< Variable to store rest of the event packet fields after ethernet header */ 181 /* data portion follows */ 182 } whd_event_t; 183 184 #pragma pack() 185 186 /** @addtogroup event WHD Event handling API 187 * Functions that allow user applications to receive event callbacks and set event handlers 188 * @{ 189 */ 190 /** Event handler prototype definition 191 * 192 * @param ifp Pointer to handle instance of whd interface 193 * @param event_header whd event header 194 * @param event_data event data 195 * @param handler_user_data semaphore data 196 */ 197 typedef void *(*whd_event_handler_t)(whd_interface_t ifp, const whd_event_header_t *event_header, 198 const uint8_t *event_data, void *handler_user_data); 199 /** Error handler prototype definition 200 * 201 * @param whd_driver Pointer to handle instance of whd driver 202 * @param error_type whd error type 203 * @param event_data event data 204 * @param handler_user_data semaphore data 205 */ 206 typedef void *(*whd_error_handler_t)(whd_driver_t whd_driver, const uint8_t *error_type, 207 const uint8_t *event_data, void *handler_user_data); 208 /* @} */ 209 /** Registers a handler to receive event callbacks. 210 * 211 * This function registers a callback handler to be notified when 212 * a particular event is received. 213 * 214 * 215 * @note Currently each event may only be registered to one handler and there is a limit to the number of simultaneously 216 * registered events. Maximum of 5 event handlers can registered simultaneously, this also includes the internal 217 * event handler registration which happens during scan, join and starting an AP. 218 * 219 * @param ifp Pointer to handle instance of whd interface 220 * @param event_type Pointer to the event list array 221 * @param handler_func A function pointer to the handler callback 222 * @param handler_user_data A pointer value which will be passed to the event handler function 223 * at the time an event is triggered (NULL is allowed) 224 * @param event_index Entry where the event handler is registered in the list 225 * 226 * @return WHD_SUCCESS or Error code 227 */ 228 uint32_t whd_wifi_set_event_handler(whd_interface_t ifp, const uint32_t *event_type, whd_event_handler_t handler_func, 229 void *handler_user_data, uint16_t *event_index); 230 /** Registers a handler to receive error callbacks. 231 * 232 * This function registers a callback handler to be notified when 233 * a particular event is received. 234 * 235 * 236 * @note Currently each event may only be registered to one handler and there is a limit to the number of simultaneously 237 * registered events. Maximum of 5 event handlers can registered simultaneously, this also includes the internal 238 * event handler registration which happens during scan, join and starting an AP. 239 * 240 * @param ifp Pointer to handle instance of whd interface 241 * @param error_nums Pointer to the event list as WLC_ERR_BUS and WLC_ERR_FW 242 * @param handler_func A function pointer to the handler callback 243 * @param handler_user_data A pointer value which will be passed to the event handler function 244 * at the time an event is triggered (NULL is allowed) 245 * @param error_index Entry where the error handler is registered in the list 246 * 247 * @return WHD_SUCCESS or Error code 248 */ 249 uint32_t whd_wifi_set_error_handler(whd_interface_t ifp, const uint8_t *error_nums, whd_error_handler_t handler_func, 250 void *handler_user_data, uint16_t *error_index); 251 252 /** Delete/Deregister the event entry where callback is registered 253 * 254 * @param ifp Pointer to handle instance of whd interface 255 * @param event_index Event index obtained during registration by whd_wifi_set_event_handler 256 * 257 * @return WHD_SUCCESS or Error code 258 */ 259 260 uint32_t whd_wifi_deregister_event_handler(whd_interface_t ifp, uint16_t event_index); 261 /** Delete/Deregister the error entry where callback is registered 262 * 263 * @param ifp Pointer to handle instance of whd interface 264 * @param error_index Error index obtained during registration by whd_wifi_set_error_handler 265 * 266 * @return WHD_SUCCESS or Error code 267 */ 268 269 uint32_t whd_wifi_deregister_error_handler(whd_interface_t ifp, uint16_t error_index); 270 271 #ifdef __cplusplus 272 } /* extern "C" */ 273 #endif 274 #endif /* ifndef */ 275 276