Home | History | Annotate | Download | only in fst
      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