Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
d6f03f29
Commit
d6f03f29
authored
Nov 26, 2011
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for_david' of
git://git.open-mesh.org/linux-merge
parents
6f39da2c
76e8d7b0
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
202 additions
and
182 deletions
+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
No files found.
net/batman-adv/bat_sysfs.c
View file @
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
View file @
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
View file @
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
;
if
(
atomic_read
(
&
bat_priv
->
gw_mode
)
==
GW_MODE_SERVER
)
return
-
1
;
return
true
;
}
curr_gw
=
gw_get_selected_gw_node
(
bat_priv
);
if
(
!
curr_gw
)
return
0
;
/* 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
;
}
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
)
goto
out
;
/* packet is going to our gateway */
if
(
curr_gw
->
orig_node
==
orig_dst_node
)
goto
out
;
/* 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
);
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
(
skb_linearize
(
skb
)
<
0
)
goto
out
;
if
(
is_my_mac
(
tt_query
->
dst
))
{
/* packet needs to be linearized to access the TT
* changes */
if
(
skb_linearize
(
skb
)
<
0
)
goto
out
;
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
;
if
(
is_my_mac
(
tt_query
->
dst
))
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
View file @
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
)
goto
dropped
;
if
(
ret
)
do_bcast
=
false
;
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
View file @
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
View file @
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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment