Skip to content

Commit

Permalink
batman-adv: include the sync-flags when compute the global/local tabl…
Browse files Browse the repository at this point in the history
…e 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>
  • Loading branch information
Antonio Quartulli authored and Antonio Quartulli committed Oct 23, 2013
1 parent 3c4f7ab commit 0eb0156
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 2 deletions.
5 changes: 3 additions & 2 deletions net/batman-adv/packet.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,13 @@ enum batadv_tt_data_flags {

/* BATADV_TT_CLIENT flags.
* Flags from BIT(0) to BIT(7) are sent on the wire, while flags from BIT(8) to
* BIT(15) are used for local computation only
* BIT(15) are used for local computation only.
* Flags from BIT(4) to BIT(7) are kept in sync with the rest of the network.
*/
enum batadv_tt_client_flags {
BATADV_TT_CLIENT_DEL = BIT(0),
BATADV_TT_CLIENT_ROAM = BIT(1),
BATADV_TT_CLIENT_WIFI = BIT(2),
BATADV_TT_CLIENT_WIFI = BIT(4),
BATADV_TT_CLIENT_NOPURGE = BIT(8),
BATADV_TT_CLIENT_NEW = BIT(9),
BATADV_TT_CLIENT_PENDING = BIT(10),
Expand Down
19 changes: 19 additions & 0 deletions net/batman-adv/translation-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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();
Expand All @@ -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];
Expand All @@ -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();
Expand Down Expand Up @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions net/batman-adv/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@
*/
#define BATADV_TT_REMOTE_MASK 0x00FF

/**
* BATADV_TT_SYNC_MASK - bitmask of the flags that need to be kept in sync
* among the nodes. These flags are used to compute the global/local CRC
*/
#define BATADV_TT_SYNC_MASK 0x00F0

/**
* struct batadv_hard_iface_bat_iv - per hard interface B.A.T.M.A.N. IV data
* @ogm_buff: buffer holding the OGM packet
Expand Down

0 comments on commit 0eb0156

Please sign in to comment.