From: Matthias Schiffer Date: Tue, 23 Jan 2018 21:18:34 +0100 Subject: batman-adv: unaligned access fix Signed-off-by: Matthias Schiffer 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 +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 +Signed-off-by: Sven Eckelmann +--- + +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_ */