History

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.

Matthias Schiffer committed 8 years ago

Commit a163dc21 parent d7625f91 file · +2 −11Browse files

Showing the changes to include/uapi/linux (1 of 1 file). Show all

Unified · Split

include/uapi/linux/batadv_packet.h+2−11
@@ -196,8 +196,6 @@ struct batadv_bla_claim_dst { · 195 unmodified lines
196 __be16 group; /* group id */196 __be16 group; /* group id */
197};197};
198 198
199#pragma pack()
200
201/**199/**
202 * struct batadv_ogm_packet - ogm (routing protocol) packet200 * struct batadv_ogm_packet - ogm (routing protocol) packet
203 * @packet_type: batman-adv packet type, part of the general header201 * @packet_type: batman-adv packet type, part of the general header
@@ -222,9 +220,6 @@ struct batadv_ogm_packet { · 18 unmodified lines
222 __u8 reserved;220 __u8 reserved;
223 __u8 tq;221 __u8 tq;
224 __be16 tvlv_len;222 __be16 tvlv_len;
225 /* __packed is not needed as the struct size is divisible by 4,
226 * and the largest data type in this struct has a size of 4.
227 */
228};223};
229 224
230#define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet)225#define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet)
@@ -249,9 +244,6 @@ struct batadv_ogm2_packet { · 18 unmodified lines
249 __u8 orig[ETH_ALEN];244 __u8 orig[ETH_ALEN];
250 __be16 tvlv_len;245 __be16 tvlv_len;
251 __be32 throughput;246 __be32 throughput;
252 /* __packed is not needed as the struct size is divisible by 4,
253 * and the largest data type in this struct has a size of 4.
254 */
255};247};
256 248
257#define BATADV_OGM2_HLEN sizeof(struct batadv_ogm2_packet)249#define BATADV_OGM2_HLEN sizeof(struct batadv_ogm2_packet)
@@ -405,7 +397,6 @@ struct batadv_icmp_packet_rr { · 147 unmodified lines
405 * misalignment of the payload after the ethernet header. It may also lead to397 * misalignment of the payload after the ethernet header. It may also lead to
406 * leakage of information when the padding it not initialized before sending.398 * leakage of information when the padding it not initialized before sending.
407 */399 */
408#pragma pack(2)
409 400
410/**401/**
411 * struct batadv_unicast_packet - unicast packet for network payload402 * struct batadv_unicast_packet - unicast packet for network payload
@@ -533,8 +524,6 @@ struct batadv_coded_packet { · 121 unmodified lines
533 __be16 coded_len;524 __be16 coded_len;
534};525};
535 526
536#pragma pack()
537
538/**527/**
539 * struct batadv_unicast_tvlv_packet - generic unicast packet with tvlv payload528 * struct batadv_unicast_tvlv_packet - generic unicast packet with tvlv payload
540 * @packet_type: batman-adv packet type, part of the general header529 * @packet_type: batman-adv packet type, part of the general header
@@ -641,4 +630,6 @@ struct batadv_tvlv_mcast_data { · 100 unmodified lines
641 __u8 reserved[3];630 __u8 reserved[3];
642};631};
643 632
633#pragma pack()
634
644#endif /* _UAPI_LINUX_BATADV_PACKET_H_ */635#endif /* _UAPI_LINUX_BATADV_PACKET_H_ */