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
9591a79f
Commit
9591a79f
authored
Dec 12, 2010
by
Marek Lindner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
batman-adv: convert neighbor list to hlist
Signed-off-by:
Marek Lindner
<
lindner_marek@yahoo.de
>
parent
a8e7f4bc
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
35 additions
and
28 deletions
+35
-28
net/batman-adv/originator.c
net/batman-adv/originator.c
+15
-15
net/batman-adv/routing.c
net/batman-adv/routing.c
+18
-11
net/batman-adv/types.h
net/batman-adv/types.h
+2
-2
No files found.
net/batman-adv/originator.c
View file @
9591a79f
...
@@ -82,29 +82,28 @@ struct neigh_node *create_neighbor(struct orig_node *orig_node,
...
@@ -82,29 +82,28 @@ struct neigh_node *create_neighbor(struct orig_node *orig_node,
if
(
!
neigh_node
)
if
(
!
neigh_node
)
return
NULL
;
return
NULL
;
INIT_
LIST_HEAD
(
&
neigh_node
->
list
);
INIT_
HLIST_NODE
(
&
neigh_node
->
list
);
memcpy
(
neigh_node
->
addr
,
neigh
,
ETH_ALEN
);
memcpy
(
neigh_node
->
addr
,
neigh
,
ETH_ALEN
);
neigh_node
->
orig_node
=
orig_neigh_node
;
neigh_node
->
orig_node
=
orig_neigh_node
;
neigh_node
->
if_incoming
=
if_incoming
;
neigh_node
->
if_incoming
=
if_incoming
;
kref_init
(
&
neigh_node
->
refcount
);
kref_init
(
&
neigh_node
->
refcount
);
list_add_tail
(
&
neigh_node
->
list
,
&
orig_node
->
neigh_list
);
hlist_add_head
(
&
neigh_node
->
list
,
&
orig_node
->
neigh_list
);
return
neigh_node
;
return
neigh_node
;
}
}
static
void
free_orig_node
(
void
*
data
,
void
*
arg
)
static
void
free_orig_node
(
void
*
data
,
void
*
arg
)
{
{
struct
list_head
*
list_pos
,
*
list_pos
_tmp
;
struct
hlist_node
*
node
,
*
node
_tmp
;
struct
neigh_node
*
neigh_node
;
struct
neigh_node
*
neigh_node
;
struct
orig_node
*
orig_node
=
(
struct
orig_node
*
)
data
;
struct
orig_node
*
orig_node
=
(
struct
orig_node
*
)
data
;
struct
bat_priv
*
bat_priv
=
(
struct
bat_priv
*
)
arg
;
struct
bat_priv
*
bat_priv
=
(
struct
bat_priv
*
)
arg
;
/* for all neighbors towards this originator ... */
/* for all neighbors towards this originator ... */
list_for_each_safe
(
list_pos
,
list_pos_tmp
,
&
orig_node
->
neigh_list
)
{
hlist_for_each_entry_safe
(
neigh_node
,
node
,
node_tmp
,
neigh_node
=
list_entry
(
list_pos
,
struct
neigh_node
,
list
);
&
orig_node
->
neigh_list
,
list
)
{
hlist_del
(
&
neigh_node
->
list
);
list_del
(
list_pos
);
kref_put
(
&
neigh_node
->
refcount
,
neigh_node_free_ref
);
kref_put
(
&
neigh_node
->
refcount
,
neigh_node_free_ref
);
}
}
...
@@ -151,7 +150,7 @@ struct orig_node *get_orig_node(struct bat_priv *bat_priv, uint8_t *addr)
...
@@ -151,7 +150,7 @@ struct orig_node *get_orig_node(struct bat_priv *bat_priv, uint8_t *addr)
if
(
!
orig_node
)
if
(
!
orig_node
)
return
NULL
;
return
NULL
;
INIT_LIST_HEAD
(
&
orig_node
->
neigh_list
);
INIT_
H
LIST_HEAD
(
&
orig_node
->
neigh_list
);
memcpy
(
orig_node
->
orig
,
addr
,
ETH_ALEN
);
memcpy
(
orig_node
->
orig
,
addr
,
ETH_ALEN
);
orig_node
->
router
=
NULL
;
orig_node
->
router
=
NULL
;
...
@@ -195,15 +194,15 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
...
@@ -195,15 +194,15 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
struct
orig_node
*
orig_node
,
struct
orig_node
*
orig_node
,
struct
neigh_node
**
best_neigh_node
)
struct
neigh_node
**
best_neigh_node
)
{
{
struct
list_head
*
list_pos
,
*
list_pos
_tmp
;
struct
hlist_node
*
node
,
*
node
_tmp
;
struct
neigh_node
*
neigh_node
;
struct
neigh_node
*
neigh_node
;
bool
neigh_purged
=
false
;
bool
neigh_purged
=
false
;
*
best_neigh_node
=
NULL
;
*
best_neigh_node
=
NULL
;
/* for all neighbors towards this originator ... */
/* for all neighbors towards this originator ... */
list_for_each_safe
(
list_pos
,
list_pos_tmp
,
&
orig_node
->
neigh_list
)
{
hlist_for_each_entry_safe
(
neigh_node
,
node
,
node_tmp
,
neigh_node
=
list_entry
(
list_pos
,
struct
neigh_node
,
list
);
&
orig_node
->
neigh_list
,
list
)
{
if
((
time_after
(
jiffies
,
if
((
time_after
(
jiffies
,
neigh_node
->
last_valid
+
PURGE_TIMEOUT
*
HZ
))
||
neigh_node
->
last_valid
+
PURGE_TIMEOUT
*
HZ
))
||
...
@@ -225,7 +224,8 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
...
@@ -225,7 +224,8 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
(
neigh_node
->
last_valid
/
HZ
));
(
neigh_node
->
last_valid
/
HZ
));
neigh_purged
=
true
;
neigh_purged
=
true
;
list_del
(
list_pos
);
hlist_del
(
&
neigh_node
->
list
);
kref_put
(
&
neigh_node
->
refcount
,
neigh_node_free_ref
);
kref_put
(
&
neigh_node
->
refcount
,
neigh_node_free_ref
);
}
else
{
}
else
{
if
((
!*
best_neigh_node
)
||
if
((
!*
best_neigh_node
)
||
...
@@ -328,7 +328,7 @@ int orig_seq_print_text(struct seq_file *seq, void *offset)
...
@@ -328,7 +328,7 @@ int orig_seq_print_text(struct seq_file *seq, void *offset)
struct
net_device
*
net_dev
=
(
struct
net_device
*
)
seq
->
private
;
struct
net_device
*
net_dev
=
(
struct
net_device
*
)
seq
->
private
;
struct
bat_priv
*
bat_priv
=
netdev_priv
(
net_dev
);
struct
bat_priv
*
bat_priv
=
netdev_priv
(
net_dev
);
struct
hashtable_t
*
hash
=
bat_priv
->
orig_hash
;
struct
hashtable_t
*
hash
=
bat_priv
->
orig_hash
;
struct
hlist_node
*
walk
;
struct
hlist_node
*
walk
,
*
node
;
struct
hlist_head
*
head
;
struct
hlist_head
*
head
;
struct
element_t
*
bucket
;
struct
element_t
*
bucket
;
struct
orig_node
*
orig_node
;
struct
orig_node
*
orig_node
;
...
@@ -384,8 +384,8 @@ int orig_seq_print_text(struct seq_file *seq, void *offset)
...
@@ -384,8 +384,8 @@ int orig_seq_print_text(struct seq_file *seq, void *offset)
neigh_node
->
addr
,
neigh_node
->
addr
,
neigh_node
->
if_incoming
->
net_dev
->
name
);
neigh_node
->
if_incoming
->
net_dev
->
name
);
list_for_each_entry
(
neigh_node
,
&
orig_node
->
neigh_list
,
hlist_for_each_entry
(
neigh_node
,
node
,
list
)
{
&
orig_node
->
neigh_list
,
list
)
{
seq_printf
(
seq
,
" %pM (%3i)"
,
neigh_node
->
addr
,
seq_printf
(
seq
,
" %pM (%3i)"
,
neigh_node
->
addr
,
neigh_node
->
tq_avg
);
neigh_node
->
tq_avg
);
}
}
...
...
net/batman-adv/routing.c
View file @
9591a79f
...
@@ -149,12 +149,12 @@ static int is_bidirectional_neigh(struct orig_node *orig_node,
...
@@ -149,12 +149,12 @@ static int is_bidirectional_neigh(struct orig_node *orig_node,
{
{
struct
bat_priv
*
bat_priv
=
netdev_priv
(
if_incoming
->
soft_iface
);
struct
bat_priv
*
bat_priv
=
netdev_priv
(
if_incoming
->
soft_iface
);
struct
neigh_node
*
neigh_node
=
NULL
,
*
tmp_neigh_node
=
NULL
;
struct
neigh_node
*
neigh_node
=
NULL
,
*
tmp_neigh_node
=
NULL
;
struct
hlist_node
*
node
;
unsigned
char
total_count
;
unsigned
char
total_count
;
if
(
orig_node
==
orig_neigh_node
)
{
if
(
orig_node
==
orig_neigh_node
)
{
list_for_each_entry
(
tmp_neigh_node
,
hlist_for_each_entry
(
tmp_neigh_node
,
node
,
&
orig_node
->
neigh_list
,
&
orig_node
->
neigh_list
,
list
)
{
list
)
{
if
(
compare_orig
(
tmp_neigh_node
->
addr
,
if
(
compare_orig
(
tmp_neigh_node
->
addr
,
orig_neigh_node
->
orig
)
&&
orig_neigh_node
->
orig
)
&&
...
@@ -174,7 +174,7 @@ static int is_bidirectional_neigh(struct orig_node *orig_node,
...
@@ -174,7 +174,7 @@ static int is_bidirectional_neigh(struct orig_node *orig_node,
neigh_node
->
last_valid
=
jiffies
;
neigh_node
->
last_valid
=
jiffies
;
}
else
{
}
else
{
/* find packet count of corresponding one hop neighbor */
/* find packet count of corresponding one hop neighbor */
list_for_each_entry
(
tmp_neigh_
node
,
hlist_for_each_entry
(
tmp_neigh_node
,
node
,
&
orig_neigh_node
->
neigh_list
,
list
)
{
&
orig_neigh_node
->
neigh_list
,
list
)
{
if
(
compare_orig
(
tmp_neigh_node
->
addr
,
if
(
compare_orig
(
tmp_neigh_node
->
addr
,
...
@@ -260,12 +260,14 @@ static void update_orig(struct bat_priv *bat_priv,
...
@@ -260,12 +260,14 @@ static void update_orig(struct bat_priv *bat_priv,
char
is_duplicate
)
char
is_duplicate
)
{
{
struct
neigh_node
*
neigh_node
=
NULL
,
*
tmp_neigh_node
=
NULL
;
struct
neigh_node
*
neigh_node
=
NULL
,
*
tmp_neigh_node
=
NULL
;
struct
hlist_node
*
node
;
int
tmp_hna_buff_len
;
int
tmp_hna_buff_len
;
bat_dbg
(
DBG_BATMAN
,
bat_priv
,
"update_originator(): "
bat_dbg
(
DBG_BATMAN
,
bat_priv
,
"update_originator(): "
"Searching and updating originator entry of received packet
\n
"
);
"Searching and updating originator entry of received packet
\n
"
);
list_for_each_entry
(
tmp_neigh_node
,
&
orig_node
->
neigh_list
,
list
)
{
hlist_for_each_entry
(
tmp_neigh_node
,
node
,
&
orig_node
->
neigh_list
,
list
)
{
if
(
compare_orig
(
tmp_neigh_node
->
addr
,
ethhdr
->
h_source
)
&&
if
(
compare_orig
(
tmp_neigh_node
->
addr
,
ethhdr
->
h_source
)
&&
(
tmp_neigh_node
->
if_incoming
==
if_incoming
))
{
(
tmp_neigh_node
->
if_incoming
==
if_incoming
))
{
neigh_node
=
tmp_neigh_node
;
neigh_node
=
tmp_neigh_node
;
...
@@ -391,6 +393,7 @@ static char count_real_packets(struct ethhdr *ethhdr,
...
@@ -391,6 +393,7 @@ static char count_real_packets(struct ethhdr *ethhdr,
struct
bat_priv
*
bat_priv
=
netdev_priv
(
if_incoming
->
soft_iface
);
struct
bat_priv
*
bat_priv
=
netdev_priv
(
if_incoming
->
soft_iface
);
struct
orig_node
*
orig_node
;
struct
orig_node
*
orig_node
;
struct
neigh_node
*
tmp_neigh_node
;
struct
neigh_node
*
tmp_neigh_node
;
struct
hlist_node
*
node
;
char
is_duplicate
=
0
;
char
is_duplicate
=
0
;
int32_t
seq_diff
;
int32_t
seq_diff
;
int
need_update
=
0
;
int
need_update
=
0
;
...
@@ -407,7 +410,8 @@ static char count_real_packets(struct ethhdr *ethhdr,
...
@@ -407,7 +410,8 @@ static char count_real_packets(struct ethhdr *ethhdr,
&
orig_node
->
batman_seqno_reset
))
&
orig_node
->
batman_seqno_reset
))
return
-
1
;
return
-
1
;
list_for_each_entry
(
tmp_neigh_node
,
&
orig_node
->
neigh_list
,
list
)
{
hlist_for_each_entry
(
tmp_neigh_node
,
node
,
&
orig_node
->
neigh_list
,
list
)
{
is_duplicate
|=
get_bit_status
(
tmp_neigh_node
->
real_bits
,
is_duplicate
|=
get_bit_status
(
tmp_neigh_node
->
real_bits
,
orig_node
->
last_real_seqno
,
orig_node
->
last_real_seqno
,
...
@@ -457,6 +461,7 @@ void update_bonding_candidates(struct orig_node *orig_node)
...
@@ -457,6 +461,7 @@ void update_bonding_candidates(struct orig_node *orig_node)
int
candidates
;
int
candidates
;
int
interference_candidate
;
int
interference_candidate
;
int
best_tq
;
int
best_tq
;
struct
hlist_node
*
node
,
*
node2
;
struct
neigh_node
*
tmp_neigh_node
,
*
tmp_neigh_node2
;
struct
neigh_node
*
tmp_neigh_node
,
*
tmp_neigh_node2
;
struct
neigh_node
*
first_candidate
,
*
last_candidate
;
struct
neigh_node
*
first_candidate
,
*
last_candidate
;
...
@@ -476,13 +481,15 @@ void update_bonding_candidates(struct orig_node *orig_node)
...
@@ -476,13 +481,15 @@ void update_bonding_candidates(struct orig_node *orig_node)
* as "bonding partner" */
* as "bonding partner" */
/* first, zero the list */
/* first, zero the list */
list_for_each_entry
(
tmp_neigh_node
,
&
orig_node
->
neigh_list
,
list
)
{
hlist_for_each_entry
(
tmp_neigh_node
,
node
,
&
orig_node
->
neigh_list
,
list
)
{
tmp_neigh_node
->
next_bond_candidate
=
NULL
;
tmp_neigh_node
->
next_bond_candidate
=
NULL
;
}
}
first_candidate
=
NULL
;
first_candidate
=
NULL
;
last_candidate
=
NULL
;
last_candidate
=
NULL
;
list_for_each_entry
(
tmp_neigh_node
,
&
orig_node
->
neigh_list
,
list
)
{
hlist_for_each_entry
(
tmp_neigh_node
,
node
,
&
orig_node
->
neigh_list
,
list
)
{
/* only consider if it has the same primary address ... */
/* only consider if it has the same primary address ... */
if
(
memcmp
(
orig_node
->
orig
,
if
(
memcmp
(
orig_node
->
orig
,
...
@@ -499,7 +506,7 @@ void update_bonding_candidates(struct orig_node *orig_node)
...
@@ -499,7 +506,7 @@ void update_bonding_candidates(struct orig_node *orig_node)
* select this candidate because of possible interference. */
* select this candidate because of possible interference. */
interference_candidate
=
0
;
interference_candidate
=
0
;
list_for_each_entry
(
tmp_neigh_
node2
,
hlist_for_each_entry
(
tmp_neigh_node2
,
node2
,
&
orig_node
->
neigh_list
,
list
)
{
&
orig_node
->
neigh_list
,
list
)
{
if
(
tmp_neigh_node2
==
tmp_neigh_node
)
if
(
tmp_neigh_node2
==
tmp_neigh_node
)
...
...
net/batman-adv/types.h
View file @
9591a79f
...
@@ -83,7 +83,7 @@ struct orig_node {
...
@@ -83,7 +83,7 @@ struct orig_node {
uint8_t
last_ttl
;
uint8_t
last_ttl
;
unsigned
long
bcast_bits
[
NUM_WORDS
];
unsigned
long
bcast_bits
[
NUM_WORDS
];
uint32_t
last_bcast_seqno
;
uint32_t
last_bcast_seqno
;
struct
list_head
neigh_list
;
struct
h
list_head
neigh_list
;
struct
list_head
frag_list
;
struct
list_head
frag_list
;
unsigned
long
last_frag_packet
;
unsigned
long
last_frag_packet
;
struct
{
struct
{
...
@@ -105,7 +105,7 @@ struct gw_node {
...
@@ -105,7 +105,7 @@ struct gw_node {
* @last_valid: when last packet via this neighbor was received
* @last_valid: when last packet via this neighbor was received
*/
*/
struct
neigh_node
{
struct
neigh_node
{
struct
list_head
list
;
struct
hlist_node
list
;
uint8_t
addr
[
ETH_ALEN
];
uint8_t
addr
[
ETH_ALEN
];
uint8_t
real_packet_count
;
uint8_t
real_packet_count
;
uint8_t
tq_recv
[
TQ_GLOBAL_WINDOW_SIZE
];
uint8_t
tq_recv
[
TQ_GLOBAL_WINDOW_SIZE
];
...
...
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