Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
xcap
xcap-capability-linux
Commits
a9908ebf
Commit
a9908ebf
authored
Feb 18, 2013
by
John W. Linville
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-john' of
git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
parents
cfe41828
8c6d59ee
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
309 additions
and
334 deletions
+309
-334
Documentation/DocBook/80211.tmpl
Documentation/DocBook/80211.tmpl
+2
-2
net/mac80211/cfg.c
net/mac80211/cfg.c
+7
-7
net/mac80211/iface.c
net/mac80211/iface.c
+5
-3
net/mac80211/main.c
net/mac80211/main.c
+1
-2
net/mac80211/mesh.c
net/mac80211/mesh.c
+61
-55
net/mac80211/mesh.h
net/mac80211/mesh.h
+50
-55
net/mac80211/mesh_hwmp.c
net/mac80211/mesh_hwmp.c
+34
-34
net/mac80211/mesh_pathtbl.c
net/mac80211/mesh_pathtbl.c
+46
-43
net/mac80211/mesh_plink.c
net/mac80211/mesh_plink.c
+67
-67
net/mac80211/mesh_sync.c
net/mac80211/mesh_sync.c
+16
-31
net/mac80211/rx.c
net/mac80211/rx.c
+6
-6
net/mac80211/sta_info.h
net/mac80211/sta_info.h
+0
-2
net/mac80211/trace.h
net/mac80211/trace.h
+3
-3
net/mac80211/tx.c
net/mac80211/tx.c
+11
-15
net/wireless/nl80211.c
net/wireless/nl80211.c
+0
-9
No files found.
Documentation/DocBook/80211.tmpl
View file @
a9908ebf
...
...
@@ -107,8 +107,8 @@
!Finclude/net/cfg80211.h key_params
!Finclude/net/cfg80211.h survey_info_flags
!Finclude/net/cfg80211.h survey_info
!Finclude/net/cfg80211.h
beacon_parameters
!Finclude/net/cfg80211.h
plink_action
s
!Finclude/net/cfg80211.h
cfg80211_beacon_data
!Finclude/net/cfg80211.h
cfg80211_ap_setting
s
!Finclude/net/cfg80211.h station_parameters
!Finclude/net/cfg80211.h station_info_flags
!Finclude/net/cfg80211.h rate_info_flags
...
...
net/mac80211/cfg.c
View file @
a9908ebf
...
...
@@ -1500,13 +1500,13 @@ static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
return
-
ENOENT
;
}
err
=
mesh_path_add
(
dst
,
sdata
);
err
=
mesh_path_add
(
sdata
,
dst
);
if
(
err
)
{
rcu_read_unlock
();
return
err
;
}
mpath
=
mesh_path_lookup
(
dst
,
sdata
);
mpath
=
mesh_path_lookup
(
sdata
,
dst
);
if
(
!
mpath
)
{
rcu_read_unlock
();
return
-
ENXIO
;
...
...
@@ -1518,12 +1518,12 @@ static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
}
static
int
ieee80211_del_mpath
(
struct
wiphy
*
wiphy
,
struct
net_device
*
dev
,
u8
*
dst
)
u8
*
dst
)
{
struct
ieee80211_sub_if_data
*
sdata
=
IEEE80211_DEV_TO_SUB_IF
(
dev
);
if
(
dst
)
return
mesh_path_del
(
dst
,
sdata
);
return
mesh_path_del
(
sdata
,
dst
);
mesh_path_flush_by_iface
(
sdata
);
return
0
;
...
...
@@ -1547,7 +1547,7 @@ static int ieee80211_change_mpath(struct wiphy *wiphy,
return
-
ENOENT
;
}
mpath
=
mesh_path_lookup
(
dst
,
sdata
);
mpath
=
mesh_path_lookup
(
sdata
,
dst
);
if
(
!
mpath
)
{
rcu_read_unlock
();
return
-
ENOENT
;
...
...
@@ -1611,7 +1611,7 @@ static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
sdata
=
IEEE80211_DEV_TO_SUB_IF
(
dev
);
rcu_read_lock
();
mpath
=
mesh_path_lookup
(
dst
,
sdata
);
mpath
=
mesh_path_lookup
(
sdata
,
dst
);
if
(
!
mpath
)
{
rcu_read_unlock
();
return
-
ENOENT
;
...
...
@@ -1632,7 +1632,7 @@ static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
sdata
=
IEEE80211_DEV_TO_SUB_IF
(
dev
);
rcu_read_lock
();
mpath
=
mesh_path_lookup_by_idx
(
idx
,
sdata
);
mpath
=
mesh_path_lookup_by_idx
(
sdata
,
idx
);
if
(
!
mpath
)
{
rcu_read_unlock
();
return
-
ENOENT
;
...
...
net/mac80211/iface.c
View file @
a9908ebf
...
...
@@ -294,7 +294,8 @@ static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata)
}
}
if
((
sdata
->
vif
.
type
!=
NL80211_IFTYPE_AP
)
||
if
((
sdata
->
vif
.
type
!=
NL80211_IFTYPE_AP
&&
sdata
->
vif
.
type
!=
NL80211_IFTYPE_MESH_POINT
)
||
!
(
sdata
->
local
->
hw
.
flags
&
IEEE80211_HW_QUEUE_CONTROL
))
{
sdata
->
vif
.
cab_queue
=
IEEE80211_INVAL_HW_QUEUE
;
return
0
;
...
...
@@ -695,6 +696,9 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
ieee80211_roc_purge
(
sdata
);
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_STATION
)
ieee80211_mgd_stop
(
sdata
);
/*
* Remove all stations associated with this interface.
*
...
...
@@ -782,8 +786,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
}
}
spin_unlock_irqrestore
(
&
ps
->
bc_buf
.
lock
,
flags
);
}
else
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_STATION
)
{
ieee80211_mgd_stop
(
sdata
);
}
if
(
going_down
)
...
...
net/mac80211/main.c
View file @
a9908ebf
...
...
@@ -1173,8 +1173,7 @@ static void __exit ieee80211_exit(void)
rc80211_minstrel_ht_exit
();
rc80211_minstrel_exit
();
if
(
mesh_allocated
)
ieee80211s_stop
();
ieee80211s_stop
();
ieee80211_iface_exit
();
...
...
net/mac80211/mesh.c
View file @
a9908ebf
...
...
@@ -17,7 +17,7 @@
#define TMR_RUNNING_MP 1
#define TMR_RUNNING_MPR 2
int
mesh_allocated
;
static
int
mesh_allocated
;
static
struct
kmem_cache
*
rm_cache
;
bool
mesh_action_is_path_sel
(
struct
ieee80211_mgmt
*
mgmt
)
...
...
@@ -36,6 +36,8 @@ void ieee80211s_init(void)
void
ieee80211s_stop
(
void
)
{
if
(
!
mesh_allocated
)
return
;
mesh_pathtbl_unregister
();
kmem_cache_destroy
(
rm_cache
);
}
...
...
@@ -90,24 +92,22 @@ bool mesh_matches_local(struct ieee80211_sub_if_data *sdata,
(
ifmsh
->
mesh_cc_id
==
ie
->
mesh_config
->
meshconf_congest
)
&&
(
ifmsh
->
mesh_sp_id
==
ie
->
mesh_config
->
meshconf_synch
)
&&
(
ifmsh
->
mesh_auth_id
==
ie
->
mesh_config
->
meshconf_auth
)))
goto
mismatch
;
return
false
;
ieee80211_sta_get_rates
(
local
,
ie
,
ieee80211_get_sdata_band
(
sdata
),
&
basic_rates
);
if
(
sdata
->
vif
.
bss_conf
.
basic_rates
!=
basic_rates
)
goto
mismatch
;
return
false
;
ieee80211_ht_oper_to_chandef
(
sdata
->
vif
.
bss_conf
.
chandef
.
chan
,
ie
->
ht_operation
,
&
sta_chan_def
);
if
(
!
cfg80211_chandef_compatible
(
&
sdata
->
vif
.
bss_conf
.
chandef
,
&
sta_chan_def
))
goto
mismatch
;
return
false
;
return
true
;
mismatch:
return
false
;
}
/**
...
...
@@ -118,7 +118,7 @@ mismatch:
bool
mesh_peer_accepts_plinks
(
struct
ieee802_11_elems
*
ie
)
{
return
(
ie
->
mesh_config
->
meshconf_cap
&
IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS
)
!=
0
;
IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS
)
!=
0
;
}
/**
...
...
@@ -196,11 +196,12 @@ void mesh_rmc_free(struct ieee80211_sub_if_data *sdata)
if
(
!
sdata
->
u
.
mesh
.
rmc
)
return
;
for
(
i
=
0
;
i
<
RMC_BUCKETS
;
i
++
)
for
(
i
=
0
;
i
<
RMC_BUCKETS
;
i
++
)
{
list_for_each_entry_safe
(
p
,
n
,
&
rmc
->
bucket
[
i
],
list
)
{
list_del
(
&
p
->
list
);
kmem_cache_free
(
rm_cache
,
p
);
}
}
kfree
(
rmc
);
sdata
->
u
.
mesh
.
rmc
=
NULL
;
...
...
@@ -209,6 +210,7 @@ void mesh_rmc_free(struct ieee80211_sub_if_data *sdata)
/**
* mesh_rmc_check - Check frame in recent multicast cache and add if absent.
*
* @sdata: interface
* @sa: source address
* @mesh_hdr: mesh_header
*
...
...
@@ -218,8 +220,8 @@ void mesh_rmc_free(struct ieee80211_sub_if_data *sdata)
* received this frame lately. If the frame is not in the cache, it is added to
* it.
*/
int
mesh_rmc_check
(
u8
*
sa
,
struct
ieee80211
s_hdr
*
mesh_hdr
,
struct
ieee80211
_sub_if_data
*
sdata
)
int
mesh_rmc_check
(
struct
ieee80211
_sub_if_data
*
sdata
,
const
u8
*
sa
,
struct
ieee80211
s_hdr
*
mesh_hdr
)
{
struct
mesh_rmc
*
rmc
=
sdata
->
u
.
mesh
.
rmc
;
u32
seqnum
=
0
;
...
...
@@ -233,12 +235,11 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
list_for_each_entry_safe
(
p
,
n
,
&
rmc
->
bucket
[
idx
],
list
)
{
++
entries
;
if
(
time_after
(
jiffies
,
p
->
exp_time
)
||
(
entries
==
RMC_QUEUE_MAX_LEN
)
)
{
entries
==
RMC_QUEUE_MAX_LEN
)
{
list_del
(
&
p
->
list
);
kmem_cache_free
(
rm_cache
,
p
);
--
entries
;
}
else
if
((
seqnum
==
p
->
seqnum
)
&&
(
ether_addr_equal
(
sa
,
p
->
sa
)))
}
else
if
((
seqnum
==
p
->
seqnum
)
&&
ether_addr_equal
(
sa
,
p
->
sa
))
return
-
1
;
}
...
...
@@ -253,8 +254,8 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
return
0
;
}
int
mesh_add_meshconf_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
)
int
mesh_add_meshconf_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_if_mesh
*
ifmsh
=
&
sdata
->
u
.
mesh
;
u8
*
pos
,
neighbors
;
...
...
@@ -285,19 +286,18 @@ mesh_add_meshconf_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
/* Mesh capability */
*
pos
=
IEEE80211_MESHCONF_CAPAB_FORWARDING
;
*
pos
|=
ifmsh
->
accepting_plinks
?
IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS
:
0x00
;
IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS
:
0x00
;
/* Mesh PS mode. See IEEE802.11-2012 8.4.2.100.8 */
*
pos
|=
ifmsh
->
ps_peers_deep_sleep
?
IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL
:
0x00
;
IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL
:
0x00
;
*
pos
++
|=
ifmsh
->
adjusting_tbtt
?
IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING
:
0x00
;
IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING
:
0x00
;
*
pos
++
=
0x00
;
return
0
;
}
int
mesh_add_meshid_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
)
int
mesh_add_meshid_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_if_mesh
*
ifmsh
=
&
sdata
->
u
.
mesh
;
u8
*
pos
;
...
...
@@ -314,8 +314,8 @@ mesh_add_meshid_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
return
0
;
}
int
mesh_add_awake_window_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
)
static
int
mesh_add_awake_window_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_if_mesh
*
ifmsh
=
&
sdata
->
u
.
mesh
;
u8
*
pos
;
...
...
@@ -337,8 +337,8 @@ int mesh_add_awake_window_ie(struct sk_buff *skb,
return
0
;
}
int
mesh_add_vendor_ies
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
)
int
mesh_add_vendor_ies
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_if_mesh
*
ifmsh
=
&
sdata
->
u
.
mesh
;
u8
offset
,
len
;
...
...
@@ -361,8 +361,7 @@ mesh_add_vendor_ies(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
return
0
;
}
int
mesh_add_rsn_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
)
int
mesh_add_rsn_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_if_mesh
*
ifmsh
=
&
sdata
->
u
.
mesh
;
u8
len
=
0
;
...
...
@@ -390,8 +389,8 @@ mesh_add_rsn_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
return
0
;
}
int
mesh_add_ds_params_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
)
static
int
mesh_add_ds_params_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_chanctx_conf
*
chanctx_conf
;
struct
ieee80211_channel
*
chan
;
...
...
@@ -417,8 +416,8 @@ int mesh_add_ds_params_ie(struct sk_buff *skb,
return
0
;
}
int
mesh_add_ht_cap_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
)
int
mesh_add_ht_cap_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_local
*
local
=
sdata
->
local
;
enum
ieee80211_band
band
=
ieee80211_get_sdata_band
(
sdata
);
...
...
@@ -439,8 +438,8 @@ int mesh_add_ht_cap_ie(struct sk_buff *skb,
return
0
;
}
int
mesh_add_ht_oper_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
)
int
mesh_add_ht_oper_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_local
*
local
=
sdata
->
local
;
struct
ieee80211_chanctx_conf
*
chanctx_conf
;
...
...
@@ -475,6 +474,7 @@ int mesh_add_ht_oper_ie(struct sk_buff *skb,
return
0
;
}
static
void
ieee80211_mesh_path_timer
(
unsigned
long
data
)
{
struct
ieee80211_sub_if_data
*
sdata
=
...
...
@@ -520,7 +520,7 @@ void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh)
/**
* ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame
* @hdr:
802.11 frame header
* @hdr: 802.11 frame header
* @fc: frame control field
* @meshda: destination address in the mesh
* @meshsa: source address address in the mesh. Same as TA, as frame is
...
...
@@ -551,8 +551,8 @@ int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
/**
* ieee80211_new_mesh_header - create a new mesh header
* @meshhdr: uninitialized mesh header
* @sdata: mesh interface to be used
* @meshhdr: uninitialized mesh header
* @addr4or5: 1st address in the ae header, which may correspond to address 4
* (if addr6 is NULL) or address 5 (if addr6 is present). It may
* be NULL.
...
...
@@ -561,32 +561,38 @@ int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
*
* Return the header length.
*/
int
ieee80211_new_mesh_header
(
struct
ieee80211
s_hdr
*
meshhdr
,
struct
ieee80211
_sub_if_data
*
sdata
,
char
*
addr4or5
,
char
*
addr6
)
int
ieee80211_new_mesh_header
(
struct
ieee80211
_sub_if_data
*
sdata
,
struct
ieee80211
s_hdr
*
meshhdr
,
const
char
*
addr4or5
,
const
char
*
addr6
)
{
int
aelen
=
0
;
BUG_ON
(
!
addr4or5
&&
addr6
);
if
(
WARN_ON
(
!
addr4or5
&&
addr6
))
return
0
;
memset
(
meshhdr
,
0
,
sizeof
(
*
meshhdr
));
meshhdr
->
ttl
=
sdata
->
u
.
mesh
.
mshcfg
.
dot11MeshTTL
;
/* FIXME: racy -- TX on multiple queues can be concurrent */
put_unaligned
(
cpu_to_le32
(
sdata
->
u
.
mesh
.
mesh_seqnum
),
&
meshhdr
->
seqnum
);
sdata
->
u
.
mesh
.
mesh_seqnum
++
;
if
(
addr4or5
&&
!
addr6
)
{
meshhdr
->
flags
|=
MESH_FLAGS_AE_A4
;
aelen
+=
ETH_ALEN
;
memcpy
(
meshhdr
->
eaddr1
,
addr4or5
,
ETH_ALEN
);
return
2
*
ETH_ALEN
;
}
else
if
(
addr4or5
&&
addr6
)
{
meshhdr
->
flags
|=
MESH_FLAGS_AE_A5_A6
;
aelen
+=
2
*
ETH_ALEN
;
memcpy
(
meshhdr
->
eaddr1
,
addr4or5
,
ETH_ALEN
);
memcpy
(
meshhdr
->
eaddr2
,
addr6
,
ETH_ALEN
);
return
3
*
ETH_ALEN
;
}
return
6
+
aelen
;
return
ETH_ALEN
;
}
static
void
ieee80211_mesh_housekeeping
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
ieee80211_if_mesh
*
ifmsh
)
static
void
ieee80211_mesh_housekeeping
(
struct
ieee80211_sub_if_data
*
sdata
)
{
struct
ieee80211_if_mesh
*
ifmsh
=
&
sdata
->
u
.
mesh
;
u32
changed
;
ieee80211_sta_expire
(
sdata
,
IEEE80211_MESH_PEER_INACTIVITY_LIMIT
);
...
...
@@ -596,7 +602,8 @@ static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata,
ieee80211_mbss_info_change_notify
(
sdata
,
changed
);
mod_timer
(
&
ifmsh
->
housekeeping_timer
,
round_jiffies
(
jiffies
+
IEEE80211_MESH_HOUSEKEEPING_INTERVAL
));
round_jiffies
(
jiffies
+
IEEE80211_MESH_HOUSEKEEPING_INTERVAL
));
}
static
void
ieee80211_mesh_rootpath
(
struct
ieee80211_sub_if_data
*
sdata
)
...
...
@@ -708,7 +715,7 @@ ieee80211_mesh_build_beacon(struct ieee80211_if_mesh *ifmsh)
*
pos
++
=
0x0
;
if
(
ieee80211_add_srates_ie
(
sdata
,
skb
,
true
,
band
)
||
mesh_add_ds_params_ie
(
s
kb
,
sdata
))
mesh_add_ds_params_ie
(
s
data
,
skb
))
goto
out_free
;
bcn
->
head_len
=
skb
->
len
;
...
...
@@ -719,13 +726,13 @@ ieee80211_mesh_build_beacon(struct ieee80211_if_mesh *ifmsh)
bcn
->
tail
=
bcn
->
head
+
bcn
->
head_len
;
if
(
ieee80211_add_ext_srates_ie
(
sdata
,
skb
,
true
,
band
)
||
mesh_add_rsn_ie
(
s
kb
,
sdata
)
||
mesh_add_ht_cap_ie
(
s
kb
,
sdata
)
||
mesh_add_ht_oper_ie
(
s
kb
,
sdata
)
||
mesh_add_meshid_ie
(
s
kb
,
sdata
)
||
mesh_add_meshconf_ie
(
s
kb
,
sdata
)
||
mesh_add_awake_window_ie
(
s
kb
,
sdata
)
||
mesh_add_vendor_ies
(
s
kb
,
sdata
))
mesh_add_rsn_ie
(
s
data
,
skb
)
||
mesh_add_ht_cap_ie
(
s
data
,
skb
)
||
mesh_add_ht_oper_ie
(
s
data
,
skb
)
||
mesh_add_meshid_ie
(
s
data
,
skb
)
||
mesh_add_meshconf_ie
(
s
data
,
skb
)
||
mesh_add_awake_window_ie
(
s
data
,
skb
)
||
mesh_add_vendor_ies
(
s
data
,
skb
))
goto
out_free
;
bcn
->
tail_len
=
skb
->
len
;
...
...
@@ -918,7 +925,6 @@ ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata,
hdr
->
frame_control
=
cpu_to_le16
(
IEEE80211_FTYPE_MGMT
|
IEEE80211_STYPE_PROBE_RESP
);
memcpy
(
hdr
->
da
,
mgmt
->
sa
,
ETH_ALEN
);
mpl_dbg
(
sdata
,
"sending probe resp. to %pM
\n
"
,
hdr
->
da
);
IEEE80211_SKB_CB
(
presp
)
->
flags
|=
IEEE80211_TX_INTFL_DONT_ENCRYPT
;
ieee80211_tx_skb
(
sdata
,
presp
);
out:
...
...
@@ -1039,7 +1045,7 @@ void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata)
mesh_mpp_table_grow
();
if
(
test_and_clear_bit
(
MESH_WORK_HOUSEKEEPING
,
&
ifmsh
->
wrkq_flags
))
ieee80211_mesh_housekeeping
(
sdata
,
ifmsh
);
ieee80211_mesh_housekeeping
(
sdata
);
if
(
test_and_clear_bit
(
MESH_WORK_ROOT
,
&
ifmsh
->
wrkq_flags
))
ieee80211_mesh_rootpath
(
sdata
);
...
...
net/mac80211/mesh.h
View file @
a9908ebf
...
...
@@ -26,12 +26,12 @@
* @MESH_PATH_ACTIVE: the mesh path can be used for forwarding
* @MESH_PATH_RESOLVING: the discovery process is running for this mesh path
* @MESH_PATH_SN_VALID: the mesh path contains a valid destination sequence
*
number
* number
* @MESH_PATH_FIXED: the mesh path has been manually set and should not be
*
modified
* modified
* @MESH_PATH_RESOLVED: the mesh path can has been resolved
* @MESH_PATH_REQ_QUEUED: there is an unsent path request for this destination
*
already queued up, waiting for the discovery process to start.
*
already queued up, waiting for the discovery process to start.
*
* MESH_PATH_RESOLVED is used by the mesh path timer to
* decide when to stop or cancel the mesh path discovery.
...
...
@@ -73,16 +73,16 @@ enum mesh_deferred_task_flags {
* @dst: mesh path destination mac address
* @sdata: mesh subif
* @next_hop: mesh neighbor to which frames for this destination will be
*
forwarded
* forwarded
* @timer: mesh path discovery timer
* @frame_queue: pending queue for frames sent to this destination while the
*
path is unresolved
* path is unresolved
* @sn: target sequence number
* @metric: current metric to this destination
* @hop_count: hops to destination
* @exp_time: in jiffies, when the path will expire or when it expired
* @discovery_timeout: timeout (lapse in jiffies) used for the last discovery
*
retry
* retry
* @discovery_retries: number of discovery retries
* @flags: mesh path flags, as specified on &enum mesh_path_flags
* @state_lock: mesh path state lock used to protect changes to the
...
...
@@ -206,38 +206,33 @@ struct mesh_rmc {
/* Various */
int
ieee80211_fill_mesh_addresses
(
struct
ieee80211_hdr
*
hdr
,
__le16
*
fc
,
const
u8
*
da
,
const
u8
*
sa
);
int
ieee80211_new_mesh_header
(
struct
ieee80211
s_hdr
*
meshhdr
,
struct
ieee80211
_sub_if_data
*
sdata
,
char
*
addr4or5
,
char
*
addr6
);
int
mesh_rmc_check
(
u8
*
addr
,
struct
ieee80211
s_hdr
*
mesh_hdr
,
struct
ieee80211_sub_if_data
*
sdata
);
int
ieee80211_new_mesh_header
(
struct
ieee80211
_sub_if_data
*
sdata
,
struct
ieee80211
s_hdr
*
meshhdr
,
const
char
*
addr4or5
,
const
char
*
addr6
);
int
mesh_rmc_check
(
struct
ieee80211
_sub_if_data
*
sdata
,
const
u8
*
addr
,
struct
ieee80211s_hdr
*
mesh_hdr
);
bool
mesh_matches_local
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
ieee802_11_elems
*
ie
);
void
mesh_ids_set_default
(
struct
ieee80211_if_mesh
*
mesh
);
void
mesh_mgmt_ies_add
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_add_meshconf_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_add_meshid_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_add_rsn_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_add_awake_window_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_add_vendor_ies
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_add_ds_params_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_add_ht_cap_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_add_ht_oper_ie
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
void
mesh_mgmt_ies_add
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
int
mesh_add_meshconf_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
int
mesh_add_meshid_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
int
mesh_add_rsn_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
int
mesh_add_vendor_ies
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
int
mesh_add_ht_cap_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
int
mesh_add_ht_oper_ie
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
void
mesh_rmc_free
(
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_rmc_init
(
struct
ieee80211_sub_if_data
*
sdata
);
void
ieee80211s_init
(
void
);
void
ieee80211s_update_metric
(
struct
ieee80211_local
*
local
,
struct
sta_info
*
sta
,
struct
sk_buff
*
skb
);
void
ieee80211s_stop
(
void
);
struct
sta_info
*
sta
,
struct
sk_buff
*
skb
);
void
ieee80211_mesh_init_sdata
(
struct
ieee80211_sub_if_data
*
sdata
);
int
ieee80211_start_mesh
(
struct
ieee80211_sub_if_data
*
sdata
);
void
ieee80211_stop_mesh
(
struct
ieee80211_sub_if_data
*
sdata
);
...
...
@@ -263,31 +258,32 @@ void ieee80211_mps_frame_release(struct sta_info *sta,
struct
ieee802_11_elems
*
elems
);
/* Mesh paths */
int
mesh_nexthop_lookup
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_nexthop_resolve
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_nexthop_lookup
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
int
mesh_nexthop_resolve
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
void
mesh_path_start_discovery
(
struct
ieee80211_sub_if_data
*
sdata
);
struct
mesh_path
*
mesh_path_lookup
(
const
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
);
struct
mesh_path
*
mpp_path_lookup
(
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mpp_path_add
(
u8
*
dst
,
u8
*
mpp
,
struct
ieee80211_sub_if_data
*
sdata
);
struct
mesh_path
*
mesh_path_lookup_by_idx
(
int
idx
,
struct
ieee80211_sub_if_data
*
sdata
);
struct
mesh_path
*
mesh_path_lookup
(
struct
ieee80211_sub_if_data
*
sdata
,
const
u8
*
dst
);
struct
mesh_path
*
mpp_path_lookup
(
struct
ieee80211_sub_if_data
*
sdata
,
const
u8
*
dst
);
int
mpp_path_add
(
struct
ieee80211_sub_if_data
*
sdata
,
const
u8
*
dst
,
const
u8
*
mpp
);
struct
mesh_path
*
mesh_path_lookup_by_idx
(
struct
ieee80211_sub_if_data
*
sdata
,
int
idx
);
void
mesh_path_fix_nexthop
(
struct
mesh_path
*
mpath
,
struct
sta_info
*
next_hop
);
void
mesh_path_expire
(
struct
ieee80211_sub_if_data
*
sdata
);
void
mesh_rx_path_sel_frame
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
ieee80211_mgmt
*
mgmt
,
size_t
len
);
int
mesh_path_add
(
const
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
);
struct
ieee80211_mgmt
*
mgmt
,
size_t
len
);
int
mesh_path_add
(
struct
ieee80211_sub_if_data
*
sdata
,
const
u8
*
dst
);
int
mesh_path_add_gate
(
struct
mesh_path
*
mpath
);
int
mesh_path_send_to_gates
(
struct
mesh_path
*
mpath
);
int
mesh_gate_num
(
struct
ieee80211_sub_if_data
*
sdata
);
/* Mesh plinks */
void
mesh_neighbour_update
(
struct
ieee80211_sub_if_data
*
sdata
,
u8
*
hw_addr
,
struct
ieee802_11_elems
*
ie
);
u8
*
hw_addr
,
struct
ieee802_11_elems
*
ie
);
bool
mesh_peer_accepts_plinks
(
struct
ieee802_11_elems
*
ie
);
u32
mesh_accept_plinks_update
(
struct
ieee80211_sub_if_data
*
sdata
);
void
mesh_plink_broken
(
struct
sta_info
*
sta
);
...
...
@@ -304,19 +300,19 @@ void mesh_sta_cleanup(struct sta_info *sta);
void
mesh_mpath_table_grow
(
void
);
void
mesh_mpp_table_grow
(
void
);
/* Mesh paths */
int
mesh_path_error_tx
(
u8
ttl
,
const
u8
*
target
,
__le32
target_sn
,
__le16
target_rcode
,
const
u8
*
ra
,
struct
ieee80211_sub_if_data
*
sdat
a
);
int
mesh_path_error_tx
(
struct
ieee80211_sub_if_data
*
sdata
,
u8
ttl
,
const
u8
*
target
,
__le32
target_sn
,
__le16
target_rcode
,
const
u8
*
r
a
);
void
mesh_path_assign_nexthop
(
struct
mesh_path
*
mpath
,
struct
sta_info
*
sta
);
void
mesh_path_flush_pending
(
struct
mesh_path
*
mpath
);
void
mesh_path_tx_pending
(
struct
mesh_path
*
mpath
);
int
mesh_pathtbl_init
(
void
);
void
mesh_pathtbl_unregister
(
void
);
int
mesh_path_del
(
u8
*
addr
,
struct
ieee80211_sub_if_data
*
sdata
);
int
mesh_path_del
(
struct
ieee80211_sub_if_data
*
sdata
,
const
u8
*
addr
);
void
mesh_path_timer
(
unsigned
long
data
);
void
mesh_path_flush_by_nexthop
(
struct
sta_info
*
sta
);
void
mesh_path_discard_frame
(
struct
sk_buff
*
skb
,
struct
ieee80211_sub_if_data
*
sdata
);
void
mesh_path_discard_frame
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
void
mesh_path_quiesce
(
struct
ieee80211_sub_if_data
*
sdata
);
void
mesh_path_restart
(
struct
ieee80211_sub_if_data
*
sdata
);
void
mesh_path_tx_root_frame
(
struct
ieee80211_sub_if_data
*
sdata
);
...
...
@@ -325,8 +321,6 @@ bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt);
extern
int
mesh_paths_generation
;
#ifdef CONFIG_MAC80211_MESH
extern
int
mesh_allocated
;
static
inline
u32
mesh_plink_inc_estab_count
(
struct
ieee80211_sub_if_data
*
sdata
)
{
...
...
@@ -371,8 +365,8 @@ void mesh_plink_quiesce(struct sta_info *sta);
void
mesh_plink_restart
(
struct
sta_info
*
sta
);
void
mesh_path_flush_by_iface
(
struct
ieee80211_sub_if_data
*
sdata
);
void
mesh_sync_adjust_tbtt
(
struct
ieee80211_sub_if_data
*
sdata
);
void
ieee80211s_stop
(
void
);
#else
#define mesh_allocated 0
static
inline
void
ieee80211_mesh_notify_scan_completed
(
struct
ieee80211_local
*
local
)
{}
static
inline
void
ieee80211_mesh_quiesce
(
struct
ieee80211_sub_if_data
*
sdata
)
...
...
@@ -385,6 +379,7 @@ static