summaryrefslogtreecommitdiffstats
path: root/bfdd/bfd.h
diff options
context:
space:
mode:
Diffstat (limited to 'bfdd/bfd.h')
-rw-r--r--bfdd/bfd.h17
1 files changed, 14 insertions, 3 deletions
diff --git a/bfdd/bfd.h b/bfdd/bfd.h
index d9d5d8cb5..7d5b7887c 100644
--- a/bfdd/bfd.h
+++ b/bfdd/bfd.h
@@ -173,15 +173,26 @@ enum bfd_session_flags {
BFD_SESS_FLAG_PASSIVE = 1 << 10, /* Passive mode */
};
-/* BFD session hash keys */
+/*
+ * BFD session hash key.
+ *
+ * This structure must not have any padding bytes because their value is
+ * unspecified after the struct assignment. Even when all fields of two keys
+ * are the same, if the padding bytes are different, then the calculated hash
+ * value is different, and the hash lookup will fail.
+ *
+ * Currently, the structure fields are correctly aligned, and the "packed"
+ * attribute is added as a precaution. "family" and "mhop" fields are two-bytes
+ * to eliminate unaligned memory access to "peer" and "local".
+ */
struct bfd_key {
uint16_t family;
- uint8_t mhop;
+ uint16_t mhop;
struct in6_addr peer;
struct in6_addr local;
char ifname[MAXNAMELEN];
char vrfname[MAXNAMELEN];
-};
+} __attribute__((packed));
struct bfd_session_stats {
uint64_t rx_ctrl_pkt;