Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
239289e4
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
239289e4
编写于
8月 29, 2011
作者:
J
Javier Cardona
提交者:
John W. Linville
9月 13, 2011
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
mac80211: Consolidate mesh path duplicated functions
Signed-off-by:
N
John W. Linville
<
linville@tuxdriver.com
>
上级
cd72e817
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
28 addition
and
42 deletion
+28
-42
net/mac80211/mesh_pathtbl.c
net/mac80211/mesh_pathtbl.c
+28
-42
未找到文件。
net/mac80211/mesh_pathtbl.c
浏览文件 @
239289e4
...
...
@@ -48,10 +48,10 @@ static struct mesh_table __rcu *mpp_paths; /* Store paths for MPP&MAP */
int
mesh_paths_generation
;
/* This lock will have the grow table function as writer and add / delete nodes
* as readers.
When reading the table (i.e. doing lookups) we are well protected
*
by RCU. We need to take this lock when modying the number of buckets
*
on one of the path tables but we don't need to if adding or removing mpaths
*
from hash buckets
.
* as readers.
RCU provides sufficient protection only when reading the table
*
(i.e. doing lookups). Adding or adding or removing nodes requires we take
*
the read lock or we risk operating on an old table. The write lock is only
*
needed when modifying the number of buckets a table
.
*/
static
DEFINE_RWLOCK
(
pathtbl_resize_lock
);
...
...
@@ -335,25 +335,14 @@ static void mesh_path_move_to_queue(struct mesh_path *gate_mpath,
}
/**
* mesh_path_lookup - look up a path in the mesh path table
* @dst: hardware address (ETH_ALEN length) of destination
* @sdata: local subif
*
* Returns: pointer to the mesh path structure, or NULL if not found
*
* Locking: must be called within a read rcu section.
*/
struct
mesh_path
*
mesh_path_lookup
(
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
)
static
struct
mesh_path
*
path_lookup
(
struct
mesh_table
*
tbl
,
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
)
{
struct
mesh_path
*
mpath
;
struct
hlist_node
*
n
;
struct
hlist_head
*
bucket
;
struct
mesh_table
*
tbl
;
struct
mpath_node
*
node
;
tbl
=
rcu_dereference
(
mesh_paths
);
bucket
=
&
tbl
->
hash_buckets
[
mesh_table_hash
(
dst
,
sdata
,
tbl
)];
hlist_for_each_entry_rcu
(
node
,
n
,
bucket
,
list
)
{
mpath
=
node
->
mpath
;
...
...
@@ -370,30 +359,23 @@ struct mesh_path *mesh_path_lookup(u8 *dst, struct ieee80211_sub_if_data *sdata)
return
NULL
;
}
struct
mesh_path
*
mpp_path_lookup
(
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
)
/**
* mesh_path_lookup - look up a path in the mesh path table
* @dst: hardware address (ETH_ALEN length) of destination
* @sdata: local subif
*
* Returns: pointer to the mesh path structure, or NULL if not found
*
* Locking: must be called within a read rcu section.
*/
struct
mesh_path
*
mesh_path_lookup
(
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
)
{
struct
mesh_path
*
mpath
;
struct
hlist_node
*
n
;
struct
hlist_head
*
bucket
;
struct
mesh_table
*
tbl
;
struct
mpath_node
*
node
;
tbl
=
rcu_dereference
(
mpp_paths
);
return
path_lookup
(
rcu_dereference
(
mesh_paths
),
dst
,
sdata
);
}
bucket
=
&
tbl
->
hash_buckets
[
mesh_table_hash
(
dst
,
sdata
,
tbl
)];
hlist_for_each_entry_rcu
(
node
,
n
,
bucket
,
list
)
{
mpath
=
node
->
mpath
;
if
(
mpath
->
sdata
==
sdata
&&
memcmp
(
dst
,
mpath
->
dst
,
ETH_ALEN
)
==
0
)
{
if
(
MPATH_EXPIRED
(
mpath
))
{
spin_lock_bh
(
&
mpath
->
state_lock
);
mpath
->
flags
&=
~
MESH_PATH_ACTIVE
;
spin_unlock_bh
(
&
mpath
->
state_lock
);
}
return
mpath
;
}
}
return
NULL
;
struct
mesh_path
*
mpp_path_lookup
(
u8
*
dst
,
struct
ieee80211_sub_if_data
*
sdata
)
{
return
path_lookup
(
rcu_dereference
(
mpp_paths
),
dst
,
sdata
);
}
...
...
@@ -836,7 +818,8 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
int
i
;
rcu_read_lock
();
tbl
=
rcu_dereference
(
mesh_paths
);
read_lock_bh
(
&
pathtbl_resize_lock
);
tbl
=
resize_dereference_mesh_paths
();
for_each_mesh_entry
(
tbl
,
p
,
node
,
i
)
{
mpath
=
node
->
mpath
;
if
(
rcu_dereference
(
mpath
->
next_hop
)
==
sta
)
{
...
...
@@ -845,6 +828,7 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
spin_unlock_bh
(
&
tbl
->
hashwlock
[
i
]);
}
}
read_unlock_bh
(
&
pathtbl_resize_lock
);
rcu_read_unlock
();
}
...
...
@@ -880,10 +864,12 @@ void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata)
struct
mesh_table
*
tbl
;
rcu_read_lock
();
tbl
=
rcu_dereference
(
mesh_paths
);
read_lock_bh
(
&
pathtbl_resize_lock
);
tbl
=
resize_dereference_mesh_paths
();
table_flush_by_iface
(
tbl
,
sdata
);
tbl
=
r
cu_dereference
(
mpp_paths
);
tbl
=
r
esize_dereference_mpp_paths
(
);
table_flush_by_iface
(
tbl
,
sdata
);
read_unlock_bh
(
&
pathtbl_resize_lock
);
rcu_read_unlock
();
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录