Commit 55c1528f authored by Edward Cree's avatar Edward Cree Committed by Jakub Kicinski

sfc: fix field-spanning memcpy in selftest

Add a struct_group for the whole packet body so we can copy it in one
 go without triggering FORTIFY_SOURCE complaints.

Fixes: cf60ed46 ("sfc: use padding to fix alignment in loopback test")
Fixes: 30c24dd8 ("sfc: siena: use padding to fix alignment in loopback test")
Fixes: 1186c6b3 ("sfc: falcon: use padding to fix alignment in loopback test")
Reviewed-by: default avatarAndy Moreton <andy.moreton@amd.com>
Tested-by: default avatarAndy Moreton <andy.moreton@amd.com>
Signed-off-by: default avatarEdward Cree <ecree.xilinx@gmail.com>
Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
Link: https://lore.kernel.org/r/20230728165528.59070-1-edward.cree@amd.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d4480c9b
...@@ -40,15 +40,16 @@ ...@@ -40,15 +40,16 @@
*/ */
struct ef4_loopback_payload { struct ef4_loopback_payload {
char pad[2]; /* Ensures ip is 4-byte aligned */ char pad[2]; /* Ensures ip is 4-byte aligned */
struct ethhdr header; struct_group_attr(packet, __packed,
struct iphdr ip; struct ethhdr header;
struct udphdr udp; struct iphdr ip;
__be16 iteration; struct udphdr udp;
char msg[64]; __be16 iteration;
char msg[64];
);
} __packed __aligned(4); } __packed __aligned(4);
#define EF4_LOOPBACK_PAYLOAD_LEN (sizeof(struct ef4_loopback_payload) - \ #define EF4_LOOPBACK_PAYLOAD_LEN \
offsetof(struct ef4_loopback_payload, \ sizeof_field(struct ef4_loopback_payload, packet)
header))
/* Loopback test source MAC address */ /* Loopback test source MAC address */
static const u8 payload_source[ETH_ALEN] __aligned(2) = { static const u8 payload_source[ETH_ALEN] __aligned(2) = {
...@@ -299,7 +300,7 @@ void ef4_loopback_rx_packet(struct ef4_nic *efx, ...@@ -299,7 +300,7 @@ void ef4_loopback_rx_packet(struct ef4_nic *efx,
payload = &state->payload; payload = &state->payload;
memcpy(&received.header, buf_ptr, memcpy(&received.packet, buf_ptr,
min_t(int, pkt_len, EF4_LOOPBACK_PAYLOAD_LEN)); min_t(int, pkt_len, EF4_LOOPBACK_PAYLOAD_LEN));
received.ip.saddr = payload->ip.saddr; received.ip.saddr = payload->ip.saddr;
if (state->offload_csum) if (state->offload_csum)
...@@ -370,7 +371,7 @@ void ef4_loopback_rx_packet(struct ef4_nic *efx, ...@@ -370,7 +371,7 @@ void ef4_loopback_rx_packet(struct ef4_nic *efx,
buf_ptr, pkt_len, 0); buf_ptr, pkt_len, 0);
netif_err(efx, drv, efx->net_dev, "expected packet:\n"); netif_err(efx, drv, efx->net_dev, "expected packet:\n");
print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1, print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,
&state->payload.header, EF4_LOOPBACK_PAYLOAD_LEN, &state->payload.packet, EF4_LOOPBACK_PAYLOAD_LEN,
0); 0);
} }
#endif #endif
...@@ -440,6 +441,8 @@ static int ef4_begin_loopback(struct ef4_tx_queue *tx_queue) ...@@ -440,6 +441,8 @@ static int ef4_begin_loopback(struct ef4_tx_queue *tx_queue)
payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2)); payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2));
/* Strip off the leading padding */ /* Strip off the leading padding */
skb_pull(skb, offsetof(struct ef4_loopback_payload, header)); skb_pull(skb, offsetof(struct ef4_loopback_payload, header));
/* Strip off the trailing padding */
skb_trim(skb, EF4_LOOPBACK_PAYLOAD_LEN);
/* Ensure everything we've written is visible to the /* Ensure everything we've written is visible to the
* interrupt handler. */ * interrupt handler. */
......
...@@ -43,15 +43,16 @@ ...@@ -43,15 +43,16 @@
*/ */
struct efx_loopback_payload { struct efx_loopback_payload {
char pad[2]; /* Ensures ip is 4-byte aligned */ char pad[2]; /* Ensures ip is 4-byte aligned */
struct ethhdr header; struct_group_attr(packet, __packed,
struct iphdr ip; struct ethhdr header;
struct udphdr udp; struct iphdr ip;
__be16 iteration; struct udphdr udp;
char msg[64]; __be16 iteration;
char msg[64];
);
} __packed __aligned(4); } __packed __aligned(4);
#define EFX_LOOPBACK_PAYLOAD_LEN (sizeof(struct efx_loopback_payload) - \ #define EFX_LOOPBACK_PAYLOAD_LEN \
offsetof(struct efx_loopback_payload, \ sizeof_field(struct efx_loopback_payload, packet)
header))
/* Loopback test source MAC address */ /* Loopback test source MAC address */
static const u8 payload_source[ETH_ALEN] __aligned(2) = { static const u8 payload_source[ETH_ALEN] __aligned(2) = {
...@@ -297,7 +298,7 @@ void efx_loopback_rx_packet(struct efx_nic *efx, ...@@ -297,7 +298,7 @@ void efx_loopback_rx_packet(struct efx_nic *efx,
payload = &state->payload; payload = &state->payload;
memcpy(&received.header, buf_ptr, memcpy(&received.packet, buf_ptr,
min_t(int, pkt_len, EFX_LOOPBACK_PAYLOAD_LEN)); min_t(int, pkt_len, EFX_LOOPBACK_PAYLOAD_LEN));
received.ip.saddr = payload->ip.saddr; received.ip.saddr = payload->ip.saddr;
if (state->offload_csum) if (state->offload_csum)
...@@ -368,7 +369,7 @@ void efx_loopback_rx_packet(struct efx_nic *efx, ...@@ -368,7 +369,7 @@ void efx_loopback_rx_packet(struct efx_nic *efx,
buf_ptr, pkt_len, 0); buf_ptr, pkt_len, 0);
netif_err(efx, drv, efx->net_dev, "expected packet:\n"); netif_err(efx, drv, efx->net_dev, "expected packet:\n");
print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1, print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,
&state->payload.header, EFX_LOOPBACK_PAYLOAD_LEN, &state->payload.packet, EFX_LOOPBACK_PAYLOAD_LEN,
0); 0);
} }
#endif #endif
...@@ -438,6 +439,8 @@ static int efx_begin_loopback(struct efx_tx_queue *tx_queue) ...@@ -438,6 +439,8 @@ static int efx_begin_loopback(struct efx_tx_queue *tx_queue)
payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2)); payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2));
/* Strip off the leading padding */ /* Strip off the leading padding */
skb_pull(skb, offsetof(struct efx_loopback_payload, header)); skb_pull(skb, offsetof(struct efx_loopback_payload, header));
/* Strip off the trailing padding */
skb_trim(skb, EFX_LOOPBACK_PAYLOAD_LEN);
/* Ensure everything we've written is visible to the /* Ensure everything we've written is visible to the
* interrupt handler. */ * interrupt handler. */
......
...@@ -43,15 +43,16 @@ ...@@ -43,15 +43,16 @@
*/ */
struct efx_loopback_payload { struct efx_loopback_payload {
char pad[2]; /* Ensures ip is 4-byte aligned */ char pad[2]; /* Ensures ip is 4-byte aligned */
struct ethhdr header; struct_group_attr(packet, __packed,
struct iphdr ip; struct ethhdr header;
struct udphdr udp; struct iphdr ip;
__be16 iteration; struct udphdr udp;
char msg[64]; __be16 iteration;
char msg[64];
);
} __packed __aligned(4); } __packed __aligned(4);
#define EFX_LOOPBACK_PAYLOAD_LEN (sizeof(struct efx_loopback_payload) - \ #define EFX_LOOPBACK_PAYLOAD_LEN \
offsetof(struct efx_loopback_payload, \ sizeof_field(struct efx_loopback_payload, packet)
header))
/* Loopback test source MAC address */ /* Loopback test source MAC address */
static const u8 payload_source[ETH_ALEN] __aligned(2) = { static const u8 payload_source[ETH_ALEN] __aligned(2) = {
...@@ -297,7 +298,7 @@ void efx_siena_loopback_rx_packet(struct efx_nic *efx, ...@@ -297,7 +298,7 @@ void efx_siena_loopback_rx_packet(struct efx_nic *efx,
payload = &state->payload; payload = &state->payload;
memcpy(&received.header, buf_ptr, memcpy(&received.packet, buf_ptr,
min_t(int, pkt_len, EFX_LOOPBACK_PAYLOAD_LEN)); min_t(int, pkt_len, EFX_LOOPBACK_PAYLOAD_LEN));
received.ip.saddr = payload->ip.saddr; received.ip.saddr = payload->ip.saddr;
if (state->offload_csum) if (state->offload_csum)
...@@ -368,7 +369,7 @@ void efx_siena_loopback_rx_packet(struct efx_nic *efx, ...@@ -368,7 +369,7 @@ void efx_siena_loopback_rx_packet(struct efx_nic *efx,
buf_ptr, pkt_len, 0); buf_ptr, pkt_len, 0);
netif_err(efx, drv, efx->net_dev, "expected packet:\n"); netif_err(efx, drv, efx->net_dev, "expected packet:\n");
print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1, print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,
&state->payload.header, EFX_LOOPBACK_PAYLOAD_LEN, &state->payload.packet, EFX_LOOPBACK_PAYLOAD_LEN,
0); 0);
} }
#endif #endif
...@@ -438,6 +439,8 @@ static int efx_begin_loopback(struct efx_tx_queue *tx_queue) ...@@ -438,6 +439,8 @@ static int efx_begin_loopback(struct efx_tx_queue *tx_queue)
payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2)); payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2));
/* Strip off the leading padding */ /* Strip off the leading padding */
skb_pull(skb, offsetof(struct efx_loopback_payload, header)); skb_pull(skb, offsetof(struct efx_loopback_payload, header));
/* Strip off the trailing padding */
skb_trim(skb, EFX_LOOPBACK_PAYLOAD_LEN);
/* Ensure everything we've written is visible to the /* Ensure everything we've written is visible to the
* interrupt handler. */ * interrupt handler. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment