|
@@ -1975,6 +1975,7 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
|
|
|
struct hlist_head *head;
|
|
|
uint32_t i, crc_tmp, crc = 0;
|
|
|
uint8_t flags;
|
|
|
+ __be16 tmp_vid;
|
|
|
|
|
|
for (i = 0; i < hash->size; i++) {
|
|
|
head = &hash->table[i];
|
|
@@ -2011,8 +2012,11 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
|
|
|
orig_node))
|
|
|
continue;
|
|
|
|
|
|
- crc_tmp = crc32c(0, &tt_common->vid,
|
|
|
- sizeof(tt_common->vid));
|
|
|
+ /* use network order to read the VID: this ensures that
|
|
|
+ * every node reads the bytes in the same order.
|
|
|
+ */
|
|
|
+ tmp_vid = htons(tt_common->vid);
|
|
|
+ crc_tmp = crc32c(0, &tmp_vid, sizeof(tmp_vid));
|
|
|
|
|
|
/* compute the CRC on flags that have to be kept in sync
|
|
|
* among nodes
|
|
@@ -2046,6 +2050,7 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
|
|
|
struct hlist_head *head;
|
|
|
uint32_t i, crc_tmp, crc = 0;
|
|
|
uint8_t flags;
|
|
|
+ __be16 tmp_vid;
|
|
|
|
|
|
for (i = 0; i < hash->size; i++) {
|
|
|
head = &hash->table[i];
|
|
@@ -2064,8 +2069,11 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
|
|
|
if (tt_common->flags & BATADV_TT_CLIENT_NEW)
|
|
|
continue;
|
|
|
|
|
|
- crc_tmp = crc32c(0, &tt_common->vid,
|
|
|
- sizeof(tt_common->vid));
|
|
|
+ /* use network order to read the VID: this ensures that
|
|
|
+ * every node reads the bytes in the same order.
|
|
|
+ */
|
|
|
+ tmp_vid = htons(tt_common->vid);
|
|
|
+ crc_tmp = crc32c(0, &tmp_vid, sizeof(tmp_vid));
|
|
|
|
|
|
/* compute the CRC on flags that have to be kept in sync
|
|
|
* among nodes
|
|
@@ -2262,6 +2270,7 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
|
|
|
{
|
|
|
struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp;
|
|
|
struct batadv_orig_node_vlan *vlan;
|
|
|
+ uint32_t crc;
|
|
|
int i;
|
|
|
|
|
|
/* 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,
|
|
|
if (!vlan)
|
|
|
return false;
|
|
|
|
|
|
- if (vlan->tt.crc != ntohl(tt_vlan_tmp->crc))
|
|
|
+ crc = vlan->tt.crc;
|
|
|
+ batadv_orig_node_vlan_free_ref(vlan);
|
|
|
+
|
|
|
+ if (crc != ntohl(tt_vlan_tmp->crc))
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -3218,7 +3230,6 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
|
|
|
|
|
|
spin_lock_bh(&orig_node->tt_lock);
|
|
|
|
|
|
- tt_change = (struct batadv_tvlv_tt_change *)tt_buff;
|
|
|
batadv_tt_update_changes(bat_priv, orig_node, tt_num_changes,
|
|
|
ttvn, tt_change);
|
|
|
|