Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
d6f03f29
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d6f03f29
编写于
11月 26, 2011
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for_david' of
git://git.open-mesh.org/linux-merge
上级
6f39da2c
76e8d7b0
变更
14
显示空白变更内容
内联
并排
Showing
14 changed file
with
202 addition
and
182 deletion
+202
-182
net/batman-adv/bat_sysfs.c
net/batman-adv/bat_sysfs.c
+2
-2
net/batman-adv/bitarray.c
net/batman-adv/bitarray.c
+1
-1
net/batman-adv/gateway_client.c
net/batman-adv/gateway_client.c
+94
-59
net/batman-adv/gateway_client.h
net/batman-adv/gateway_client.h
+3
-2
net/batman-adv/gateway_common.c
net/batman-adv/gateway_common.c
+2
-2
net/batman-adv/hash.c
net/batman-adv/hash.c
+2
-2
net/batman-adv/hash.h
net/batman-adv/hash.h
+7
-6
net/batman-adv/main.h
net/batman-adv/main.h
+1
-1
net/batman-adv/originator.c
net/batman-adv/originator.c
+8
-5
net/batman-adv/originator.h
net/batman-adv/originator.h
+1
-1
net/batman-adv/routing.c
net/batman-adv/routing.c
+16
-6
net/batman-adv/soft-interface.c
net/batman-adv/soft-interface.c
+29
-14
net/batman-adv/translation-table.c
net/batman-adv/translation-table.c
+26
-74
net/batman-adv/vis.c
net/batman-adv/vis.c
+10
-7
未找到文件。
net/batman-adv/bat_sysfs.c
浏览文件 @
d6f03f29
...
...
@@ -174,7 +174,7 @@ static int store_uint_attr(const char *buff, size_t count,
unsigned
long
uint_val
;
int
ret
;
ret
=
strict_
strtoul
(
buff
,
10
,
&
uint_val
);
ret
=
k
strtoul
(
buff
,
10
,
&
uint_val
);
if
(
ret
)
{
bat_info
(
net_dev
,
"%s: Invalid parameter received: %s
\n
"
,
...
...
@@ -239,7 +239,7 @@ static ssize_t store_vis_mode(struct kobject *kobj, struct attribute *attr,
unsigned
long
val
;
int
ret
,
vis_mode_tmp
=
-
1
;
ret
=
strict_
strtoul
(
buff
,
10
,
&
val
);
ret
=
k
strtoul
(
buff
,
10
,
&
val
);
if
(((
count
==
2
)
&&
(
!
ret
)
&&
(
val
==
VIS_TYPE_CLIENT_UPDATE
))
||
(
strncmp
(
buff
,
"client"
,
6
)
==
0
)
||
...
...
net/batman-adv/bitarray.c
浏览文件 @
d6f03f29
...
...
@@ -155,7 +155,7 @@ int bit_get_packet(void *priv, unsigned long *seq_bits,
/* sequence number is much newer, probably missed a lot of packets */
if
((
seq_num_diff
>=
TQ_LOCAL_WINDOW_SIZE
)
||
(
seq_num_diff
<
EXPECTED_SEQNO_RANGE
))
{
&&
(
seq_num_diff
<
EXPECTED_SEQNO_RANGE
))
{
bat_dbg
(
DBG_BATMAN
,
bat_priv
,
"We missed a lot of packets (%i) !
\n
"
,
seq_num_diff
-
1
);
...
...
net/batman-adv/gateway_client.c
浏览文件 @
d6f03f29
...
...
@@ -25,6 +25,7 @@
#include "gateway_common.h"
#include "hard-interface.h"
#include "originator.h"
#include "translation-table.h"
#include "routing.h"
#include <linux/ip.h>
#include <linux/ipv6.h>
...
...
@@ -572,108 +573,142 @@ static bool is_type_dhcprequest(struct sk_buff *skb, int header_len)
return
ret
;
}
int
gw_is_target
(
struct
bat_priv
*
bat_priv
,
struct
sk_buff
*
skb
,
struct
orig_node
*
old_gw
)
bool
gw_is_dhcp_target
(
struct
sk_buff
*
skb
,
unsigned
int
*
header_len
)
{
struct
ethhdr
*
ethhdr
;
struct
iphdr
*
iphdr
;
struct
ipv6hdr
*
ipv6hdr
;
struct
udphdr
*
udphdr
;
struct
gw_node
*
curr_gw
;
struct
neigh_node
*
neigh_curr
=
NULL
,
*
neigh_old
=
NULL
;
unsigned
int
header_len
=
0
;
int
ret
=
1
;
if
(
atomic_read
(
&
bat_priv
->
gw_mode
)
==
GW_MODE_OFF
)
return
0
;
/* check for ethernet header */
if
(
!
pskb_may_pull
(
skb
,
header_len
+
ETH_HLEN
))
return
0
;
if
(
!
pskb_may_pull
(
skb
,
*
header_len
+
ETH_HLEN
))
return
false
;
ethhdr
=
(
struct
ethhdr
*
)
skb
->
data
;
header_len
+=
ETH_HLEN
;
*
header_len
+=
ETH_HLEN
;
/* check for initial vlan header */
if
(
ntohs
(
ethhdr
->
h_proto
)
==
ETH_P_8021Q
)
{
if
(
!
pskb_may_pull
(
skb
,
header_len
+
VLAN_HLEN
))
return
0
;
if
(
!
pskb_may_pull
(
skb
,
*
header_len
+
VLAN_HLEN
))
return
false
;
ethhdr
=
(
struct
ethhdr
*
)(
skb
->
data
+
VLAN_HLEN
);
header_len
+=
VLAN_HLEN
;
*
header_len
+=
VLAN_HLEN
;
}
/* check for ip header */
switch
(
ntohs
(
ethhdr
->
h_proto
))
{
case
ETH_P_IP
:
if
(
!
pskb_may_pull
(
skb
,
header_len
+
sizeof
(
*
iphdr
)))
return
0
;
iphdr
=
(
struct
iphdr
*
)(
skb
->
data
+
header_len
);
header_len
+=
iphdr
->
ihl
*
4
;
if
(
!
pskb_may_pull
(
skb
,
*
header_len
+
sizeof
(
*
iphdr
)))
return
false
;
iphdr
=
(
struct
iphdr
*
)(
skb
->
data
+
*
header_len
);
*
header_len
+=
iphdr
->
ihl
*
4
;
/* check for udp header */
if
(
iphdr
->
protocol
!=
IPPROTO_UDP
)
return
0
;
return
false
;
break
;
case
ETH_P_IPV6
:
if
(
!
pskb_may_pull
(
skb
,
header_len
+
sizeof
(
*
ipv6hdr
)))
return
0
;
ipv6hdr
=
(
struct
ipv6hdr
*
)(
skb
->
data
+
header_len
);
header_len
+=
sizeof
(
*
ipv6hdr
);
if
(
!
pskb_may_pull
(
skb
,
*
header_len
+
sizeof
(
*
ipv6hdr
)))
return
false
;
ipv6hdr
=
(
struct
ipv6hdr
*
)(
skb
->
data
+
*
header_len
);
*
header_len
+=
sizeof
(
*
ipv6hdr
);
/* check for udp header */
if
(
ipv6hdr
->
nexthdr
!=
IPPROTO_UDP
)
return
0
;
return
false
;
break
;
default:
return
0
;
return
false
;
}
if
(
!
pskb_may_pull
(
skb
,
header_len
+
sizeof
(
*
udphdr
)))
return
0
;
udphdr
=
(
struct
udphdr
*
)(
skb
->
data
+
header_len
);
header_len
+=
sizeof
(
*
udphdr
);
if
(
!
pskb_may_pull
(
skb
,
*
header_len
+
sizeof
(
*
udphdr
)))
return
false
;
udphdr
=
(
struct
udphdr
*
)(
skb
->
data
+
*
header_len
);
*
header_len
+=
sizeof
(
*
udphdr
);
/* check for bootp port */
if
((
ntohs
(
ethhdr
->
h_proto
)
==
ETH_P_IP
)
&&
(
ntohs
(
udphdr
->
dest
)
!=
67
))
return
0
;
return
false
;
if
((
ntohs
(
ethhdr
->
h_proto
)
==
ETH_P_IPV6
)
&&
(
ntohs
(
udphdr
->
dest
)
!=
547
))
return
0
;
return
false
;
return
true
;
}
if
(
atomic_read
(
&
bat_priv
->
gw_mode
)
==
GW_MODE_SERVER
)
return
-
1
;
bool
gw_out_of_range
(
struct
bat_priv
*
bat_priv
,
struct
sk_buff
*
skb
,
struct
ethhdr
*
ethhdr
)
{
struct
neigh_node
*
neigh_curr
=
NULL
,
*
neigh_old
=
NULL
;
struct
orig_node
*
orig_dst_node
=
NULL
;
struct
gw_node
*
curr_gw
=
NULL
;
bool
ret
,
out_of_range
=
false
;
unsigned
int
header_len
=
0
;
uint8_t
curr_tq_avg
;
ret
=
gw_is_dhcp_target
(
skb
,
&
header_len
);
if
(
!
ret
)
goto
out
;
orig_dst_node
=
transtable_search
(
bat_priv
,
ethhdr
->
h_source
,
ethhdr
->
h_dest
);
if
(
!
orig_dst_node
)
goto
out
;
if
(
!
orig_dst_node
->
gw_flags
)
goto
out
;
ret
=
is_type_dhcprequest
(
skb
,
header_len
);
if
(
!
ret
)
goto
out
;
switch
(
atomic_read
(
&
bat_priv
->
gw_mode
))
{
case
GW_MODE_SERVER
:
/* If we are a GW then we are our best GW. We can artificially
* set the tq towards ourself as the maximum value */
curr_tq_avg
=
TQ_MAX_VALUE
;
break
;
case
GW_MODE_CLIENT
:
curr_gw
=
gw_get_selected_gw_node
(
bat_priv
);
if
(
!
curr_gw
)
return
0
;
goto
out
;
/* packet is going to our gateway */
if
(
curr_gw
->
orig_node
==
orig_dst_node
)
goto
out
;
/* If old_gw != NULL then this packet is unicast.
* So, at this point we have to check the message type: if it is a
* DHCPREQUEST we have to decide whether to drop it or not */
if
(
old_gw
&&
curr_gw
->
orig_node
!=
old_gw
)
{
if
(
is_type_dhcprequest
(
skb
,
header_len
))
{
/* If the dhcp packet has been sent to a different gw,
* we have to evaluate whether the old gw is still
* reliable enough */
neigh_curr
=
find_router
(
bat_priv
,
curr_gw
->
orig_node
,
NULL
);
neigh_old
=
find_router
(
bat_priv
,
old_gw
,
NULL
)
;
if
(
!
neigh_curr
||
!
neigh_old
)
goto
free_neigh
;
if
(
neigh_curr
->
tq_avg
-
neigh_old
->
tq_avg
<
GW_THRESHOLD
)
ret
=
-
1
;
}
neigh_curr
=
find_router
(
bat_priv
,
curr_gw
->
orig_node
,
NULL
);
if
(
!
neigh_curr
)
goto
out
;
curr_tq_avg
=
neigh_curr
->
tq_avg
;
break
;
case
GW_MODE_OFF
:
default:
goto
out
;
}
free_neigh:
neigh_old
=
find_router
(
bat_priv
,
orig_dst_node
,
NULL
);
if
(
!!
neigh_old
)
goto
out
;
if
(
curr_tq_avg
-
neigh_old
->
tq_avg
>
GW_THRESHOLD
)
out_of_range
=
true
;
out:
if
(
orig_dst_node
)
orig_node_free_ref
(
orig_dst_node
);
if
(
curr_gw
)
gw_node_free_ref
(
curr_gw
);
if
(
neigh_old
)
neigh_node_free_ref
(
neigh_old
);
if
(
neigh_curr
)
neigh_node_free_ref
(
neigh_curr
);
if
(
curr_gw
)
gw_node_free_ref
(
curr_gw
);
return
ret
;
return
out_of_range
;
}
net/batman-adv/gateway_client.h
浏览文件 @
d6f03f29
...
...
@@ -31,7 +31,8 @@ void gw_node_update(struct bat_priv *bat_priv,
void
gw_node_delete
(
struct
bat_priv
*
bat_priv
,
struct
orig_node
*
orig_node
);
void
gw_node_purge
(
struct
bat_priv
*
bat_priv
);
int
gw_client_seq_print_text
(
struct
seq_file
*
seq
,
void
*
offset
);
int
gw_is_target
(
struct
bat_priv
*
bat_priv
,
struct
sk_buff
*
skb
,
struct
orig_node
*
old_gw
);
bool
gw_is_dhcp_target
(
struct
sk_buff
*
skb
,
unsigned
int
*
header_len
);
bool
gw_out_of_range
(
struct
bat_priv
*
bat_priv
,
struct
sk_buff
*
skb
,
struct
ethhdr
*
ethhdr
);
#endif
/* _NET_BATMAN_ADV_GATEWAY_CLIENT_H_ */
net/batman-adv/gateway_common.c
浏览文件 @
d6f03f29
...
...
@@ -97,7 +97,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff,
*
tmp_ptr
=
'\0'
;
}
ret
=
strict_
strtol
(
buff
,
10
,
&
ldown
);
ret
=
k
strtol
(
buff
,
10
,
&
ldown
);
if
(
ret
)
{
bat_err
(
net_dev
,
"Download speed of gateway mode invalid: %s
\n
"
,
...
...
@@ -122,7 +122,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff,
*
tmp_ptr
=
'\0'
;
}
ret
=
strict_
strtol
(
slash_ptr
+
1
,
10
,
&
lup
);
ret
=
k
strtol
(
slash_ptr
+
1
,
10
,
&
lup
);
if
(
ret
)
{
bat_err
(
net_dev
,
"Upload speed of gateway mode invalid: "
...
...
net/batman-adv/hash.c
浏览文件 @
d6f03f29
...
...
@@ -25,7 +25,7 @@
/* clears the hash */
static
void
hash_init
(
struct
hashtable_t
*
hash
)
{
in
t
i
;
uint32_
t
i
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
INIT_HLIST_HEAD
(
&
hash
->
table
[
i
]);
...
...
@@ -42,7 +42,7 @@ void hash_destroy(struct hashtable_t *hash)
}
/* allocates and clears the hash */
struct
hashtable_t
*
hash_new
(
in
t
size
)
struct
hashtable_t
*
hash_new
(
uint32_
t
size
)
{
struct
hashtable_t
*
hash
;
...
...
net/batman-adv/hash.h
浏览文件 @
d6f03f29
...
...
@@ -33,17 +33,17 @@ typedef int (*hashdata_compare_cb)(const struct hlist_node *, const void *);
/* the hashfunction, should return an index
* based on the key in the data of the first
* argument and the size the second */
typedef
int
(
*
hashdata_choose_cb
)(
const
void
*
,
in
t
);
typedef
uint32_t
(
*
hashdata_choose_cb
)(
const
void
*
,
uint32_
t
);
typedef
void
(
*
hashdata_free_cb
)(
struct
hlist_node
*
,
void
*
);
struct
hashtable_t
{
struct
hlist_head
*
table
;
/* the hashtable itself with the buckets */
spinlock_t
*
list_locks
;
/* spinlock for each hash list entry */
in
t
size
;
/* size of hashtable */
uint32_
t
size
;
/* size of hashtable */
};
/* allocates and clears the hash */
struct
hashtable_t
*
hash_new
(
in
t
size
);
struct
hashtable_t
*
hash_new
(
uint32_
t
size
);
/* free only the hashtable and the hash itself. */
void
hash_destroy
(
struct
hashtable_t
*
hash
);
...
...
@@ -57,7 +57,7 @@ static inline void hash_delete(struct hashtable_t *hash,
struct
hlist_head
*
head
;
struct
hlist_node
*
node
,
*
node_tmp
;
spinlock_t
*
list_lock
;
/* spinlock to protect write access */
in
t
i
;
uint32_
t
i
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
...
...
@@ -93,7 +93,8 @@ static inline int hash_add(struct hashtable_t *hash,
hashdata_choose_cb
choose
,
const
void
*
data
,
struct
hlist_node
*
data_node
)
{
int
index
,
ret
=
-
1
;
uint32_t
index
;
int
ret
=
-
1
;
struct
hlist_head
*
head
;
struct
hlist_node
*
node
;
spinlock_t
*
list_lock
;
/* spinlock to protect write access */
...
...
@@ -137,7 +138,7 @@ static inline void *hash_remove(struct hashtable_t *hash,
hashdata_compare_cb
compare
,
hashdata_choose_cb
choose
,
void
*
data
)
{
size
_t
index
;
uint32
_t
index
;
struct
hlist_node
*
node
;
struct
hlist_head
*
head
;
void
*
data_save
=
NULL
;
...
...
net/batman-adv/main.h
浏览文件 @
d6f03f29
...
...
@@ -28,7 +28,7 @@
#define DRIVER_DEVICE "batman-adv"
#ifndef SOURCE_VERSION
#define SOURCE_VERSION "201
1.4
.0"
#define SOURCE_VERSION "201
2.0
.0"
#endif
/* B.A.T.M.A.N. parameters */
...
...
net/batman-adv/originator.c
浏览文件 @
d6f03f29
...
...
@@ -164,7 +164,7 @@ void originator_free(struct bat_priv *bat_priv)
struct
hlist_head
*
head
;
spinlock_t
*
list_lock
;
/* spinlock to protect write access */
struct
orig_node
*
orig_node
;
in
t
i
;
uint32_
t
i
;
if
(
!
hash
)
return
;
...
...
@@ -350,7 +350,7 @@ static void _purge_orig(struct bat_priv *bat_priv)
struct
hlist_head
*
head
;
spinlock_t
*
list_lock
;
/* spinlock to protect write access */
struct
orig_node
*
orig_node
;
in
t
i
;
uint32_
t
i
;
if
(
!
hash
)
return
;
...
...
@@ -413,7 +413,8 @@ int orig_seq_print_text(struct seq_file *seq, void *offset)
int
batman_count
=
0
;
int
last_seen_secs
;
int
last_seen_msecs
;
int
i
,
ret
=
0
;
uint32_t
i
;
int
ret
=
0
;
primary_if
=
primary_if_get_selected
(
bat_priv
);
...
...
@@ -519,7 +520,8 @@ int orig_hash_add_if(struct hard_iface *hard_iface, int max_if_num)
struct
hlist_node
*
node
;
struct
hlist_head
*
head
;
struct
orig_node
*
orig_node
;
int
i
,
ret
;
uint32_t
i
;
int
ret
;
/* resize all orig nodes because orig_node->bcast_own(_sum) depend on
* if_num */
...
...
@@ -601,7 +603,8 @@ int orig_hash_del_if(struct hard_iface *hard_iface, int max_if_num)
struct
hlist_head
*
head
;
struct
hard_iface
*
hard_iface_tmp
;
struct
orig_node
*
orig_node
;
int
i
,
ret
;
uint32_t
i
;
int
ret
;
/* resize all orig nodes because orig_node->bcast_own(_sum) depend on
* if_num */
...
...
net/batman-adv/originator.h
浏览文件 @
d6f03f29
...
...
@@ -42,7 +42,7 @@ int orig_hash_del_if(struct hard_iface *hard_iface, int max_if_num);
/* hashfunction to choose an entry in a hash table of given size */
/* hash algorithm from http://en.wikipedia.org/wiki/Hash_table */
static
inline
int
choose_orig
(
const
void
*
data
,
int32_t
size
)
static
inline
uint32_t
choose_orig
(
const
void
*
data
,
u
int32_t
size
)
{
const
unsigned
char
*
key
=
data
;
uint32_t
hash
=
0
;
...
...
net/batman-adv/routing.c
浏览文件 @
d6f03f29
...
...
@@ -39,7 +39,7 @@ void slide_own_bcast_window(struct hard_iface *hard_iface)
struct
hlist_head
*
head
;
struct
orig_node
*
orig_node
;
unsigned
long
*
word
;
in
t
i
;
uint32_
t
i
;
size_t
word_index
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
...
...
@@ -578,6 +578,7 @@ int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)
{
struct
bat_priv
*
bat_priv
=
netdev_priv
(
recv_if
->
soft_iface
);
struct
tt_query_packet
*
tt_query
;
uint16_t
tt_len
;
struct
ethhdr
*
ethhdr
;
/* drop packet if it has not necessary minimum size */
...
...
@@ -616,13 +617,22 @@ int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)
}
break
;
case
TT_RESPONSE
:
/* packet needs to be linearized to access the TT changes */
if
(
is_my_mac
(
tt_query
->
dst
))
{
/* packet needs to be linearized to access the TT
* changes */
if
(
skb_linearize
(
skb
)
<
0
)
goto
out
;
if
(
is_my_mac
(
tt_query
->
dst
))
tt_len
=
tt_query
->
tt_data
*
sizeof
(
struct
tt_change
);
/* Ensure we have all the claimed data */
if
(
unlikely
(
skb_headlen
(
skb
)
<
sizeof
(
struct
tt_query_packet
)
+
tt_len
))
goto
out
;
handle_tt_response
(
bat_priv
,
tt_query
);
else
{
}
else
{
bat_dbg
(
DBG_TT
,
bat_priv
,
"Routing TT_RESPONSE to %pM [%c]
\n
"
,
tt_query
->
dst
,
...
...
net/batman-adv/soft-interface.c
浏览文件 @
d6f03f29
...
...
@@ -563,10 +563,10 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
struct
bcast_packet
*
bcast_packet
;
struct
vlan_ethhdr
*
vhdr
;
struct
softif_neigh
*
curr_softif_neigh
=
NULL
;
struct
orig_node
*
orig_node
=
NULL
;
unsigned
int
header_len
=
0
;
int
data_len
=
skb
->
len
,
ret
;
short
vid
=
-
1
;
bool
do_bcast
;
bool
do_bcast
=
false
;
if
(
atomic_read
(
&
bat_priv
->
mesh_state
)
!=
MESH_ACTIVE
)
goto
dropped
;
...
...
@@ -598,17 +598,28 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
/* Register the client MAC in the transtable */
tt_local_add
(
soft_iface
,
ethhdr
->
h_source
,
skb
->
skb_iif
);
orig_node
=
transtable_search
(
bat_priv
,
ethhdr
->
h_source
,
ethhdr
->
h_dest
);
do_bcast
=
is_multicast_ether_addr
(
ethhdr
->
h_dest
);
if
(
do_bcast
||
(
orig_node
&&
orig_node
->
gw_flags
))
{
ret
=
gw_is_target
(
bat_priv
,
skb
,
orig_node
);
if
(
is_multicast_ether_addr
(
ethhdr
->
h_dest
))
{
do_bcast
=
true
;
if
(
ret
<
0
)
switch
(
atomic_read
(
&
bat_priv
->
gw_mode
))
{
case
GW_MODE_SERVER
:
/* gateway servers should not send dhcp
* requests into the mesh */
ret
=
gw_is_dhcp_target
(
skb
,
&
header_len
);
if
(
ret
)
goto
dropped
;
break
;
case
GW_MODE_CLIENT
:
/* gateway clients should send dhcp requests
* via unicast to their gateway */
ret
=
gw_is_dhcp_target
(
skb
,
&
header_len
);
if
(
ret
)
do_bcast
=
false
;
break
;
case
GW_MODE_OFF
:
default:
break
;
}
}
/* ethernet packet should be broadcasted */
...
...
@@ -644,6 +655,12 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
/* unicast packet */
}
else
{
if
(
atomic_read
(
&
bat_priv
->
gw_mode
)
!=
GW_MODE_OFF
)
{
ret
=
gw_out_of_range
(
bat_priv
,
skb
,
ethhdr
);
if
(
ret
)
goto
dropped
;
}
ret
=
unicast_send_skb
(
skb
,
bat_priv
);
if
(
ret
!=
0
)
goto
dropped_freed
;
...
...
@@ -662,8 +679,6 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
softif_neigh_free_ref
(
curr_softif_neigh
);
if
(
primary_if
)
hardif_free_ref
(
primary_if
);
if
(
orig_node
)
orig_node_free_ref
(
orig_node
);
return
NETDEV_TX_OK
;
}
...
...
net/batman-adv/translation-table.c
浏览文件 @
d6f03f29
...
...
@@ -67,7 +67,7 @@ static struct tt_local_entry *tt_local_hash_find(struct bat_priv *bat_priv,
struct
hlist_head
*
head
;
struct
hlist_node
*
node
;
struct
tt_local_entry
*
tt_local_entry
,
*
tt_local_entry_tmp
=
NULL
;
in
t
index
;
uint32_
t
index
;
if
(
!
hash
)
return
NULL
;
...
...
@@ -99,7 +99,7 @@ static struct tt_global_entry *tt_global_hash_find(struct bat_priv *bat_priv,
struct
hlist_node
*
node
;
struct
tt_global_entry
*
tt_global_entry
;
struct
tt_global_entry
*
tt_global_entry_tmp
=
NULL
;
in
t
index
;
uint32_
t
index
;
if
(
!
hash
)
return
NULL
;
...
...
@@ -314,9 +314,8 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)
struct
hard_iface
*
primary_if
;
struct
hlist_node
*
node
;
struct
hlist_head
*
head
;
size_t
buf_size
,
pos
;
char
*
buff
;
int
i
,
ret
=
0
;
uint32_t
i
;
int
ret
=
0
;
primary_if
=
primary_if_get_selected
(
bat_priv
);
if
(
!
primary_if
)
{
...
...
@@ -337,34 +336,13 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)
"announced via TT (TTVN: %u):
\n
"
,
net_dev
->
name
,
(
uint8_t
)
atomic_read
(
&
bat_priv
->
ttvn
));
buf_size
=
1
;
/* Estimate length for: " * xx:xx:xx:xx:xx:xx\n" */
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
rcu_read_lock
();
__hlist_for_each_rcu
(
node
,
head
)
buf_size
+=
29
;
rcu_read_unlock
();
}
buff
=
kmalloc
(
buf_size
,
GFP_ATOMIC
);
if
(
!
buff
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
buff
[
0
]
=
'\0'
;
pos
=
0
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
rcu_read_lock
();
hlist_for_each_entry_rcu
(
tt_local_entry
,
node
,
head
,
hash_entry
)
{
pos
+=
snprintf
(
buff
+
pos
,
30
,
" * %pM "
"[%c%c%c%c%c]
\n
"
,
seq_printf
(
seq
,
" * %pM [%c%c%c%c%c]
\n
"
,
tt_local_entry
->
addr
,
(
tt_local_entry
->
flags
&
TT_CLIENT_ROAM
?
'R'
:
'.'
),
...
...
@@ -379,9 +357,6 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)
}
rcu_read_unlock
();
}
seq_printf
(
seq
,
"%s"
,
buff
);
kfree
(
buff
);
out:
if
(
primary_if
)
hardif_free_ref
(
primary_if
);
...
...
@@ -427,7 +402,7 @@ static void tt_local_purge(struct bat_priv *bat_priv)
struct
hlist_node
*
node
,
*
node_tmp
;
struct
hlist_head
*
head
;
spinlock_t
*
list_lock
;
/* protects write access to the hash lists */
in
t
i
;
uint32_
t
i
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
...
...
@@ -465,7 +440,7 @@ static void tt_local_table_free(struct bat_priv *bat_priv)
struct
tt_local_entry
*
tt_local_entry
;
struct
hlist_node
*
node
,
*
node_tmp
;
struct
hlist_head
*
head
;
in
t
i
;
uint32_
t
i
;
if
(
!
bat_priv
->
tt_local_hash
)
return
;
...
...
@@ -590,9 +565,8 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)
struct
hard_iface
*
primary_if
;
struct
hlist_node
*
node
;
struct
hlist_head
*
head
;
size_t
buf_size
,
pos
;
char
*
buff
;
int
i
,
ret
=
0
;
uint32_t
i
;
int
ret
=
0
;
primary_if
=
primary_if_get_selected
(
bat_priv
);
if
(
!
primary_if
)
{
...
...
@@ -615,35 +589,13 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)
seq_printf
(
seq
,
" %-13s %s %-15s %s %s
\n
"
,
"Client"
,
"(TTVN)"
,
"Originator"
,
"(Curr TTVN)"
,
"Flags"
);
buf_size
=
1
;
/* Estimate length for: " * xx:xx:xx:xx:xx:xx (ttvn) via
* xx:xx:xx:xx:xx:xx (cur_ttvn)\n"*/
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
rcu_read_lock
();
__hlist_for_each_rcu
(
node
,
head
)
buf_size
+=
67
;
rcu_read_unlock
();
}
buff
=
kmalloc
(
buf_size
,
GFP_ATOMIC
);
if
(
!
buff
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
buff
[
0
]
=
'\0'
;
pos
=
0
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
rcu_read_lock
();
hlist_for_each_entry_rcu
(
tt_global_entry
,
node
,
head
,
hash_entry
)
{
pos
+=
snprintf
(
buff
+
pos
,
69
,
" * %pM (%3u) via %pM (%3u) "
seq_printf
(
seq
,
" * %pM (%3u) via %pM (%3u) "
"[%c%c%c]
\n
"
,
tt_global_entry
->
addr
,
tt_global_entry
->
ttvn
,
tt_global_entry
->
orig_node
->
orig
,
...
...
@@ -659,9 +611,6 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)
}
rcu_read_unlock
();
}
seq_printf
(
seq
,
"%s"
,
buff
);
kfree
(
buff
);
out:
if
(
primary_if
)
hardif_free_ref
(
primary_if
);
...
...
@@ -716,7 +665,7 @@ void tt_global_del_orig(struct bat_priv *bat_priv,
struct
orig_node
*
orig_node
,
const
char
*
message
)
{
struct
tt_global_entry
*
tt_global_entry
;
in
t
i
;
uint32_
t
i
;
struct
hashtable_t
*
hash
=
bat_priv
->
tt_global_hash
;
struct
hlist_node
*
node
,
*
safe
;
struct
hlist_head
*
head
;
...
...
@@ -735,9 +684,10 @@ void tt_global_del_orig(struct bat_priv *bat_priv,
if
(
tt_global_entry
->
orig_node
==
orig_node
)
{
bat_dbg
(
DBG_TT
,
bat_priv
,
"Deleting global tt entry %pM "
"(via %pM):
originator time out
\n
"
,
"(via %pM):
%s
\n
"
,
tt_global_entry
->
addr
,
tt_global_entry
->
orig_node
->
orig
);
tt_global_entry
->
orig_node
->
orig
,
message
);
hlist_del_rcu
(
node
);
tt_global_entry_free_ref
(
tt_global_entry
);
}
...
...
@@ -754,7 +704,7 @@ static void tt_global_roam_purge(struct bat_priv *bat_priv)
struct
hlist_node
*
node
,
*
node_tmp
;
struct
hlist_head
*
head
;
spinlock_t
*
list_lock
;
/* protects write access to the hash lists */
in
t
i
;
uint32_
t
i
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
...
...
@@ -788,7 +738,7 @@ static void tt_global_table_free(struct bat_priv *bat_priv)
struct
tt_global_entry
*
tt_global_entry
;
struct
hlist_node
*
node
,
*
node_tmp
;
struct
hlist_head
*
head
;
in
t
i
;
uint32_
t
i
;
if
(
!
bat_priv
->
tt_global_hash
)
return
;
...
...
@@ -874,7 +824,8 @@ uint16_t tt_global_crc(struct bat_priv *bat_priv, struct orig_node *orig_node)
struct
tt_global_entry
*
tt_global_entry
;
struct
hlist_node
*
node
;
struct
hlist_head
*
head
;
int
i
,
j
;
uint32_t
i
;
int
j
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
...
...
@@ -911,7 +862,8 @@ uint16_t tt_local_crc(struct bat_priv *bat_priv)
struct
tt_local_entry
*
tt_local_entry
;
struct
hlist_node
*
node
;
struct
hlist_head
*
head
;
int
i
,
j
;
uint32_t
i
;
int
j
;
for
(
i
=
0
;
i
<
hash
->
size
;
i
++
)
{
head
=
&
hash
->
table
[
i
];
...
...
@@ -1048,7 +1000,7 @@ static struct sk_buff *tt_response_fill_table(uint16_t tt_len, uint8_t ttvn,
struct
sk_buff
*
skb
=
NULL
;
uint16_t
tt_tot
,
tt_count
;
ssize_t
tt_query_size
=
sizeof
(
struct
tt_query_packet
);
in
t
i
;
uint32_
t
i
;
if
(
tt_query_size
+
tt_len
>
primary_if
->
soft_iface
->
mtu
)
{
tt_len
=
primary_if
->
soft_iface
->
mtu
-
tt_query_size
;
...
...
@@ -1187,11 +1139,11 @@ static bool send_other_tt_response(struct bat_priv *bat_priv,
(
tt_request
->
flags
&
TT_FULL_TABLE
?
'F'
:
'.'
));
/* Let's get the orig node of the REAL destination */
req_dst_orig_node
=
get_orig_node
(
bat_priv
,
tt_request
->
dst
);
req_dst_orig_node
=
orig_hash_find
(
bat_priv
,
tt_request
->
dst
);
if
(
!
req_dst_orig_node
)
goto
out
;
res_dst_orig_node
=
get_orig_node
(
bat_priv
,
tt_request
->
src
);
res_dst_orig_node
=
orig_hash_find
(
bat_priv
,
tt_request
->
src
);
if
(
!
res_dst_orig_node
)
goto
out
;
...
...
@@ -1317,7 +1269,7 @@ static bool send_my_tt_response(struct bat_priv *bat_priv,
my_ttvn
=
(
uint8_t
)
atomic_read
(
&
bat_priv
->
ttvn
);
req_ttvn
=
tt_request
->
ttvn
;
orig_node
=
get_orig_node
(
bat_priv
,
tt_request
->
src
);
orig_node
=
orig_hash_find
(
bat_priv
,
tt_request
->
src
);
if
(
!
orig_node
)
goto
out
;
...
...
@@ -1725,7 +1677,7 @@ void tt_free(struct bat_priv *bat_priv)
* entry */
static
void
tt_local_reset_flags
(
struct
bat_priv
*
bat_priv
,
uint16_t
flags
)
{
in
t
i
;
uint32_
t
i
;
struct
hashtable_t
*
hash
=
bat_priv
->
tt_local_hash
;
struct
hlist_head
*
head
;
struct
hlist_node
*
node
;
...
...
@@ -1758,7 +1710,7 @@ static void tt_local_purge_pending_clients(struct bat_priv *bat_priv)
struct
hlist_node
*
node
,
*
node_tmp
;
struct
hlist_head
*
head
;
spinlock_t
*
list_lock
;
/* protects write access to the hash lists */
in
t
i
;
uint32_
t
i
;
if
(
!
hash
)
return
;
...
...
net/batman-adv/vis.c
浏览文件 @
d6f03f29
...
...
@@ -66,7 +66,7 @@ static int vis_info_cmp(const struct hlist_node *node, const void *data2)
/* hash function to choose an entry in a hash table of given size */
/* hash algorithm from http://en.wikipedia.org/wiki/Hash_table */
static
int
vis_info_choose
(
const
void
*
data
,
in
t
size
)
static
uint32_t
vis_info_choose
(
const
void
*
data
,
uint32_
t
size
)
{
const
struct
vis_info
*
vis_info
=
data
;
const
struct
vis_packet
*
packet
;
...
...
@@ -96,7 +96,7 @@ static struct vis_info *vis_hash_find(struct bat_priv *bat_priv,
struct
hlist_head
*
head
;
struct
hlist_node
*
node
;
struct
vis_info
*
vis_info
,
*
vis_info_tmp
=
NULL
;
in
t
index
;
uint32_
t
index
;
if
(
!
hash
)
return
NULL
;
...
...
@@ -202,7 +202,8 @@ int vis_seq_print_text(struct seq_file *seq, void *offset)
HLIST_HEAD
(
vis_if_list
);
struct
if_list_entry
*
entry
;
struct
hlist_node
*
pos
,
*
n
;
int
i
,
j
,
ret
=
0
;
uint32_t
i
;
int
j
,
ret
=
0
;
int
vis_server
=
atomic_read
(
&
bat_priv
->
vis_mode
);
size_t
buff_pos
,
buf_size
;
char
*
buff
;
...
...
@@ -556,7 +557,8 @@ static int find_best_vis_server(struct bat_priv *bat_priv,
struct
hlist_head
*
head
;
struct
orig_node
*
orig_node
;
struct
vis_packet
*
packet
;
int
best_tq
=
-
1
,
i
;
int
best_tq
=
-
1
;
uint32_t
i
;
packet
=
(
struct
vis_packet
*
)
info
->
skb_packet
->
data
;
...
...
@@ -608,7 +610,8 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
struct
vis_packet
*
packet
=
(
struct
vis_packet
*
)
info
->
skb_packet
->
data
;
struct
vis_info_entry
*
entry
;
struct
tt_local_entry
*
tt_local_entry
;
int
best_tq
=
-
1
,
i
;
int
best_tq
=
-
1
;
uint32_t
i
;
info
->
first_seen
=
jiffies
;
packet
->
vis_type
=
atomic_read
(
&
bat_priv
->
vis_mode
);
...
...
@@ -696,7 +699,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
* held */
static
void
purge_vis_packets
(
struct
bat_priv
*
bat_priv
)
{
in
t
i
;
uint32_
t
i
;
struct
hashtable_t
*
hash
=
bat_priv
->
vis_hash
;
struct
hlist_node
*
node
,
*
node_tmp
;
struct
hlist_head
*
head
;
...
...
@@ -733,7 +736,7 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv,
struct
sk_buff
*
skb
;
struct
hard_iface
*
hard_iface
;
uint8_t
dstaddr
[
ETH_ALEN
];
in
t
i
;
uint32_
t
i
;
packet
=
(
struct
vis_packet
*
)
info
->
skb_packet
->
data
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录