aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv
diff options
context:
space:
mode:
authorAntonio Quartulli <antonio@open-mesh.com>2013-10-12 20:50:20 -0400
committerAntonio Quartulli <antonio@meshcoding.com>2013-10-23 11:03:46 -0400
commit0eb01568f0b78f482eb2fd91d01e9eab344933aa (patch)
tree15b8ad662c4a70567f981189a2ad33a817efc7f1 /net/batman-adv
parent3c4f7ab60cc21e8fc65b234f3a6174fc19a93fee (diff)
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>
Diffstat (limited to 'net/batman-adv')
-rw-r--r--net/batman-adv/packet.h5
-rw-r--r--net/batman-adv/translation-table.c19
-rw-r--r--net/batman-adv/types.h6
3 files changed, 28 insertions, 2 deletions
diff --git a/net/batman-adv/packet.h b/net/batman-adv/packet.h
index 9fbcaacc345a..843b96ac355a 100644
--- a/net/batman-adv/packet.h
+++ b/net/batman-adv/packet.h
@@ -110,12 +110,13 @@ enum batadv_tt_data_flags {
110 110
111/* BATADV_TT_CLIENT flags. 111/* BATADV_TT_CLIENT flags.
112 * Flags from BIT(0) to BIT(7) are sent on the wire, while flags from BIT(8) to 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 */
115enum batadv_tt_client_flags { 116enum batadv_tt_client_flags {
116 BATADV_TT_CLIENT_DEL = BIT(0), 117 BATADV_TT_CLIENT_DEL = BIT(0),
117 BATADV_TT_CLIENT_ROAM = BIT(1), 118 BATADV_TT_CLIENT_ROAM = BIT(1),
118 BATADV_TT_CLIENT_WIFI = BIT(2), 119 BATADV_TT_CLIENT_WIFI = BIT(4),
119 BATADV_TT_CLIENT_NOPURGE = BIT(8), 120 BATADV_TT_CLIENT_NOPURGE = BIT(8),
120 BATADV_TT_CLIENT_NEW = BIT(9), 121 BATADV_TT_CLIENT_NEW = BIT(9),
121 BATADV_TT_CLIENT_PENDING = BIT(10), 122 BATADV_TT_CLIENT_PENDING = BIT(10),
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 267780f4b438..4add57d4857f 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -1959,6 +1959,7 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
1959 struct batadv_tt_global_entry *tt_global; 1959 struct batadv_tt_global_entry *tt_global;
1960 struct hlist_head *head; 1960 struct hlist_head *head;
1961 uint32_t i, crc_tmp, crc = 0; 1961 uint32_t i, crc_tmp, crc = 0;
1962 uint8_t flags;
1962 1963
1963 for (i = 0; i < hash->size; i++) { 1964 for (i = 0; i < hash->size; i++) {
1964 head = &hash->table[i]; 1965 head = &hash->table[i];
@@ -1997,6 +1998,13 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
1997 1998
1998 crc_tmp = crc32c(0, &tt_common->vid, 1999 crc_tmp = crc32c(0, &tt_common->vid,
1999 sizeof(tt_common->vid)); 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 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN); 2008 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
2001 } 2009 }
2002 rcu_read_unlock(); 2010 rcu_read_unlock();
@@ -2022,6 +2030,7 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
2022 struct batadv_tt_common_entry *tt_common; 2030 struct batadv_tt_common_entry *tt_common;
2023 struct hlist_head *head; 2031 struct hlist_head *head;
2024 uint32_t i, crc_tmp, crc = 0; 2032 uint32_t i, crc_tmp, crc = 0;
2033 uint8_t flags;
2025 2034
2026 for (i = 0; i < hash->size; i++) { 2035 for (i = 0; i < hash->size; i++) {
2027 head = &hash->table[i]; 2036 head = &hash->table[i];
@@ -2042,6 +2051,13 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
2042 2051
2043 crc_tmp = crc32c(0, &tt_common->vid, 2052 crc_tmp = crc32c(0, &tt_common->vid,
2044 sizeof(tt_common->vid)); 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 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN); 2061 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
2046 } 2062 }
2047 rcu_read_unlock(); 2063 rcu_read_unlock();
@@ -3524,6 +3540,9 @@ int batadv_tt_init(struct batadv_priv *bat_priv)
3524{ 3540{
3525 int ret; 3541 int ret;
3526 3542
3543 /* synchronized flags must be remote */
3544 BUILD_BUG_ON(!(BATADV_TT_SYNC_MASK & BATADV_TT_REMOTE_MASK));
3545
3527 ret = batadv_tt_local_init(bat_priv); 3546 ret = batadv_tt_local_init(bat_priv);
3528 if (ret < 0) 3547 if (ret < 0)
3529 return ret; 3548 return ret;
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index 61297b6db85e..3c2116274de2 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -42,6 +42,12 @@
42#define BATADV_TT_REMOTE_MASK 0x00FF 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 * struct batadv_hard_iface_bat_iv - per hard interface B.A.T.M.A.N. IV data 51 * struct batadv_hard_iface_bat_iv - per hard interface B.A.T.M.A.N. IV data
46 * @ogm_buff: buffer holding the OGM packet 52 * @ogm_buff: buffer holding the OGM packet
47 * @ogm_buff_len: length of the OGM packet buffer 53 * @ogm_buff_len: length of the OGM packet buffer