|
@@ -1959,6 +1959,7 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
|
|
|
struct batadv_tt_global_entry *tt_global;
|
|
|
struct hlist_head *head;
|
|
|
uint32_t i, crc_tmp, crc = 0;
|
|
|
+ uint8_t flags;
|
|
|
|
|
|
for (i = 0; i < hash->size; i++) {
|
|
|
head = &hash->table[i];
|
|
@@ -1997,6 +1998,13 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
|
|
|
|
|
|
crc_tmp = crc32c(0, &tt_common->vid,
|
|
|
sizeof(tt_common->vid));
|
|
|
+
|
|
|
+ /* compute the CRC on flags that have to be kept in sync
|
|
|
+ * among nodes
|
|
|
+ */
|
|
|
+ flags = tt_common->flags & BATADV_TT_SYNC_MASK;
|
|
|
+ crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags));
|
|
|
+
|
|
|
crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
|
|
|
}
|
|
|
rcu_read_unlock();
|
|
@@ -2022,6 +2030,7 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
|
|
|
struct batadv_tt_common_entry *tt_common;
|
|
|
struct hlist_head *head;
|
|
|
uint32_t i, crc_tmp, crc = 0;
|
|
|
+ uint8_t flags;
|
|
|
|
|
|
for (i = 0; i < hash->size; i++) {
|
|
|
head = &hash->table[i];
|
|
@@ -2042,6 +2051,13 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
|
|
|
|
|
|
crc_tmp = crc32c(0, &tt_common->vid,
|
|
|
sizeof(tt_common->vid));
|
|
|
+
|
|
|
+ /* compute the CRC on flags that have to be kept in sync
|
|
|
+ * among nodes
|
|
|
+ */
|
|
|
+ flags = tt_common->flags & BATADV_TT_SYNC_MASK;
|
|
|
+ crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags));
|
|
|
+
|
|
|
crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
|
|
|
}
|
|
|
rcu_read_unlock();
|
|
@@ -3524,6 +3540,9 @@ int batadv_tt_init(struct batadv_priv *bat_priv)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
+ /* synchronized flags must be remote */
|
|
|
+ BUILD_BUG_ON(!(BATADV_TT_SYNC_MASK & BATADV_TT_REMOTE_MASK));
|
|
|
+
|
|
|
ret = batadv_tt_local_init(bat_priv);
|
|
|
if (ret < 0)
|
|
|
return ret;
|