100 lines
3.7 KiB
Diff
100 lines
3.7 KiB
Diff
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||
|
Date: Tue, 23 Jan 2018 21:18:34 +0100
|
||
|
Subject: batman-adv: unaligned access fix
|
||
|
|
||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||
|
|
||
|
diff --git a/batman-adv/patches/900-unaligned-access.patch b/batman-adv/patches/900-unaligned-access.patch
|
||
|
new file mode 100644
|
||
|
index 0000000000000000000000000000000000000000..eb067329bc5e9f112b56d03c20c612fb1fd1e32d
|
||
|
--- /dev/null
|
||
|
+++ b/batman-adv/patches/900-unaligned-access.patch
|
||
|
@@ -0,0 +1,87 @@
|
||
|
+From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||
|
+Date: Wed, 24 Jan 2018 11:21:37 +0000 (+0100)
|
||
|
+Subject: batman-adv: always assume 2-byte packet alignment
|
||
|
+X-Git-Url: https://git.open-mesh.org/batman-adv.git/commitdiff_plain/0509fc0c128ba2891770305c57c9b6a3a61ea7bd
|
||
|
+
|
||
|
+batman-adv: always assume 2-byte packet alignment
|
||
|
+
|
||
|
+NIC drivers generally try to ensure that the "network header" is aligned
|
||
|
+to a 4-byte boundary. This is not always possible: When Ethernet frames are
|
||
|
+encapsulated in other packets with 4-byte aligned headers, the inner
|
||
|
+Ethernet header will have 4-byte alignment, and in consequence, the inner
|
||
|
+network header is aligned to 2, but not to 4 bytes.
|
||
|
+
|
||
|
+Most parts of batman-adv only care about 2-byte alignment; in particular,
|
||
|
+no unaligned accesses occur in performance-critical paths that handle
|
||
|
+actual payload data. This is not true for OGM handling: the seqno and crc
|
||
|
+fields are accessed as 32-bit values. To avoid these unaligned accesses,
|
||
|
+this patch reduces the expected packet alignment to 2 bytes for all of
|
||
|
+batadv's packet types.
|
||
|
+
|
||
|
+As no unaligned accesses existed on the performance-critical paths anyways,
|
||
|
+this chance does have any (positive or negative) effect on performance, but
|
||
|
+it still makes sense to avoid these accesses to prevent log noise when
|
||
|
+examining other unaligned accesses in the kernel while batman-adv is
|
||
|
+active.
|
||
|
+
|
||
|
+Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||
|
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||
|
+---
|
||
|
+
|
||
|
+diff --git a/include/uapi/linux/batadv_packet.h b/include/uapi/linux/batadv_packet.h
|
||
|
+index daefd72..894d8d2 100644
|
||
|
+--- a/include/uapi/linux/batadv_packet.h
|
||
|
++++ b/include/uapi/linux/batadv_packet.h
|
||
|
+@@ -196,8 +196,6 @@ struct batadv_bla_claim_dst {
|
||
|
+ __be16 group; /* group id */
|
||
|
+ };
|
||
|
+
|
||
|
+-#pragma pack()
|
||
|
+-
|
||
|
+ /**
|
||
|
+ * struct batadv_ogm_packet - ogm (routing protocol) packet
|
||
|
+ * @packet_type: batman-adv packet type, part of the general header
|
||
|
+@@ -222,9 +220,6 @@ struct batadv_ogm_packet {
|
||
|
+ __u8 reserved;
|
||
|
+ __u8 tq;
|
||
|
+ __be16 tvlv_len;
|
||
|
+- /* __packed is not needed as the struct size is divisible by 4,
|
||
|
+- * and the largest data type in this struct has a size of 4.
|
||
|
+- */
|
||
|
+ };
|
||
|
+
|
||
|
+ #define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet)
|
||
|
+@@ -249,9 +244,6 @@ struct batadv_ogm2_packet {
|
||
|
+ __u8 orig[ETH_ALEN];
|
||
|
+ __be16 tvlv_len;
|
||
|
+ __be32 throughput;
|
||
|
+- /* __packed is not needed as the struct size is divisible by 4,
|
||
|
+- * and the largest data type in this struct has a size of 4.
|
||
|
+- */
|
||
|
+ };
|
||
|
+
|
||
|
+ #define BATADV_OGM2_HLEN sizeof(struct batadv_ogm2_packet)
|
||
|
+@@ -405,7 +397,6 @@ struct batadv_icmp_packet_rr {
|
||
|
+ * misalignment of the payload after the ethernet header. It may also lead to
|
||
|
+ * leakage of information when the padding it not initialized before sending.
|
||
|
+ */
|
||
|
+-#pragma pack(2)
|
||
|
+
|
||
|
+ /**
|
||
|
+ * struct batadv_unicast_packet - unicast packet for network payload
|
||
|
+@@ -533,8 +524,6 @@ struct batadv_coded_packet {
|
||
|
+ __be16 coded_len;
|
||
|
+ };
|
||
|
+
|
||
|
+-#pragma pack()
|
||
|
+-
|
||
|
+ /**
|
||
|
+ * struct batadv_unicast_tvlv_packet - generic unicast packet with tvlv payload
|
||
|
+ * @packet_type: batman-adv packet type, part of the general header
|
||
|
+@@ -641,4 +630,6 @@ struct batadv_tvlv_mcast_data {
|
||
|
+ __u8 reserved[3];
|
||
|
+ };
|
||
|
+
|
||
|
++#pragma pack()
|
||
|
++
|
||
|
+ #endif /* _UAPI_LINUX_BATADV_PACKET_H_ */
|