diff options
Diffstat (limited to 'net/mac80211/mesh.h')
-rw-r--r-- | net/mac80211/mesh.h | 145 |
1 files changed, 87 insertions, 58 deletions
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h index 7c9215fb2ac8..336c88a16687 100644 --- a/net/mac80211/mesh.h +++ b/net/mac80211/mesh.h | |||
@@ -26,12 +26,12 @@ | |||
26 | * @MESH_PATH_ACTIVE: the mesh path can be used for forwarding | 26 | * @MESH_PATH_ACTIVE: the mesh path can be used for forwarding |
27 | * @MESH_PATH_RESOLVING: the discovery process is running for this mesh path | 27 | * @MESH_PATH_RESOLVING: the discovery process is running for this mesh path |
28 | * @MESH_PATH_SN_VALID: the mesh path contains a valid destination sequence | 28 | * @MESH_PATH_SN_VALID: the mesh path contains a valid destination sequence |
29 | * number | 29 | * number |
30 | * @MESH_PATH_FIXED: the mesh path has been manually set and should not be | 30 | * @MESH_PATH_FIXED: the mesh path has been manually set and should not be |
31 | * modified | 31 | * modified |
32 | * @MESH_PATH_RESOLVED: the mesh path can has been resolved | 32 | * @MESH_PATH_RESOLVED: the mesh path can has been resolved |
33 | * @MESH_PATH_REQ_QUEUED: there is an unsent path request for this destination | 33 | * @MESH_PATH_REQ_QUEUED: there is an unsent path request for this destination |
34 | * already queued up, waiting for the discovery process to start. | 34 | * already queued up, waiting for the discovery process to start. |
35 | * | 35 | * |
36 | * MESH_PATH_RESOLVED is used by the mesh path timer to | 36 | * MESH_PATH_RESOLVED is used by the mesh path timer to |
37 | * decide when to stop or cancel the mesh path discovery. | 37 | * decide when to stop or cancel the mesh path discovery. |
@@ -73,16 +73,16 @@ enum mesh_deferred_task_flags { | |||
73 | * @dst: mesh path destination mac address | 73 | * @dst: mesh path destination mac address |
74 | * @sdata: mesh subif | 74 | * @sdata: mesh subif |
75 | * @next_hop: mesh neighbor to which frames for this destination will be | 75 | * @next_hop: mesh neighbor to which frames for this destination will be |
76 | * forwarded | 76 | * forwarded |
77 | * @timer: mesh path discovery timer | 77 | * @timer: mesh path discovery timer |
78 | * @frame_queue: pending queue for frames sent to this destination while the | 78 | * @frame_queue: pending queue for frames sent to this destination while the |
79 | * path is unresolved | 79 | * path is unresolved |
80 | * @sn: target sequence number | 80 | * @sn: target sequence number |
81 | * @metric: current metric to this destination | 81 | * @metric: current metric to this destination |
82 | * @hop_count: hops to destination | 82 | * @hop_count: hops to destination |
83 | * @exp_time: in jiffies, when the path will expire or when it expired | 83 | * @exp_time: in jiffies, when the path will expire or when it expired |
84 | * @discovery_timeout: timeout (lapse in jiffies) used for the last discovery | 84 | * @discovery_timeout: timeout (lapse in jiffies) used for the last discovery |
85 | * retry | 85 | * retry |
86 | * @discovery_retries: number of discovery retries | 86 | * @discovery_retries: number of discovery retries |
87 | * @flags: mesh path flags, as specified on &enum mesh_path_flags | 87 | * @flags: mesh path flags, as specified on &enum mesh_path_flags |
88 | * @state_lock: mesh path state lock used to protect changes to the | 88 | * @state_lock: mesh path state lock used to protect changes to the |
@@ -184,15 +184,13 @@ struct rmc_entry { | |||
184 | }; | 184 | }; |
185 | 185 | ||
186 | struct mesh_rmc { | 186 | struct mesh_rmc { |
187 | struct rmc_entry bucket[RMC_BUCKETS]; | 187 | struct list_head bucket[RMC_BUCKETS]; |
188 | u32 idx_mask; | 188 | u32 idx_mask; |
189 | }; | 189 | }; |
190 | 190 | ||
191 | #define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ) | 191 | #define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ) |
192 | #define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ) | 192 | #define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ) |
193 | 193 | ||
194 | #define MESH_DEFAULT_BEACON_INTERVAL 1000 /* in 1024 us units */ | ||
195 | |||
196 | #define MESH_PATH_EXPIRE (600 * HZ) | 194 | #define MESH_PATH_EXPIRE (600 * HZ) |
197 | 195 | ||
198 | /* Default maximum number of plinks per interface */ | 196 | /* Default maximum number of plinks per interface */ |
@@ -208,95 +206,113 @@ struct mesh_rmc { | |||
208 | /* Various */ | 206 | /* Various */ |
209 | int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc, | 207 | int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc, |
210 | const u8 *da, const u8 *sa); | 208 | const u8 *da, const u8 *sa); |
211 | int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr, | 209 | int ieee80211_new_mesh_header(struct ieee80211_sub_if_data *sdata, |
212 | struct ieee80211_sub_if_data *sdata, char *addr4or5, | 210 | struct ieee80211s_hdr *meshhdr, |
213 | char *addr6); | 211 | const char *addr4or5, const char *addr6); |
214 | int mesh_rmc_check(u8 *addr, struct ieee80211s_hdr *mesh_hdr, | 212 | int mesh_rmc_check(struct ieee80211_sub_if_data *sdata, |
215 | struct ieee80211_sub_if_data *sdata); | 213 | const u8 *addr, struct ieee80211s_hdr *mesh_hdr); |
216 | bool mesh_matches_local(struct ieee80211_sub_if_data *sdata, | 214 | bool mesh_matches_local(struct ieee80211_sub_if_data *sdata, |
217 | struct ieee802_11_elems *ie); | 215 | struct ieee802_11_elems *ie); |
218 | void mesh_ids_set_default(struct ieee80211_if_mesh *mesh); | 216 | void mesh_ids_set_default(struct ieee80211_if_mesh *mesh); |
219 | void mesh_mgmt_ies_add(struct sk_buff *skb, | 217 | void mesh_mgmt_ies_add(struct ieee80211_sub_if_data *sdata, |
220 | struct ieee80211_sub_if_data *sdata); | 218 | struct sk_buff *skb); |
221 | int mesh_add_meshconf_ie(struct sk_buff *skb, | 219 | int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, |
222 | struct ieee80211_sub_if_data *sdata); | 220 | struct sk_buff *skb); |
223 | int mesh_add_meshid_ie(struct sk_buff *skb, | 221 | int mesh_add_meshid_ie(struct ieee80211_sub_if_data *sdata, |
224 | struct ieee80211_sub_if_data *sdata); | 222 | struct sk_buff *skb); |
225 | int mesh_add_rsn_ie(struct sk_buff *skb, | 223 | int mesh_add_rsn_ie(struct ieee80211_sub_if_data *sdata, |
226 | struct ieee80211_sub_if_data *sdata); | 224 | struct sk_buff *skb); |
227 | int mesh_add_vendor_ies(struct sk_buff *skb, | 225 | int mesh_add_vendor_ies(struct ieee80211_sub_if_data *sdata, |
228 | struct ieee80211_sub_if_data *sdata); | 226 | struct sk_buff *skb); |
229 | int mesh_add_ds_params_ie(struct sk_buff *skb, | 227 | int mesh_add_ht_cap_ie(struct ieee80211_sub_if_data *sdata, |
230 | struct ieee80211_sub_if_data *sdata); | 228 | struct sk_buff *skb); |
231 | int mesh_add_ht_cap_ie(struct sk_buff *skb, | 229 | int mesh_add_ht_oper_ie(struct ieee80211_sub_if_data *sdata, |
232 | struct ieee80211_sub_if_data *sdata); | 230 | struct sk_buff *skb); |
233 | int mesh_add_ht_oper_ie(struct sk_buff *skb, | ||
234 | struct ieee80211_sub_if_data *sdata); | ||
235 | void mesh_rmc_free(struct ieee80211_sub_if_data *sdata); | 231 | void mesh_rmc_free(struct ieee80211_sub_if_data *sdata); |
236 | int mesh_rmc_init(struct ieee80211_sub_if_data *sdata); | 232 | int mesh_rmc_init(struct ieee80211_sub_if_data *sdata); |
237 | void ieee80211s_init(void); | 233 | void ieee80211s_init(void); |
238 | void ieee80211s_update_metric(struct ieee80211_local *local, | 234 | void ieee80211s_update_metric(struct ieee80211_local *local, |
239 | struct sta_info *sta, struct sk_buff *skb); | 235 | struct sta_info *sta, struct sk_buff *skb); |
240 | void ieee80211s_stop(void); | ||
241 | void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata); | 236 | void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata); |
242 | void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata); | 237 | int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata); |
243 | void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata); | 238 | void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata); |
244 | void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh); | 239 | void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh); |
245 | const struct ieee80211_mesh_sync_ops *ieee80211_mesh_sync_ops_get(u8 method); | 240 | const struct ieee80211_mesh_sync_ops *ieee80211_mesh_sync_ops_get(u8 method); |
241 | /* wrapper for ieee80211_bss_info_change_notify() */ | ||
242 | void ieee80211_mbss_info_change_notify(struct ieee80211_sub_if_data *sdata, | ||
243 | u32 changed); | ||
244 | |||
245 | /* mesh power save */ | ||
246 | u32 ieee80211_mps_local_status_update(struct ieee80211_sub_if_data *sdata); | ||
247 | u32 ieee80211_mps_set_sta_local_pm(struct sta_info *sta, | ||
248 | enum nl80211_mesh_power_mode pm); | ||
249 | void ieee80211_mps_set_frame_flags(struct ieee80211_sub_if_data *sdata, | ||
250 | struct sta_info *sta, | ||
251 | struct ieee80211_hdr *hdr); | ||
252 | void ieee80211_mps_sta_status_update(struct sta_info *sta); | ||
253 | void ieee80211_mps_rx_h_sta_process(struct sta_info *sta, | ||
254 | struct ieee80211_hdr *hdr); | ||
255 | void ieee80211_mpsp_trigger_process(u8 *qc, struct sta_info *sta, | ||
256 | bool tx, bool acked); | ||
257 | void ieee80211_mps_frame_release(struct sta_info *sta, | ||
258 | struct ieee802_11_elems *elems); | ||
246 | 259 | ||
247 | /* Mesh paths */ | 260 | /* Mesh paths */ |
248 | int mesh_nexthop_lookup(struct sk_buff *skb, | 261 | int mesh_nexthop_lookup(struct ieee80211_sub_if_data *sdata, |
249 | struct ieee80211_sub_if_data *sdata); | 262 | struct sk_buff *skb); |
250 | int mesh_nexthop_resolve(struct sk_buff *skb, | 263 | int mesh_nexthop_resolve(struct ieee80211_sub_if_data *sdata, |
251 | struct ieee80211_sub_if_data *sdata); | 264 | struct sk_buff *skb); |
252 | void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata); | 265 | void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata); |
253 | struct mesh_path *mesh_path_lookup(u8 *dst, | 266 | struct mesh_path *mesh_path_lookup(struct ieee80211_sub_if_data *sdata, |
254 | struct ieee80211_sub_if_data *sdata); | 267 | const u8 *dst); |
255 | struct mesh_path *mpp_path_lookup(u8 *dst, | 268 | struct mesh_path *mpp_path_lookup(struct ieee80211_sub_if_data *sdata, |
256 | struct ieee80211_sub_if_data *sdata); | 269 | const u8 *dst); |
257 | int mpp_path_add(u8 *dst, u8 *mpp, struct ieee80211_sub_if_data *sdata); | 270 | int mpp_path_add(struct ieee80211_sub_if_data *sdata, |
258 | struct mesh_path *mesh_path_lookup_by_idx(int idx, | 271 | const u8 *dst, const u8 *mpp); |
259 | struct ieee80211_sub_if_data *sdata); | 272 | struct mesh_path * |
273 | mesh_path_lookup_by_idx(struct ieee80211_sub_if_data *sdata, int idx); | ||
260 | void mesh_path_fix_nexthop(struct mesh_path *mpath, struct sta_info *next_hop); | 274 | void mesh_path_fix_nexthop(struct mesh_path *mpath, struct sta_info *next_hop); |
261 | void mesh_path_expire(struct ieee80211_sub_if_data *sdata); | 275 | void mesh_path_expire(struct ieee80211_sub_if_data *sdata); |
262 | void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata, | 276 | void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata, |
263 | struct ieee80211_mgmt *mgmt, size_t len); | 277 | struct ieee80211_mgmt *mgmt, size_t len); |
264 | int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata); | 278 | int mesh_path_add(struct ieee80211_sub_if_data *sdata, const u8 *dst); |
265 | 279 | ||
266 | int mesh_path_add_gate(struct mesh_path *mpath); | 280 | int mesh_path_add_gate(struct mesh_path *mpath); |
267 | int mesh_path_send_to_gates(struct mesh_path *mpath); | 281 | int mesh_path_send_to_gates(struct mesh_path *mpath); |
268 | int mesh_gate_num(struct ieee80211_sub_if_data *sdata); | 282 | int mesh_gate_num(struct ieee80211_sub_if_data *sdata); |
283 | |||
269 | /* Mesh plinks */ | 284 | /* Mesh plinks */ |
270 | void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata, | 285 | void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata, |
271 | u8 *hw_addr, | 286 | u8 *hw_addr, struct ieee802_11_elems *ie); |
272 | struct ieee802_11_elems *ie); | ||
273 | bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie); | 287 | bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie); |
274 | u32 mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata); | 288 | u32 mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata); |
275 | void mesh_plink_broken(struct sta_info *sta); | 289 | void mesh_plink_broken(struct sta_info *sta); |
276 | void mesh_plink_deactivate(struct sta_info *sta); | 290 | u32 mesh_plink_deactivate(struct sta_info *sta); |
277 | int mesh_plink_open(struct sta_info *sta); | 291 | u32 mesh_plink_open(struct sta_info *sta); |
278 | void mesh_plink_block(struct sta_info *sta); | 292 | u32 mesh_plink_block(struct sta_info *sta); |
279 | void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, | 293 | void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, |
280 | struct ieee80211_mgmt *mgmt, size_t len, | 294 | struct ieee80211_mgmt *mgmt, size_t len, |
281 | struct ieee80211_rx_status *rx_status); | 295 | struct ieee80211_rx_status *rx_status); |
296 | void mesh_sta_cleanup(struct sta_info *sta); | ||
282 | 297 | ||
283 | /* Private interfaces */ | 298 | /* Private interfaces */ |
284 | /* Mesh tables */ | 299 | /* Mesh tables */ |
285 | void mesh_mpath_table_grow(void); | 300 | void mesh_mpath_table_grow(void); |
286 | void mesh_mpp_table_grow(void); | 301 | void mesh_mpp_table_grow(void); |
287 | /* Mesh paths */ | 302 | /* Mesh paths */ |
288 | int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn, __le16 target_rcode, | 303 | int mesh_path_error_tx(struct ieee80211_sub_if_data *sdata, |
289 | const u8 *ra, struct ieee80211_sub_if_data *sdata); | 304 | u8 ttl, const u8 *target, __le32 target_sn, |
305 | __le16 target_rcode, const u8 *ra); | ||
290 | void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta); | 306 | void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta); |
291 | void mesh_path_flush_pending(struct mesh_path *mpath); | 307 | void mesh_path_flush_pending(struct mesh_path *mpath); |
292 | void mesh_path_tx_pending(struct mesh_path *mpath); | 308 | void mesh_path_tx_pending(struct mesh_path *mpath); |
293 | int mesh_pathtbl_init(void); | 309 | int mesh_pathtbl_init(void); |
294 | void mesh_pathtbl_unregister(void); | 310 | void mesh_pathtbl_unregister(void); |
295 | int mesh_path_del(u8 *addr, struct ieee80211_sub_if_data *sdata); | 311 | int mesh_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr); |
296 | void mesh_path_timer(unsigned long data); | 312 | void mesh_path_timer(unsigned long data); |
297 | void mesh_path_flush_by_nexthop(struct sta_info *sta); | 313 | void mesh_path_flush_by_nexthop(struct sta_info *sta); |
298 | void mesh_path_discard_frame(struct sk_buff *skb, | 314 | void mesh_path_discard_frame(struct ieee80211_sub_if_data *sdata, |
299 | struct ieee80211_sub_if_data *sdata); | 315 | struct sk_buff *skb); |
300 | void mesh_path_quiesce(struct ieee80211_sub_if_data *sdata); | 316 | void mesh_path_quiesce(struct ieee80211_sub_if_data *sdata); |
301 | void mesh_path_restart(struct ieee80211_sub_if_data *sdata); | 317 | void mesh_path_restart(struct ieee80211_sub_if_data *sdata); |
302 | void mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata); | 318 | void mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata); |
@@ -305,7 +321,19 @@ bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt); | |||
305 | extern int mesh_paths_generation; | 321 | extern int mesh_paths_generation; |
306 | 322 | ||
307 | #ifdef CONFIG_MAC80211_MESH | 323 | #ifdef CONFIG_MAC80211_MESH |
308 | extern int mesh_allocated; | 324 | static inline |
325 | u32 mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata) | ||
326 | { | ||
327 | atomic_inc(&sdata->u.mesh.estab_plinks); | ||
328 | return mesh_accept_plinks_update(sdata); | ||
329 | } | ||
330 | |||
331 | static inline | ||
332 | u32 mesh_plink_dec_estab_count(struct ieee80211_sub_if_data *sdata) | ||
333 | { | ||
334 | atomic_dec(&sdata->u.mesh.estab_plinks); | ||
335 | return mesh_accept_plinks_update(sdata); | ||
336 | } | ||
309 | 337 | ||
310 | static inline int mesh_plink_free_count(struct ieee80211_sub_if_data *sdata) | 338 | static inline int mesh_plink_free_count(struct ieee80211_sub_if_data *sdata) |
311 | { | 339 | { |
@@ -337,8 +365,8 @@ void mesh_plink_quiesce(struct sta_info *sta); | |||
337 | void mesh_plink_restart(struct sta_info *sta); | 365 | void mesh_plink_restart(struct sta_info *sta); |
338 | void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata); | 366 | void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata); |
339 | void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata); | 367 | void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata); |
368 | void ieee80211s_stop(void); | ||
340 | #else | 369 | #else |
341 | #define mesh_allocated 0 | ||
342 | static inline void | 370 | static inline void |
343 | ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) {} | 371 | ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) {} |
344 | static inline void ieee80211_mesh_quiesce(struct ieee80211_sub_if_data *sdata) | 372 | static inline void ieee80211_mesh_quiesce(struct ieee80211_sub_if_data *sdata) |
@@ -351,6 +379,7 @@ static inline bool mesh_path_sel_is_hwmp(struct ieee80211_sub_if_data *sdata) | |||
351 | { return false; } | 379 | { return false; } |
352 | static inline void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata) | 380 | static inline void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata) |
353 | {} | 381 | {} |
382 | static inline void ieee80211s_stop(void) {} | ||
354 | #endif | 383 | #endif |
355 | 384 | ||
356 | #endif /* IEEE80211S_H */ | 385 | #endif /* IEEE80211S_H */ |