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