All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xin Long <lucien.xin@gmail.com>
To: network dev <netdev@vger.kernel.org>, linux-sctp@vger.kernel.org
Cc: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>,
	Neil Horman <nhorman@tuxdriver.com>,
	Michael Tuexen <tuexen@fh-muenster.de>,
	davem@davemloft.net, gnault@redhat.com, pabeni@redhat.com,
	willemdebruijn.kernel@gmail.com
Subject: [PATCHv3 net-next 03/16] udp: support sctp over udp in skb_udp_tunnel_segment
Date: Tue, 13 Oct 2020 15:27:28 +0800	[thread overview]
Message-ID: <dbad21ff524e119f83ae4444d1ae393ab165fa7c.1602574012.git.lucien.xin@gmail.com> (raw)
In-Reply-To: <c01a9a09096cb1b292d461aa5a1e72aae2ca942a.1602574012.git.lucien.xin@gmail.com>
In-Reply-To: <cover.1602574012.git.lucien.xin@gmail.com>

For the gso of sctp over udp packets, sctp_gso_segment() will be called in
skb_udp_tunnel_segment(), we need to set transport_header to sctp header.

As all the current HWs can't handle both crc checksum and udp checksum at
the same time, the crc checksum has to be done in sctp_gso_segment() by
removing the NETIF_F_SCTP_CRC flag from the features.

Meanwhile, if the HW can't do udp checksum, csum and csum_start has to be
set correctly, and udp checksum will be done in __skb_udp_tunnel_segment()
by calling gso_make_checksum().

Thanks to Paolo, Marcelo and Guillaume for helping with this one.

v1->v2:
  - no change.
v2->v3:
  - remove the he NETIF_F_SCTP_CRC flag from the features.
  - set csum and csum_start in sctp_gso_make_checksum().

Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 net/ipv4/udp_offload.c | 3 +++
 net/sctp/offload.c     | 6 +++++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index e67a66f..4d31255 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -49,6 +49,7 @@ static struct sk_buff *__skb_udp_tunnel_segment(struct sk_buff *skb,
 	__skb_pull(skb, tnl_hlen);
 	skb_reset_mac_header(skb);
 	skb_set_network_header(skb, skb_inner_network_offset(skb));
+	skb_set_transport_header(skb, skb_inner_transport_offset(skb));
 	skb->mac_len = skb_inner_network_offset(skb);
 	skb->protocol = new_protocol;
 
@@ -67,6 +68,8 @@ static struct sk_buff *__skb_udp_tunnel_segment(struct sk_buff *skb,
 				      (NETIF_F_HW_CSUM | NETIF_F_IP_CSUM))));
 
 	features &= skb->dev->hw_enc_features;
+	/* CRC checksum can't be handled by HW when it's a udp tunneling packet. */
+	features &= ~NETIF_F_SCTP_CRC;
 
 	/* The only checksum offload we care about from here on out is the
 	 * outer one so strip the existing checksum feature flags and
diff --git a/net/sctp/offload.c b/net/sctp/offload.c
index 74847d6..9f6f818 100644
--- a/net/sctp/offload.c
+++ b/net/sctp/offload.c
@@ -27,7 +27,11 @@ static __le32 sctp_gso_make_checksum(struct sk_buff *skb)
 {
 	skb->ip_summed = CHECKSUM_NONE;
 	skb->csum_not_inet = 0;
-	gso_reset_checksum(skb, ~0);
+	/* csum and csum_start in gso cb may be needed to do the udp
+	 * checksum when it's a udp tunneling packet.
+	 */
+	SKB_GSO_CB(skb)->csum = (__force __wsum)~0;
+	SKB_GSO_CB(skb)->csum_start = skb_headroom(skb) + skb->len;
 	return sctp_compute_cksum(skb, skb_transport_offset(skb));
 }
 
-- 
2.1.0


WARNING: multiple messages have this Message-ID (diff)
From: Xin Long <lucien.xin@gmail.com>
To: network dev <netdev@vger.kernel.org>, linux-sctp@vger.kernel.org
Cc: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>,
	Neil Horman <nhorman@tuxdriver.com>,
	Michael Tuexen <tuexen@fh-muenster.de>,
	davem@davemloft.net, gnault@redhat.com, pabeni@redhat.com,
	willemdebruijn.kernel@gmail.com
