Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
mac80211
mesh.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2008, 2009 open80211s Ltd.
3
* Authors: Luis Carlos Cobo <
[email protected]
>
4
* Javier Cardona <
[email protected]
>
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 as
8
* published by the Free Software Foundation.
9
*/
10
11
#ifndef IEEE80211S_H
12
#define IEEE80211S_H
13
14
#include <linux/types.h>
15
#include <
linux/jhash.h
>
16
#include "
ieee80211_i.h
"
17
18
19
/* Data structures */
20
29
enum
mesh_config_capab_flags
{
30
MESHCONF_CAPAB_ACCEPT_PLINKS
=
BIT
(0),
31
MESHCONF_CAPAB_FORWARDING
=
BIT
(3),
32
MESHCONF_CAPAB_TBTT_ADJUSTING
=
BIT
(5),
33
};
34
53
enum
mesh_path_flags
{
54
MESH_PATH_ACTIVE
=
BIT
(0),
55
MESH_PATH_RESOLVING
=
BIT
(1),
56
MESH_PATH_SN_VALID
=
BIT
(2),
57
MESH_PATH_FIXED
=
BIT
(3),
58
MESH_PATH_RESOLVED
=
BIT
(4),
59
MESH_PATH_REQ_QUEUED
=
BIT
(5),
60
};
61
76
enum
mesh_deferred_task_flags
{
77
MESH_WORK_HOUSEKEEPING
,
78
MESH_WORK_GROW_MPATH_TABLE
,
79
MESH_WORK_GROW_MPP_TABLE
,
80
MESH_WORK_ROOT
,
81
MESH_WORK_DRIFT_ADJUST
,
82
};
83
117
struct
mesh_path
{
118
u8
dst
[
ETH_ALEN
];
119
u8
mpp
[
ETH_ALEN
];
/* used for MPP or MAP */
120
struct
ieee80211_sub_if_data
*
sdata
;
121
struct
sta_info
__rcu
*
next_hop
;
122
struct
timer_list
timer
;
123
struct
sk_buff_head
frame_queue
;
124
struct
rcu_head
rcu
;
125
u32
sn
;
126
u32
metric
;
127
u8
hop_count
;
128
unsigned
long
exp_time
;
129
u32
discovery_timeout
;
130
u8
discovery_retries
;
131
enum
mesh_path_flags
flags
;
132
spinlock_t
state_lock
;
133
u8
rann_snd_addr
[
ETH_ALEN
];
134
u32
rann_metric
;
135
unsigned
long
last_preq_to_root
;
136
bool
is_root
;
137
bool
is_gate
;
138
};
139
159
struct
mesh_table
{
160
/* Number of buckets will be 2^N */
161
struct
hlist_head
*
hash_buckets
;
162
spinlock_t
*
hashwlock
;
/* One per bucket, for add/del */
163
unsigned
int
hash_mask
;
/* (2^size_order) - 1 */
164
__u32
hash_rnd
;
/* Used for hash generation */
165
atomic_t
entries
;
/* Up to MAX_MESH_NEIGHBOURS */
166
void
(*
free_node
) (
struct
hlist_node
*
p
,
bool
free_leafs);
167
int
(*
copy_node
) (
struct
hlist_node
*
p
,
struct
mesh_table
*newtbl);
168
int
size_order
;
169
int
mean_chain_len
;
170
struct
hlist_head
*
known_gates
;
171
spinlock_t
gates_lock
;
172
173
struct
rcu_head
rcu_head
;
174
};
175
176
/* Recent multicast cache */
177
/* RMC_BUCKETS must be a power of 2, maximum 256 */
178
#define RMC_BUCKETS 256
179
#define RMC_QUEUE_MAX_LEN 4
180
#define RMC_TIMEOUT (3 * HZ)
181
193
struct
rmc_entry
{
194
struct
list_head
list
;
195
u32
seqnum
;
196
unsigned
long
exp_time
;
197
u8
sa
[
ETH_ALEN
];
198
};
199
200
struct
mesh_rmc
{
201
struct
rmc_entry
bucket
[
RMC_BUCKETS
];
202
u32
idx_mask
;
203
};
204
205
#define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ)
206
#define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ)
207
208
#define MESH_DEFAULT_BEACON_INTERVAL 1000
/* in 1024 us units */
209
210
#define MESH_PATH_EXPIRE (600 * HZ)
211
212
/* Default maximum number of plinks per interface */
213
#define MESH_MAX_PLINKS 256
214
215
/* Maximum number of paths per interface */
216
#define MESH_MAX_MPATHS 1024
217
218
/* Number of frames buffered per destination for unresolved destinations */
219
#define MESH_FRAME_QUEUE_LEN 10
220
221
/* Public interfaces */
222
/* Various */
223
int
ieee80211_fill_mesh_addresses
(
struct
ieee80211_hdr
*
hdr
,
__le16
*
fc
,
224
const
u8
*
da
,
const
u8
*
sa
);
225
int
ieee80211_new_mesh_header
(
struct
ieee80211s_hdr
*meshhdr,
226
struct
ieee80211_sub_if_data
*
sdata
,
char
*addr4or5,
227
char
*addr6);
228
int
mesh_rmc_check
(
u8
*
addr
,
struct
ieee80211s_hdr
*mesh_hdr,
229
struct
ieee80211_sub_if_data
*
sdata
);
230
bool
mesh_matches_local
(
struct
ieee80211_sub_if_data
*
sdata
,
231
struct
ieee802_11_elems
*ie);
232
void
mesh_ids_set_default
(
struct
ieee80211_if_mesh
*mesh);
233
void
mesh_mgmt_ies_add
(
struct
sk_buff
*
skb
,
234
struct
ieee80211_sub_if_data
*
sdata
);
235
int
mesh_add_meshconf_ie
(
struct
sk_buff
*
skb
,
236
struct
ieee80211_sub_if_data
*
sdata
);
237
int
mesh_add_meshid_ie
(
struct
sk_buff
*
skb
,
238
struct
ieee80211_sub_if_data
*
sdata
);
239
int
mesh_add_rsn_ie
(
struct
sk_buff
*
skb
,
240
struct
ieee80211_sub_if_data
*
sdata
);
241
int
mesh_add_vendor_ies
(
struct
sk_buff
*
skb
,
242
struct
ieee80211_sub_if_data
*
sdata
);
243
int
mesh_add_ds_params_ie
(
struct
sk_buff
*
skb
,
244
struct
ieee80211_sub_if_data
*
sdata
);
245
int
mesh_add_ht_cap_ie
(
struct
sk_buff
*
skb
,
246
struct
ieee80211_sub_if_data
*
sdata
);
247
int
mesh_add_ht_oper_ie
(
struct
sk_buff
*
skb
,
248
struct
ieee80211_sub_if_data
*
sdata
);
249
void
mesh_rmc_free
(
struct
ieee80211_sub_if_data
*
sdata
);
250
int
mesh_rmc_init
(
struct
ieee80211_sub_if_data
*
sdata
);
251
void
ieee80211s_init
(
void
);
252
void
ieee80211s_update_metric
(
struct
ieee80211_local
*local,
253
struct
sta_info
*sta,
struct
sk_buff
*
skb
);
254
void
ieee80211s_stop
(
void
);
255
void
ieee80211_mesh_init_sdata
(
struct
ieee80211_sub_if_data
*
sdata
);
256
void
ieee80211_start_mesh
(
struct
ieee80211_sub_if_data
*
sdata
);
257
void
ieee80211_stop_mesh
(
struct
ieee80211_sub_if_data
*
sdata
);
258
void
ieee80211_mesh_root_setup
(
struct
ieee80211_if_mesh
*ifmsh);
259
struct
ieee80211_mesh_sync_ops
*
ieee80211_mesh_sync_ops_get
(
u8
method
);
260
261
/* Mesh paths */
262
int
mesh_nexthop_lookup
(
struct
sk_buff
*
skb
,
263
struct
ieee80211_sub_if_data
*
sdata
);
264
int
mesh_nexthop_resolve
(
struct
sk_buff
*
skb
,
265
struct
ieee80211_sub_if_data
*
sdata
);
266
void
mesh_path_start_discovery
(
struct
ieee80211_sub_if_data
*
sdata
);
267
struct
mesh_path
*
mesh_path_lookup
(
u8
*
dst
,
268
struct
ieee80211_sub_if_data
*
sdata
);
269
struct
mesh_path
*
mpp_path_lookup
(
u8
*
dst
,
270
struct
ieee80211_sub_if_data
*
sdata
);
271
int
mpp_path_add
(
u8
*
dst
,
u8
*
mpp
,
struct
ieee80211_sub_if_data
*
sdata
);
272
struct
mesh_path
*
mesh_path_lookup_by_idx
(
int
idx
,
273
struct
ieee80211_sub_if_data
*
sdata
);
274
void
mesh_path_fix_nexthop
(
struct
mesh_path
*
mpath
,
struct
sta_info
*
next_hop
);
275
void
mesh_path_expire
(
struct
ieee80211_sub_if_data
*
sdata
);
276
void
mesh_rx_path_sel_frame
(
struct
ieee80211_sub_if_data
*
sdata
,
277
struct
ieee80211_mgmt
*
mgmt
,
size_t
len);
278
int
mesh_path_add
(
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
);
279
280
int
mesh_path_add_gate
(
struct
mesh_path
*
mpath
);
281
int
mesh_path_send_to_gates
(
struct
mesh_path
*
mpath
);
282
int
mesh_gate_num
(
struct
ieee80211_sub_if_data
*
sdata
);
283
/* Mesh plinks */
284
void
mesh_neighbour_update
(
struct
ieee80211_sub_if_data
*
sdata
,
285
u8
*hw_addr,
286
struct
ieee802_11_elems
*ie);
287
bool
mesh_peer_accepts_plinks
(
struct
ieee802_11_elems
*ie);
288
u32
mesh_accept_plinks_update
(
struct
ieee80211_sub_if_data
*
sdata
);
289
void
mesh_plink_broken
(
struct
sta_info
*sta);
290
void
mesh_plink_deactivate
(
struct
sta_info
*sta);
291
int
mesh_plink_open
(
struct
sta_info
*sta);
292
void
mesh_plink_block
(
struct
sta_info
*sta);
293
void
mesh_rx_plink_frame
(
struct
ieee80211_sub_if_data
*
sdata
,
294
struct
ieee80211_mgmt
*
mgmt
,
size_t
len,
295
struct
ieee80211_rx_status
*
rx_status
);
296
297
/* Private interfaces */
298
/* Mesh tables */
299
void
mesh_mpath_table_grow
(
void
);
300
void
mesh_mpp_table_grow
(
void
);
301
/* Mesh paths */
302
int
mesh_path_error_tx
(
u8
ttl
,
u8
*
target
,
__le32
target_sn,
__le16
target_rcode,
303
const
u8
*
ra
,
struct
ieee80211_sub_if_data
*
sdata
);
304
void
mesh_path_assign_nexthop
(
struct
mesh_path
*
mpath
,
struct
sta_info
*sta);
305
void
mesh_path_flush_pending
(
struct
mesh_path
*
mpath
);
306
void
mesh_path_tx_pending
(
struct
mesh_path
*
mpath
);
307
int
mesh_pathtbl_init
(
void
);
308
void
mesh_pathtbl_unregister
(
void
);
309
int
mesh_path_del
(
u8
*
addr
,
struct
ieee80211_sub_if_data
*
sdata
);
310
void
mesh_path_timer
(
unsigned
long
data
);
311
void
mesh_path_flush_by_nexthop
(
struct
sta_info
*sta);
312
void
mesh_path_discard_frame
(
struct
sk_buff
*
skb
,
313
struct
ieee80211_sub_if_data
*
sdata
);
314
void
mesh_path_quiesce
(
struct
ieee80211_sub_if_data
*
sdata
);
315
void
mesh_path_restart
(
struct
ieee80211_sub_if_data
*
sdata
);
316
void
mesh_path_tx_root_frame
(
struct
ieee80211_sub_if_data
*
sdata
);
317
318
bool
mesh_action_is_path_sel
(
struct
ieee80211_mgmt
*
mgmt
);
319
extern
int
mesh_paths_generation
;
320
321
#ifdef CONFIG_MAC80211_MESH
322
extern
int
mesh_allocated
;
323
324
static
inline
int
mesh_plink_free_count(
struct
ieee80211_sub_if_data
*
sdata
)
325
{
326
return
sdata->
u
.
mesh
.mshcfg.dot11MeshMaxPeerLinks -
327
atomic_read
(&sdata->
u
.
mesh
.mshstats.estab_plinks);
328
}
329
330
static
inline
bool
mesh_plink_availables(
struct
ieee80211_sub_if_data
*
sdata
)
331
{
332
return
(
min_t
(
long
, mesh_plink_free_count(sdata),
333
MESH_MAX_PLINKS
- sdata->
local
->num_sta)) > 0;
334
}
335
336
static
inline
void
mesh_path_activate(
struct
mesh_path
*
mpath
)
337
{
338
mpath->
flags
|=
MESH_PATH_ACTIVE
|
MESH_PATH_RESOLVED
;
339
}
340
341
static
inline
bool
mesh_path_sel_is_hwmp(
struct
ieee80211_sub_if_data
*sdata)
342
{
343
return
sdata->
u
.
mesh
.mesh_pp_id ==
IEEE80211_PATH_PROTOCOL_HWMP
;
344
}
345
346
void
ieee80211_mesh_notify_scan_completed
(
struct
ieee80211_local
*local);
347
348
void
ieee80211_mesh_quiesce(
struct
ieee80211_sub_if_data
*sdata);
349
void
ieee80211_mesh_restart(
struct
ieee80211_sub_if_data
*sdata);
350
void
mesh_plink_quiesce(
struct
sta_info
*sta);
351
void
mesh_plink_restart(
struct
sta_info
*sta);
352
void
mesh_path_flush_by_iface
(
struct
ieee80211_sub_if_data
*sdata);
353
void
mesh_sync_adjust_tbtt
(
struct
ieee80211_sub_if_data
*sdata);
354
#else
355
#define mesh_allocated 0
356
static
inline
void
357
ieee80211_mesh_notify_scan_completed
(
struct
ieee80211_local
*local) {}
358
static
inline
void
ieee80211_mesh_quiesce(
struct
ieee80211_sub_if_data
*sdata)
359
{}
360
static
inline
void
ieee80211_mesh_restart(
struct
ieee80211_sub_if_data
*sdata)
361
{}
362
static
inline
void
mesh_plink_quiesce(
struct
sta_info
*sta) {}
363
static
inline
void
mesh_plink_restart(
struct
sta_info
*sta) {}
364
static
inline
bool
mesh_path_sel_is_hwmp(
struct
ieee80211_sub_if_data
*sdata)
365
{
return
false
; }
366
static
inline
void
mesh_path_flush_by_iface
(
struct
ieee80211_sub_if_data
*sdata)
367
{}
368
#endif
369
370
#endif
/* IEEE80211S_H */
Generated on Thu Jan 10 2013 14:12:03 for Linux Kernel by
1.8.2