[linux-next] LinuxNextTracking branch, master, updated. next-20140219

batman at open-mesh.org batman at open-mesh.org
Thu Feb 20 00:22:57 CET 2014


The following commit has been merged in the master branch:
commit a30e22ca8464c2dc573e0144a972221c2f06c2cd
Author: Antonio Quartulli <antonio at open-mesh.com>
Date:   Tue Feb 11 17:05:06 2014 +0100

    batman-adv: fix TT CRC computation by ensuring byte order
    
    When computing the CRC on a 2byte variable the order of
    the bytes obviously alters the final result. This means
    that computing the CRC over the same value on two archs
    having different endianess leads to different numbers.
    
    The global and local translation table CRC computation
    routine makes this mistake while processing the clients
    VIDs. The result is a continuous CRC mismatching between
    nodes having different endianess.
    
    Fix this by converting the VID to Network Order before
    processing it. This guarantees that every node uses the same
    byte order.
    
    Introduced by 7ea7b4a142758deaf46c1af0ca9ceca6dd55138b
    ("batman-adv: make the TT CRC logic VLAN specific")
    
    Reported-by: Russel Senior <russell at personaltelco.net>
    Signed-off-by: Antonio Quartulli <antonio at open-mesh.com>
    Tested-by: Russell Senior <russell at personaltelco.net>
    Signed-off-by: Marek Lindner <mareklindner at neomailbox.ch>

diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index c21c557..959dde7 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -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

-- 
LinuxNextTracking


More information about the linux-merge mailing list