Subject: [PATCHv3 net-next 03/16] udp: support sctp over udp in skb_udp_tunnel_segment
Date: Tue, 13 Oct 2020 07:27:28 +0000	[thread overview]
Message-ID: <dbad21ff524e119f83ae4444d1ae393ab165fa7c.1602574012.git.lucien.xin@gmail.com> (raw)
In-Reply-To: <c01a9a09096cb1b292d461aa5a1e72aae2ca942a.1602574012.git.lucien.xin@gmail.com>

For the gso of sctp over udp packets, sctp_gso_segment() will be called in
skb_udp_tunnel_segment(), we need to set transport_header to sctp header.

As all the current HWs can't handle both crc checksum and udp checksum at
the same time, the crc checksum has to be done in sctp_gso_segment() by
removing the NETIF_F_SCTP_CRC flag from the features.

Meanwhile, if the HW can't do udp checksum, csum and csum_start has to be
set correctly, and udp checksum will be done in __skb_udp_tunnel_segment()
by calling gso_make_checksum().

Thanks to Paolo, Marcelo and Guillaume for helping with this one.

v1->v2:
  - no change.
v2->v3:
  - remove the he NETIF_F_SCTP_CRC flag from the features.
  - set csum and csum_start in sctp_gso_make_checksum().

Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 net/ipv4/udp_offload.c | 3 +++
 net/sctp/offload.c     | 6 +++++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index e67a66f..4d31255 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -49,6 +49,7 @@ static struct sk_buff *__skb_udp_tunnel_segment(struct sk_buff *skb,
 	__skb_pull(skb, tnl_hlen);
 	skb_reset_mac_header(skb);
 	skb_set_network_header(skb, skb_inner_network_offset(skb));
+	skb_set_transport_header(skb, skb_inner_transport_offset(skb));
 	skb->mac_len = skb_inner_network_offset(skb);
 	skb->protocol = new_protocol;
 
@@ -67,6 +68,8 @@ static struct sk_buff *__skb_udp_tunnel_segment(struct sk_buff *skb,
 				      (NETIF_F_HW_CSUM | NETIF_F_IP_CSUM))));
 
 	features &= skb->dev->hw_enc_features;
+	/* CRC checksum can't be handled by HW when it's a udp tunneling packet. */
+	features &= ~NETIF_F_SCTP_CRC;
 
 	/* The only checksum offload we care about from here on out is the
 	 * outer one so strip the existing checksum feature flags and
diff --git a/net/sctp/offload.c b/net/sctp/offload.c
index 74847d6..9f6f818 100644
--- a/net/sctp/offload.c
+++ b/net/sctp/offload.c
@@ -27,7 +27,11 @@ static __le32 sctp_gso_make_checksum(struct sk_buff *skb)
 {
 	skb->ip_summed = CHECKSUM_NONE;
 	skb->csum_not_inet = 0;
-	gso_reset_checksum(skb, ~0);
+	/* csum and csum_start in gso cb may be needed to do the udp
+	 * checksum when it's a udp tunneling packet.
+	 */
+	SKB_GSO_CB(skb)->csum = (__force __wsum)~0;
+	SKB_GSO_CB(skb)->csum_start = skb_headroom(skb) + skb->len;
 	return sctp_compute_cksum(skb, skb_transport_offset(skb));
 }
 
