| From 95ea6049f58936697a74d30126cd9a1c5f9a94ef Mon Sep 17 00:00:00 2001 |
| From: Sven Eckelmann <sven@narfation.org> |
| Date: Thu, 28 Nov 2019 12:25:45 +0100 |
| Subject: [PATCH] batman-adv: Fix DAT candidate selection on little endian |
| systems |
| |
| commit 4cc4a1708903f404d2ca0dfde30e71e052c6cbc9 upstream. |
| |
| The distributed arp table is using a DHT to store and retrieve MAC address |
| information for an IP address. This is done using unicast messages to |
| selected peers. The potential peers are looked up using the IP address and |
| the VID. |
| |
| While the IP address is always stored in big endian byte order, this is not |
| the case of the VID. It can (depending on the host system) either be big |
| endian or little endian. The host must therefore always convert it to big |
| endian to ensure that all devices calculate the same peers for the same |
| lookup data. |
| |
| Fixes: be1db4f6615b ("batman-adv: make the Distributed ARP Table vlan aware") |
| Signed-off-by: Sven Eckelmann <sven@narfation.org> |
| Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c |
| index b0af3a11d406..ec7bf5a4a9fc 100644 |
| --- a/net/batman-adv/distributed-arp-table.c |
| +++ b/net/batman-adv/distributed-arp-table.c |
| @@ -285,6 +285,7 @@ static u32 batadv_hash_dat(const void *data, u32 size) |
| u32 hash = 0; |
| const struct batadv_dat_entry *dat = data; |
| const unsigned char *key; |
| + __be16 vid; |
| u32 i; |
| |
| key = (const unsigned char *)&dat->ip; |
| @@ -294,7 +295,8 @@ static u32 batadv_hash_dat(const void *data, u32 size) |
| hash ^= (hash >> 6); |
| } |
| |
| - key = (const unsigned char *)&dat->vid; |
| + vid = htons(dat->vid); |
| + key = (__force const unsigned char *)&vid; |
| for (i = 0; i < sizeof(dat->vid); i++) { |
| hash += key[i]; |
| hash += (hash << 10); |
| -- |
| 2.7.4 |
| |