ixgbe: ixgbe_atr() bug fixes
Subsystems (3)
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(-)
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
@@ -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
RFC PATCH v3 2/2 ixgbe: ixgbe_atr() compute l4_proto only if non-paged data has network/transport headers
In reply to Sowmini VaradhanFor 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
@@ -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
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_atrmay be passed down ansk_buffthat 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 thel4_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_protobased Tx steering is desired.Signed-off-by Sowmini Varadhan <[email protected]>
This all looks correct to me. I would recommend having Jeff pull it in to be submitted to the net queue.
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_atrmay be passed down ansk_buffthat 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 thel4_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_protobased Tx steering is desired.
Quoted 6 lines
Quoted 1 line
Signed-off-by Sowmini Varadhan <[email protected]>This all looks correct to me.??I would recommend having Jeff pull it in to be submitted to the net queue.
Reviewed-by Alexander Duyck <[email protected]>
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>
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
Reviewed-by Alexander Duyck <[email protected]>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
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
Reviewed-by Alexander Duyck <[email protected]>?
Sowmini, can you re-submit this to intel-wired-lan but without the RFCin
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>