1 /* 2 * FST module - interface definitions 3 * Copyright (c) 2014, Qualcomm Atheros, Inc. 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #ifndef FST_H 10 #define FST_H 11 12 #ifdef CONFIG_FST 13 14 #include "common/defs.h" 15 #include "fst/fst_ctrl_iface.h" 16 17 /* FST module hostap integration API */ 18 19 #define US_IN_MS 1000 20 #define LLT_UNIT_US 32 /* See 10.32.2.2 Transitioning between states */ 21 22 #define FST_LLT_MS_TO_VAL(m) (((u32) (m)) * US_IN_MS / LLT_UNIT_US) 23 #define FST_LLT_VAL_TO_MS(v) (((u32) (v)) * LLT_UNIT_US / US_IN_MS) 24 25 #define FST_MAX_LLT_MS FST_LLT_VAL_TO_MS(-1) 26 #define FST_MAX_PRIO_VALUE ((u8) -1) 27 #define FST_MAX_GROUP_ID_LEN IFNAMSIZ 28 29 #define FST_DEFAULT_LLT_CFG_VALUE 50 30 31 struct hostapd_hw_modes; 32 struct ieee80211_mgmt; 33 struct fst_iface; 34 struct fst_group; 35 struct fst_session; 36 struct fst_get_peer_ctx; 37 struct fst_ctrl_handle; 38 39 struct fst_wpa_obj { 40 void *ctx; 41 42 /** 43 * get_bssid - Get BSSID of the interface 44 * @ctx: User context %ctx 45 * Returns: BSSID for success, %NULL for failure. 46 * 47 * NOTE: For AP it returns the own BSSID, while for STA - the BSSID of 48 * the associated AP. 49 */ 50 const u8 * (*get_bssid)(void *ctx); 51 52 /** 53 * get_channel_info - Get current channel info 54 * @ctx: User context %ctx 55 * @hw_mode: OUT, current HW mode 56 * @channel: OUT, current channel 57 */ 58 void (*get_channel_info)(void *ctx, enum hostapd_hw_mode *hw_mode, 59 u8 *channel); 60 61 /** 62 * get_hw_modes - Get hardware modes 63 * @ctx: User context %ctx 64 * @modes: OUT, pointer on array of hw modes 65 * 66 * Returns: Number of hw modes available. 67 */ 68 int (*get_hw_modes)(void *ctx, struct hostapd_hw_modes **modes); 69 70 /** 71 * set_ies - Set interface's MB IE 72 * @ctx: User context %ctx 73 * @fst_ies: MB IE buffer (owned by FST module) 74 */ 75 void (*set_ies)(void *ctx, const struct wpabuf *fst_ies); 76 77 /** 78 * send_action - Send FST Action frame via the interface 79 * @ctx: User context %ctx 80 * @addr: Address of the destination STA 81 * @data: Action frame buffer 82 * Returns: 0 for success, negative error code for failure. 83 */ 84 int (*send_action)(void *ctx, const u8 *addr, struct wpabuf *data); 85 86 /** 87 * get_mb_ie - Get last MB IE received from STA 88 * @ctx: User context %ctx 89 * @addr: Address of the STA 90 * Returns: MB IE buffer, %NULL if no MB IE received from the STA 91 */ 92 const struct wpabuf * (*get_mb_ie)(void *ctx, const u8 *addr); 93 94 /** 95 * update_mb_ie - Update last MB IE received from STA 96 * @ctx: User context %ctx 97 * @addr: Address of the STA 98 * @buf: Buffer that contains the MB IEs data 99 * @size: Size of data in %buf 100 */ 101 void (*update_mb_ie)(void *ctx, const u8 *addr, 102 const u8 *buf, size_t size); 103 104 /** 105 * get_peer_first - Get MAC address of the 1st connected STA 106 * @ctx: User context %ctx 107 * @get_ctx: Context to be used for %get_peer_next call 108 * @mb_only: %TRUE if only multi-band capable peer should be reported 109 * Returns: Address of the 1st connected STA, %NULL if no STAs connected 110 */ 111 const u8 * (*get_peer_first)(void *ctx, 112 struct fst_get_peer_ctx **get_ctx, 113 Boolean mb_only); 114 /** 115 * get_peer_next - Get MAC address of the next connected STA 116 * @ctx: User context %ctx 117 * @get_ctx: Context received from %get_peer_first or previous 118 * %get_peer_next call 119 * @mb_only: %TRUE if only multi-band capable peer should be reported 120 * Returns: Address of the next connected STA, %NULL if no more STAs 121 * connected 122 */ 123 const u8 * (*get_peer_next)(void *ctx, 124 struct fst_get_peer_ctx **get_ctx, 125 Boolean mb_only); 126 }; 127 128 /** 129 * fst_global_init - Global FST module initiator 130 * Returns: 0 for success, negative error code for failure. 131 * Note: The purpose of this function is to allocate and initiate global 132 * FST module data structures (linked lists, static data etc.) 133 * This function should be called prior to the 1st %fst_attach call. 134 */ 135 int fst_global_init(void); 136 137 /** 138 * fst_global_deinit - Global FST module de-initiator 139 * Note: The purpose of this function is to deallocate and de-initiate global 140 * FST module data structures (linked lists, static data etc.) 141 */ 142 void fst_global_deinit(void); 143 144 /** 145 * struct fst_ctrl - Notification interface for FST module 146 */ 147 struct fst_ctrl { 148 /** 149 * init - Initialize the notification interface 150 * Returns: 0 for success, negative error code for failure. 151 */ 152 int (*init)(void); 153 154 /** 155 * deinit - Deinitialize the notification interface 156 */ 157 void (*deinit)(void); 158 159 /** 160 * on_group_created - Notify about FST group creation 161 * Returns: 0 for success, negative error code for failure. 162 */ 163 int (*on_group_created)(struct fst_group *g); 164 165 /** 166 * on_group_deleted - Notify about FST group deletion 167 */ 168 void (*on_group_deleted)(struct fst_group *g); 169 170 /** 171 * on_iface_added - Notify about interface addition 172 * Returns: 0 for success, negative error code for failure. 173 */ 174 int (*on_iface_added)(struct fst_iface *i); 175 176 /** 177 * on_iface_removed - Notify about interface removal 178 */ 179 void (*on_iface_removed)(struct fst_iface *i); 180 181 /** 182 * on_session_added - Notify about FST session addition 183 * Returns: 0 for success, negative error code for failure. 184 */ 185 int (*on_session_added)(struct fst_session *s); 186 187 /** 188 * on_session_removed - Notify about FST session removal 189 */ 190 void (*on_session_removed)(struct fst_session *s); 191 192 /** 193 * on_event - Notify about FST event 194 * @event_type: Event type 195 * @i: Interface object that relates to the event or NULL 196 * @g: Group object that relates to the event or NULL 197 * @extra - Event specific data (see fst_ctrl_iface.h for more info) 198 */ 199 void (*on_event)(enum fst_event_type event_type, struct fst_iface *i, 200 struct fst_session *s, 201 const union fst_event_extra *extra); 202 }; 203 204 struct fst_ctrl_handle * fst_global_add_ctrl(const struct fst_ctrl *ctrl); 205 void fst_global_del_ctrl(struct fst_ctrl_handle *h); 206 207 /** 208 * NOTE: These values have to be read from configuration file 209 */ 210 struct fst_iface_cfg { 211 char group_id[FST_MAX_GROUP_ID_LEN + 1]; 212 u8 priority; 213 u32 llt; 214 }; 215 216 /** 217 * fst_attach - Attach interface to an FST group according to configuration read 218 * @ifname: Interface name 219 * @own_addr: Own interface MAC address 220 * @iface_obj: Callbacks to be used by FST module to communicate with 221 * hostapd/wpa_supplicant 222 * @cfg: FST-related interface configuration read from the configuration file 223 * Returns: FST interface object for success, %NULL for failure. 224 */ 225 struct fst_iface * fst_attach(const char *ifname, 226 const u8 *own_addr, 227 const struct fst_wpa_obj *iface_obj, 228 const struct fst_iface_cfg *cfg); 229 230 /** 231 * fst_detach - Detach an interface 232 * @iface: FST interface object 233 */ 234 void fst_detach(struct fst_iface *iface); 235 236 /* FST module inputs */ 237 /** 238 * fst_rx_action - FST Action frames handler 239 * @iface: FST interface object 240 * @mgmt: Action frame arrived 241 * @len: Action frame length 242 */ 243 void fst_rx_action(struct fst_iface *iface, const struct ieee80211_mgmt *mgmt, 244 size_t len); 245 246 /** 247 * fst_notify_peer_connected - FST STA connect handler 248 * @iface: FST interface object 249 * @addr: Address of the connected STA 250 */ 251 void fst_notify_peer_connected(struct fst_iface *iface, const u8 *addr); 252 253 /** 254 * fst_notify_peer_disconnected - FST STA disconnect handler 255 * @iface: FST interface object 256 * @addr: Address of the disconnected STA 257 */ 258 void fst_notify_peer_disconnected(struct fst_iface *iface, const u8 *addr); 259 260 /* FST module auxiliary routines */ 261 262 /** 263 * fst_are_ifaces_aggregated - Determines whether 2 interfaces belong to the 264 * same FST group 265 * @iface1: 1st FST interface object 266 * @iface1: 2nd FST interface object 267 * 268 * Returns: %TRUE if the interfaces belong to the same FST group, 269 * %FALSE otherwise 270 */ 271 Boolean fst_are_ifaces_aggregated(struct fst_iface *iface1, 272 struct fst_iface *iface2); 273 274 #else /* CONFIG_FST */ 275 276 static inline int fst_global_init(void) 277 { 278 return 0; 279 } 280 281 static inline int fst_global_start(void) 282 { 283 return 0; 284 } 285 286 static inline void fst_global_stop(void) 287 { 288 } 289 290 static inline void fst_global_deinit(void) 291 { 292 } 293 294 #endif /* CONFIG_FST */ 295 296 #endif /* FST_H */ 297