Skip to contentSkip to conversation

ixgbe: ixgbe_atr() bug fixes

RFC PATCH In review Sowmini Varadhan 3 participants 7 messages Oct 17, 2016

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

v3 cover ixgbe: ixgbe_atr() bug fixes

Two bug fixes:
- ixgbe_atr() should check for protocol == udp in the skb->encapsulation case (instead of !=)
- ixgbe_atr() should make sure the non-paged data has the needed network/transport header for computing l4_proto.

v3: Alex Duyck comments

Sowmini Varadhan (2):
ixgbe: ixgbe_atr() should access udp_hdr(skb) only for UDP packets
ixgbe: ixgbe_atr() compute l4_proto only if non-paged data has
network/transport headers

 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |   19 ++++++++++++++++++-
 1 files changed, 18 insertions(+), 1 deletions(-)
#1 lore raw

RFC PATCH v3 1/2 ixgbe: ixgbe_atr() should access udp_hdr(skb) only for UDP packets

Commit 9f12df906cd8 ("ixgbe: Store VXLAN port number in network order") incorrectly checks for hdr.ipv4->protocol != IPPROTO_UDP
in ixgbe_atr(). This check should be for "==" instead.

---
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +1 -1
index a244d9a..eceb47b 100644
@@ -7653,7 +7653,7 @@ static void ixgbe_atr(struct ixgbe_ring *ring,
 	hdr.network = skb_network_header(skb);
 	if (skb->encapsulation &&
 	    first->protocol == htons(ETH_P_IP) &&
-	    hdr.ipv4->protocol != IPPROTO_UDP) {
+	    hdr.ipv4->protocol == IPPROTO_UDP) {
 		struct ixgbe_adapter *adapter = q_vector->adapter;
 
 		/* verify the port is recognized as VXLAN */
Signature · 1 line
1.7.1
#2 lore raw

RFC PATCH v3 2/2 ixgbe: ixgbe_atr() compute l4_proto only if non-paged data has network/transport headers

In reply to Sowmini Varadhan

For some Tx paths (e.g., tpacket_snd()), ixgbe_atr may be passed down an sk_buff that has the network and transport header in the paged data, so it needs to make sure these headers are available in the headlen bytes to calculate the l4_proto.

This patch expect that network and transport headers are already available in the non-paged header dat. The assumption is that the caller has set this up if l4_proto based Tx steering is desired.

---
v3: add unlikely(); remove needless check for hdr.network against
skb_tail_pointer(); refactor check to make sure we have tcp header in non-paged part.

 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +17 -0
index eceb47b..a9d2b0c 100644
@@ -54,6 +54,7 @@
 #include <net/pkt_cls.h>
 #include <net/tc_act/tc_gact.h>
 #include <net/tc_act/tc_mirred.h>
+#include <net/vxlan.h>
 
 #include "ixgbe.h"
 #include "ixgbe_common.h"
@@ -7651,11 +7652,17 @@ static void ixgbe_atr(struct ixgbe_ring *ring,
 	/* snag network header to get L4 type and address */
 	skb = first->skb;
 	hdr.network = skb_network_header(skb);
+	if (unlikely(hdr.network <= skb->data))
+		return;
 	if (skb->encapsulation &&
 	    first->protocol == htons(ETH_P_IP) &&
 	    hdr.ipv4->protocol == IPPROTO_UDP) {
 		struct ixgbe_adapter *adapter = q_vector->adapter;
 
+		if (unlikely(skb_tail_pointer(skb) < hdr.network +
+					    VXLAN_HEADROOM))
+			return;
+
 		/* verify the port is recognized as VXLAN */
 		if (adapter->vxlan_port &&
 		    udp_hdr(skb)->dest == adapter->vxlan_port)
@@ -7666,6 +7673,12 @@ static void ixgbe_atr(struct ixgbe_ring *ring,
 			hdr.network = skb_inner_network_header(skb);
 	}
 
+	/* Make sure we have at least [minimum IPv4 header + TCP]
+	 * or [IPv6 header] bytes
+	 */
+	if (unlikely(skb_tail_pointer(skb) < hdr.network + 40))
+		return;
+
 	/* Currently only IPv4/IPv6 with TCP is supported */
 	switch (hdr.ipv4->version) {
 	case IPVERSION:
@@ -7685,6 +7698,10 @@ static void ixgbe_atr(struct ixgbe_ring *ring,
 	if (l4_proto != IPPROTO_TCP)
 		return;
 
+	if (unlikely(skb_tail_pointer(skb) < hdr.network +
+					     hlen + sizeof(struct tcphdr)))
+			return;
+
 	th = (struct tcphdr *)(hdr.network + hlen);
 
 	/* skip this packet since the socket is closing */
Signature · 1 line
1.7.1
Reviewed-by on v3 2/2
#3 lore raw

Re: [Intel-wired-lan] [PATCH V3 RFC 2/2] ixgbe: ixgbe_atr() compute l4_proto only if non-paged data has network/transport headers

Quoted 6 lines · Sowmini Varadhan

For some Tx paths (e.g., tpacket_snd()), ixgbe_atr may be passed down an sk_buff that has the network and transport header in the paged data, so it needs to make sure these headers are available in the headlen bytes to calculate the l4_proto.

Quoted 6 lines

This patch expect that network and transport headers are already available in the non-paged header dat. The assumption is that the caller has set this up if l4_proto based Tx steering is desired.

This all looks correct to me. I would recommend having Jeff pull it in to be submitted to the net queue.

#4 lore raw

Re: [Intel-wired-lan] [PATCH V3 RFC 2/2] ixgbe: ixgbe_atr() compute l4_proto only if non-paged data has network/transport headers

Quoted 14 lines · Alexander Duyck
Quoted 12 lines · Sowmini Varadhan

For some Tx paths (e.g., tpacket_snd()), ixgbe_atr may be passed down an sk_buff that has the network and transport header in the paged data, so it needs to make sure these headers are available in the headlen bytes to calculate the l4_proto.

This patch expect that network and transport headers are already available in the non-paged header dat.??The assumption is that the caller has set this up if l4_proto based Tx steering is desired.

Quoted 6 lines
Quoted 1 line

This all looks correct to me.??I would recommend having Jeff pull it in to be submitted to the net queue.

Sowmini, can you re-submit this to intel-wired-lan but without the RFC in
the title?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20161017/55d2f638/attachment.asc>

#5 lore raw

Re: [Intel-wired-lan] [PATCH V3 RFC 2/2] ixgbe: ixgbe_atr() compute l4_proto only if non-paged data has network/transport headers

Quoted 4 lines · Jeff Kirsher
Quoted 1 line

Sowmini, can you re-submit this to intel-wired-lan but without the RFC in the title?

V4 resubmitted.. I think I just inadvertently forgot to add Alex as the reviewed-by.. could you please fix that (or I can resubmit v5 if needed).

--Sowmini

#6 lore raw

Re: [Intel-wired-lan] [PATCH V3 RFC 2/2] ixgbe: ixgbe_atr() compute l4_proto only if non-paged data has network/transport headers

Quoted 9 lines · Sowmini Varadhan
Quoted 3 lines · Jeff Kirsher
Quoted 1 line

?
Sowmini, can you re-submit this to intel-wired-lan but without the RFC

in

Quoted 1 line

the title?

V4 resubmitted.. I think I just inadvertently forgot to add Alex as the reviewed-by.. could you please fix that (or I can resubmit v5 if needed).

No need to resubmit, I can make sure Alex's reviewed-by gets added.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20161017/cedd4193/attachment-0001.asc>