Commit 0eb01568f0b78f482eb2fd91d01e9eab344933aa

Authored by Antonio Quartulli
Committed by Antonio Quartulli
1 parent 3c4f7ab60c

batman-adv: include the sync-flags when compute the global/local table CRC

Flags covered by TT_SYNC_MASK are kept in sync among the
nodes in the network and therefore they have to be
considered while computing the global/local table CRC.

In this way a generic originator is able to understand if
its table contains the correct flags or not.

Bits from 4 to 7 in the TT flags fields are now reserved for
"synchronized" flags only.

This allows future developers to add more flags of this type
without breaking compatibility.

It's important to note that not all the remote TT flags are
synchronised. This comes from the fact that some flags are
used to inject an information once only.

Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>

Showing 3 changed files with 28 additions and 2 deletions Side-by-side Diff

net/batman-adv/packet.h
... ... @@ -110,12 +110,13 @@
110 110  
111 111 /* BATADV_TT_CLIENT flags.
112 112 * Flags from BIT(0) to BIT(7) are sent on the wire, while flags from BIT(8) to
113   - * BIT(15) are used for local computation only
  113 + * BIT(15) are used for local computation only.
  114 + * Flags from BIT(4) to BIT(7) are kept in sync with the rest of the network.
114 115 */
115 116 enum batadv_tt_client_flags {
116 117 BATADV_TT_CLIENT_DEL = BIT(0),
117 118 BATADV_TT_CLIENT_ROAM = BIT(1),
118   - BATADV_TT_CLIENT_WIFI = BIT(2),
  119 + BATADV_TT_CLIENT_WIFI = BIT(4),
119 120 BATADV_TT_CLIENT_NOPURGE = BIT(8),
120 121 BATADV_TT_CLIENT_NEW = BIT(9),
121 122 BATADV_TT_CLIENT_PENDING = BIT(10),
net/batman-adv/translation-table.c
... ... @@ -1959,6 +1959,7 @@
1959 1959 struct batadv_tt_global_entry *tt_global;
1960 1960 struct hlist_head *head;
1961 1961 uint32_t i, crc_tmp, crc = 0;
  1962 + uint8_t flags;
1962 1963  
1963 1964 for (i = 0; i < hash->size; i++) {
1964 1965 head = &hash->table[i];
... ... @@ -1997,6 +1998,13 @@
1997 1998  
1998 1999 crc_tmp = crc32c(0, &tt_common->vid,
1999 2000 sizeof(tt_common->vid));
  2001 +
  2002 + /* compute the CRC on flags that have to be kept in sync
  2003 + * among nodes
  2004 + */
  2005 + flags = tt_common->flags & BATADV_TT_SYNC_MASK;
  2006 + crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags));
  2007 +
2000 2008 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
2001 2009 }
2002 2010 rcu_read_unlock();
... ... @@ -2022,6 +2030,7 @@
2022 2030 struct batadv_tt_common_entry *tt_common;
2023 2031 struct hlist_head *head;
2024 2032 uint32_t i, crc_tmp, crc = 0;
  2033 + uint8_t flags;
2025 2034  
2026 2035 for (i = 0; i < hash->size; i++) {
2027 2036 head = &hash->table[i];
... ... @@ -2042,6 +2051,13 @@
2042 2051  
2043 2052 crc_tmp = crc32c(0, &tt_common->vid,
2044 2053 sizeof(tt_common->vid));
  2054 +
  2055 + /* compute the CRC on flags that have to be kept in sync
  2056 + * among nodes
  2057 + */
  2058 + flags = tt_common->flags & BATADV_TT_SYNC_MASK;
  2059 + crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags));
  2060 +
2045 2061 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
2046 2062 }
2047 2063 rcu_read_unlock();
... ... @@ -3523,6 +3539,9 @@
3523 3539 int batadv_tt_init(struct batadv_priv *bat_priv)
3524 3540 {
3525 3541 int ret;
  3542 +
  3543 + /* synchronized flags must be remote */
  3544 + BUILD_BUG_ON(!(BATADV_TT_SYNC_MASK & BATADV_TT_REMOTE_MASK));
3526 3545  
3527 3546 ret = batadv_tt_local_init(bat_priv);
3528 3547 if (ret < 0)
net/batman-adv/types.h
... ... @@ -42,6 +42,12 @@
42 42 #define BATADV_TT_REMOTE_MASK 0x00FF
43 43  
44 44 /**
  45 + * BATADV_TT_SYNC_MASK - bitmask of the flags that need to be kept in sync
  46 + * among the nodes. These flags are used to compute the global/local CRC
  47 + */
  48 +#define BATADV_TT_SYNC_MASK 0x00F0
  49 +
  50 +/**
45 51 * struct batadv_hard_iface_bat_iv - per hard interface B.A.T.M.A.N. IV data
46 52 * @ogm_buff: buffer holding the OGM packet
47 53 * @ogm_buff_len: length of the OGM packet buffer