diff options
Diffstat (limited to 'net/batman-adv/translation-table.c')
| -rw-r--r-- | net/batman-adv/translation-table.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index b6071f675a3e..959dde721c46 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
| @@ -1975,6 +1975,7 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv, | |||
| 1975 | struct hlist_head *head; | 1975 | struct hlist_head *head; |
| 1976 | uint32_t i, crc_tmp, crc = 0; | 1976 | uint32_t i, crc_tmp, crc = 0; |
| 1977 | uint8_t flags; | 1977 | uint8_t flags; |
| 1978 | __be16 tmp_vid; | ||
| 1978 | 1979 | ||
| 1979 | for (i = 0; i < hash->size; i++) { | 1980 | for (i = 0; i < hash->size; i++) { |
| 1980 | head = &hash->table[i]; | 1981 | head = &hash->table[i]; |
| @@ -2011,8 +2012,11 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv, | |||
| 2011 | orig_node)) | 2012 | orig_node)) |
| 2012 | continue; | 2013 | continue; |
| 2013 | 2014 | ||
| 2014 | crc_tmp = crc32c(0, &tt_common->vid, | 2015 | /* use network order to read the VID: this ensures that |
| 2015 | sizeof(tt_common->vid)); | 2016 | * every node reads the bytes in the same order. |
| 2017 | */ | ||
| 2018 | tmp_vid = htons(tt_common->vid); | ||
| 2019 | crc_tmp = crc32c(0, &tmp_vid, sizeof(tmp_vid)); | ||
| 2016 | 2020 | ||
| 2017 | /* compute the CRC on flags that have to be kept in sync | 2021 | /* compute the CRC on flags that have to be kept in sync |
| 2018 | * among nodes | 2022 | * among nodes |
| @@ -2046,6 +2050,7 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv, | |||
| 2046 | struct hlist_head *head; | 2050 | struct hlist_head *head; |
| 2047 | uint32_t i, crc_tmp, crc = 0; | 2051 | uint32_t i, crc_tmp, crc = 0; |
| 2048 | uint8_t flags; | 2052 | uint8_t flags; |
| 2053 | __be16 tmp_vid; | ||
| 2049 | 2054 | ||
| 2050 | for (i = 0; i < hash->size; i++) { | 2055 | for (i = 0; i < hash->size; i++) { |
| 2051 | head = &hash->table[i]; | 2056 | head = &hash->table[i]; |
| @@ -2064,8 +2069,11 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv, | |||
| 2064 | if (tt_common->flags & BATADV_TT_CLIENT_NEW) | 2069 | if (tt_common->flags & BATADV_TT_CLIENT_NEW) |
| 2065 | continue; | 2070 | continue; |
| 2066 | 2071 | ||
| 2067 | crc_tmp = crc32c(0, &tt_common->vid, | 2072 | /* use network order to read the VID: this ensures that |
| 2068 | sizeof(tt_common->vid)); | 2073 | * every node reads the bytes in the same order. |
| 2074 | */ | ||
| 2075 | tmp_vid = htons(tt_common->vid); | ||
| 2076 | crc_tmp = crc32c(0, &tmp_vid, sizeof(tmp_vid)); | ||
| 2069 | 2077 | ||
| 2070 | /* compute the CRC on flags that have to be kept in sync | 2078 | /* compute the CRC on flags that have to be kept in sync |
| 2071 | * among nodes | 2079 | * among nodes |
| @@ -2262,6 +2270,7 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node, | |||
| 2262 | { | 2270 | { |
| 2263 | struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp; | 2271 | struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp; |
| 2264 | struct batadv_orig_node_vlan *vlan; | 2272 | struct batadv_orig_node_vlan *vlan; |
| 2273 | uint32_t crc; | ||
| 2265 | int i; | 2274 | int i; |
| 2266 | 2275 | ||
| 2267 | /* check if each received CRC matches the locally stored one */ | 2276 | /* check if each received CRC matches the locally stored one */ |
| @@ -2281,7 +2290,10 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node, | |||
| 2281 | if (!vlan) | 2290 | if (!vlan) |
| 2282 | return false; | 2291 | return false; |
| 2283 | 2292 | ||
| 2284 | if (vlan->tt.crc != ntohl(tt_vlan_tmp->crc)) | 2293 | crc = vlan->tt.crc; |
| 2294 | batadv_orig_node_vlan_free_ref(vlan); | ||
| 2295 | |||
| 2296 | if (crc != ntohl(tt_vlan_tmp->crc)) | ||
| 2285 | return false; | 2297 | return false; |
| 2286 | } | 2298 | } |
| 2287 | 2299 | ||
| @@ -3218,7 +3230,6 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv, | |||
| 3218 | 3230 | ||
| 3219 | spin_lock_bh(&orig_node->tt_lock); | 3231 | spin_lock_bh(&orig_node->tt_lock); |
| 3220 | 3232 | ||
| 3221 | tt_change = (struct batadv_tvlv_tt_change *)tt_buff; | ||
| 3222 | batadv_tt_update_changes(bat_priv, orig_node, tt_num_changes, | 3233 | batadv_tt_update_changes(bat_priv, orig_node, tt_num_changes, |
| 3223 | ttvn, tt_change); | 3234 | ttvn, tt_change); |
| 3224 | 3235 | ||
