xref: /freebsd/contrib/wpa/src/fst/fst.h (revision 93e779a26c651610ac6e7986d67ecc9ed2cadcbf)
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