summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Loeliger <jdl@netgate.com>2020-03-09 13:13:35 -0500
committerMatthew Smith <mgsmith@netgate.com>2020-03-18 15:53:24 +0000
commit6a32ce326495bfe48ebef74dfbb8a9c1cf37a530 (patch)
tree1c385a0f573da25763d02f923dca0e96e296ec88
parentb0f956c255de7aa61fead96b7b94bcf937d92c05 (diff)
ethernet: Copy only 6 bytes of mac address into a u64
Rather than leaving 2 bytes of junk in the upper word of a mac address represented as a u64, zero them out. That way later compairsons stand a chance of matching when deleting a bridge's arp termination entries. The volatile qualifier shouldn't be needed here, but without it the compiler removes the clib_memcpy() at -O2. Bad compiler. No biscuit. Type: fix commit: faf22cb303b65e2a6bf8dad959d7f5ee6d031c4f Change-Id: Iebcf35fdd421293dccbcaefadef767f7e139438e Signed-off-by: Jon Loeliger <jdl@netgate.com>
-rw-r--r--src/vnet/ethernet/mac_address.h6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/vnet/ethernet/mac_address.h b/src/vnet/ethernet/mac_address.h
index 68feb3977f0..0631ec38bd2 100644
--- a/src/vnet/ethernet/mac_address.h
+++ b/src/vnet/ethernet/mac_address.h
@@ -111,11 +111,11 @@ mac_address_is_zero (const mac_address_t * mac)
static_always_inline u64
mac_address_as_u64 (const mac_address_t * mac)
{
- u64 *as_u64;
+ volatile u64 as_u64 = 0;
- as_u64 = (u64 *) mac->bytes;
+ clib_memcpy ((void *) &as_u64, mac->bytes, 6);
- return (*as_u64);
+ return as_u64;
}
static_always_inline void