Skip to content

Commit a163dc2

Browse files
neocturnesimonwunderlich
authored andcommitted
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 <[email protected]> Signed-off-by: Sven Eckelmann <[email protected]> Signed-off-by: Simon Wunderlich <[email protected]>
1 parent d7625f9 commit a163dc2

File tree

1 file changed

+2
-11
lines changed

1 file changed

+2
-11
lines changed

include/uapi/linux/batadv_packet.h

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,6 @@ struct batadv_bla_claim_dst {
196196
__be16 group; /* group id */
197197
};
198198

199-
#pragma pack()
200-
201199
/**
202200
* struct batadv_ogm_packet - ogm (routing protocol) packet
203201
* @packet_type: batman-adv packet type, part of the general header
@@ -222,9 +220,6 @@ struct batadv_ogm_packet {
222220
__u8 reserved;
223221
__u8 tq;
224222
__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-
*/
228223
};
229224

230225
#define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet)
@@ -249,9 +244,6 @@ struct batadv_ogm2_packet {
249244
__u8 orig[ETH_ALEN];
250245
__be16 tvlv_len;
251246
__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-
*/
255247
};
256248

257249
#define BATADV_OGM2_HLEN sizeof(struct batadv_ogm2_packet)
@@ -405,7 +397,6 @@ struct batadv_icmp_packet_rr {
405397
* misalignment of the payload after the ethernet header. It may also lead to
406398
* leakage of information when the padding it not initialized before sending.
407399
*/
408-
#pragma pack(2)
409400

410401
/**
411402
* struct batadv_unicast_packet - unicast packet for network payload
@@ -533,8 +524,6 @@ struct batadv_coded_packet {
533524
__be16 coded_len;
534525
};
535526

536-
#pragma pack()
537-
538527
/**
539528
* struct batadv_unicast_tvlv_packet - generic unicast packet with tvlv payload
540529
* @packet_type: batman-adv packet type, part of the general header
@@ -641,4 +630,6 @@ struct batadv_tvlv_mcast_data {
641630
__u8 reserved[3];
642631
};
643632

633+
#pragma pack()
634+
644635
#endif /* _UAPI_LINUX_BATADV_PACKET_H_ */

0 commit comments

Comments
 (0)