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
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 15:27:28 +0800 [thread overview] Message-ID: <dbad21ff524e119f83ae4444d1ae393ab165fa7c.1602574012.git.lucien.xin@gmail.com> (raw) Message-ID: <20201013072728.eaK2UZFJKEdF0woFs1gKMrW4OMWUm75TxqwtdSTqc4I@z> (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
next prev parent reply other threads:[~2020-10-13 7:27 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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).