diff options
author | Antonio Quartulli <ordex@autistici.org> | 2012-01-06 15:31:33 -0500 |
---|---|---|
committer | Marek Lindner <lindner_marek@yahoo.de> | 2012-02-16 13:50:21 -0500 |
commit | c40ed2bfa6cc30174d5c547b37bcd6528c830ef4 (patch) | |
tree | 311997f241af6d9550321958fc57f6838727a670 /net/batman-adv/translation-table.c | |
parent | 567db7b0b7c0a94cc62846f8ebb429bdda2884bc (diff) |
batman-adv: set TT_CLIENT_NEW flag before invoking hash_add()
In case of a new tt_local_entry, the TT_CLIENT_NEW flag has to be set before
adding such entry to the hash table. Otherwise, it opens a race condition
in which the entry can be found but the flag has not been set.
Signed-off-by: Antonio Quartulli <ordex@autistici.org>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Diffstat (limited to 'net/batman-adv/translation-table.c')
-rw-r--r-- | net/batman-adv/translation-table.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index 4dc5af334f6b..9be9c41c529b 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
@@ -210,6 +210,11 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | |||
210 | if (compare_eth(addr, soft_iface->dev_addr)) | 210 | if (compare_eth(addr, soft_iface->dev_addr)) |
211 | tt_local_entry->common.flags |= TT_CLIENT_NOPURGE; | 211 | tt_local_entry->common.flags |= TT_CLIENT_NOPURGE; |
212 | 212 | ||
213 | /* The local entry has to be marked as NEW to avoid to send it in | ||
214 | * a full table response going out before the next ttvn increment | ||
215 | * (consistency check) */ | ||
216 | tt_local_entry->common.flags |= TT_CLIENT_NEW; | ||
217 | |||
213 | hash_added = hash_add(bat_priv->tt_local_hash, compare_tt, choose_orig, | 218 | hash_added = hash_add(bat_priv->tt_local_hash, compare_tt, choose_orig, |
214 | &tt_local_entry->common, | 219 | &tt_local_entry->common, |
215 | &tt_local_entry->common.hash_entry); | 220 | &tt_local_entry->common.hash_entry); |
@@ -222,11 +227,6 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | |||
222 | 227 | ||
223 | tt_local_event(bat_priv, addr, tt_local_entry->common.flags); | 228 | tt_local_event(bat_priv, addr, tt_local_entry->common.flags); |
224 | 229 | ||
225 | /* The local entry has to be marked as NEW to avoid to send it in | ||
226 | * a full table response going out before the next ttvn increment | ||
227 | * (consistency check) */ | ||
228 | tt_local_entry->common.flags |= TT_CLIENT_NEW; | ||
229 | |||
230 | /* remove address from global hash if present */ | 230 | /* remove address from global hash if present */ |
231 | tt_global_entry = tt_global_hash_find(bat_priv, addr); | 231 | tt_global_entry = tt_global_hash_find(bat_priv, addr); |
232 | 232 | ||