Thread (17 messages) 17 messages, 4 authors, 2014-02-27

Re: net/mlx4_en: Pad ethernet packets smaller than 17 bytes

From: Amir Vadai <hidden>
Date: 2014-02-27 14:02:09

On 27/02/14 13:08 +0000, David Laight wrote:
From: Amir Vadai
quoted
Hardware can't accept packets smaller than 17 bytes. Therefore need to pad with
zeros.
Can they actually happen?
A 16 byte packet would only have 2 bytes following the ethertype/length.
The shortest LLC packets have 3 bytes.
Raw sockets might send such packets and it will put the HW into
unstable state.
It may well be safe to discard them.
Yep - that another option.
...
quoted
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index 8dc7637..268cc4a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -585,12 +585,19 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk
 	int spc = MLX4_INLINE_ALIGN - CTRL_SIZE - sizeof *inl;

 	if (skb->len <= spc) {
-		inl->byte_count = cpu_to_be32(1 << 31 | skb->len);
+		inl->byte_count = cpu_to_be32(1 << 31 |
+					      max_t(typeof(skb->len),
+						    skb->len,
+						    MIN_PKT_LEN));
 		skb_copy_from_linear_data(skb, inl + 1, skb_headlen(skb));
 		if (skb_shinfo(skb)->nr_frags)
 			memcpy(((void *)(inl + 1)) + skb_headlen(skb), fragptr,
 			       skb_frag_size(&skb_shinfo(skb)->frags[0]));
Is there guaranteed to be only 1 fragment here?
Yes, skb will not be classified as inline-able if nr_frags != 1.
See is_inline()
quoted
+		if (skb->len < MIN_PKT_LEN)
+			memset(((void *)(inl + 1)) + skb->len, 0,
+			       MIN_PKT_LEN - skb->len);
+
In any case you don't want 2 checks for skb->len < MIN_PKT_LEN,
so reassign to inl->byte_count here.
An unlikely() probably wouldn't go amiss either.
Right - will fix it for V1
	David
Thanks,
Amir
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help