-- 
2.1.0

  reply	other threads:[~2020-10-13  7:28 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-13  7:27 [PATCHv3 net-next 00/16] sctp: Implement RFC6951: UDP Encapsulation of SCTP Xin Long
2020-10-13  7:27 ` Xin Long
2020-10-13  7:27 ` [PATCHv3 net-next 01/16] udp: check udp sock encap_type in __udp_lib_err Xin Long
2020-10-13  7:27   ` Xin Long
2020-10-13  7:27   ` [PATCHv3 net-next 02/16] udp6: move the mss check after udp gso tunnel processing Xin Long
2020-10-13  7:27     ` Xin Long
2020-10-13  7:27     ` Xin Long [this message]
2020-10-13  7:27       ` [PATCHv3 net-next 03/16] udp: support sctp over udp in skb_udp_tunnel_segment Xin Long
2020-10-13  7:27       ` [PATCHv3 net-next 04/16] sctp: create udp4 sock and add its encap_rcv Xin Long
2020-10-13  7:27         ` Xin Long
2020-10-13  7:27         ` [PATCHv3 net-next 05/16] sctp: create udp6 sock and set " Xin Long
2020-10-13  7:27           ` Xin Long
2020-10-13  7:27           ` [PATCHv3 net-next 06/16] sctp: add encap_err_lookup for udp encap socks Xin Long
2020-10-13  7:27             ` Xin Long
2020-10-13  7:27             ` [PATCHv3 net-next 07/16] sctp: add encap_port for netns sock asoc and transport Xin Long
2020-10-13  7:27               ` Xin Long
2020-10-13  7:27               ` [PATCHv3 net-next 08/16] sctp: add SCTP_REMOTE_UDP_ENCAPS_PORT sockopt Xin Long
2020-10-13  7:27                 ` Xin Long
2020-10-13  7:27                 ` [PATCHv3 net-next 09/16] sctp: allow changing transport encap_port by peer packets Xin Long
2020-10-13  7:27                   ` Xin Long
2020-10-13  7:27                   ` [PATCHv3 net-next 10/16] sctp: add udphdr to overhead when udp_port is set Xin Long
2020-10-13  7:27                     ` Xin Long
2020-10-13  7:27                     ` [PATCHv3 net-next 11/16] sctp: call sk_setup_caps in sctp_packet_transmit instead Xin Long
2020-10-13  7:27                       ` Xin Long
2020-10-13  7:27                       ` [PATCHv3 net-next 12/16] sctp: support for sending packet over udp4 sock Xin Long
2020-10-13  7:27                         ` Xin Long
2020-10-13  7:27                         ` [PATCHv3 net-next 13/16] sctp: support for sending packet over udp6 sock Xin Long
2020-10-13  7:27                           ` Xin Long
2020-10-13  7:27                           ` [PATCHv3 net-next 14/16] sctp: add the error cause for new encapsulation port restart Xin Long
2020-10-13  7:27                             ` Xin Long
2020-10-13  7:27                             ` [PATCHv3 net-next 15/16] sctp: handle the init chunk matching an existing asoc Xin Long
2020-10-13  7:27                               ` Xin Long
2020-10-13  7:27                               ` [PATCHv3 net-next 16/16] sctp: enable udp tunneling socks Xin Long
2020-10-13  7:27                                 ` Xin Long
2020-10-15 17:42                                 ` Marcelo Ricardo Leitner
2020-10-15 17:42                                   ` Marcelo Ricardo Leitner
2020-10-15 21:23                                   ` David Laight
2020-10-15 21:35                                     ` Michael Tuexen
2020-10-15 21:35                                       ` Michael Tuexen
2020-10-16  7:08                                   ` Xin Long
2020-10-16  7:08                                     ` Xin Long
2020-10-19 10:40                                     ` Xin Long
2020-10-19 10:40                                       ` Xin Long
2020-10-13 17:19     ` [PATCHv3 net-next 02/16] udp6: move the mss check after udp gso tunnel processing Willem de Bruijn
2020-10-13 17:19       ` Willem de Bruijn
2020-10-15  3:34 ` [PATCHv3 net-next 00/16] sctp: Implement RFC6951: UDP Encapsulation of SCTP Jakub Kicinski
2020-10-15  3:34   ` Jakub Kicinski
2020-10-15 12:41   ` Marcelo Ricardo Leitner
2020-10-15 12:41     ` Marcelo Ricardo Leitner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=dbad21ff524e119f83ae4444d1ae393ab165fa7c.1602574012.git.lucien.xin@gmail.com \
    --to=lucien.xin@gmail.com \
    --cc=davem@davemloft.net \
    --cc=gnault@redhat.com \
    --cc=linux-sctp@vger.kernel.org \
    --cc=marcelo.leitner@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=nhorman@tuxdriver.com \
    --cc=pabeni@redhat.com \
    --cc=tuexen@fh-muenster.de \
    --cc=willemdebruijn.kernel@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.