public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
From: Felix Fietkau <nbd@nbd.name>
To: Paolo Abeni <pabeni@redhat.com>,
	netdev@vger.kernel.org, Eric Dumazet <edumazet@google.com>,
	"David S. Miller" <davem@davemloft.net>,
	David Ahern <dsahern@kernel.org>,
	Jakub Kicinski <kuba@kernel.org>
Cc: willemdebruijn.kernel@gmail.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 net-next v3 2/6] net: add support for segmenting TCP fraglist GSO packets
Date: Fri, 26 Apr 2024 11:39:31 +0200	[thread overview]
Message-ID: <9350b6f7-abd8-45c5-931a-62f48a50bee4@nbd.name> (raw)
In-Reply-To: <5a95fea4156b492eb19124bb33b21be81766c617.camel@redhat.com>

On 26.04.24 10:28, Paolo Abeni wrote:
> On Fri, 2024-04-26 at 08:51 +0200, Felix Fietkau wrote:
>> Preparation for adding TCP fraglist GRO support. It expects packets to be
>> combined in a similar way as UDP fraglist GSO packets.
>> For IPv4 packets, NAT is handled in the same way as UDP fraglist GSO.
>> 
>> Signed-off-by: Felix Fietkau <nbd@nbd.name>
>> ---
>>  net/ipv4/tcp_offload.c   | 65 ++++++++++++++++++++++++++++++++++++++++
>>  net/ipv6/tcpv6_offload.c |  3 ++
>>  2 files changed, 68 insertions(+)
>> 
>> diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c
>> index fab0973f995b..c493e95e09a5 100644
>> --- a/net/ipv4/tcp_offload.c
>> +++ b/net/ipv4/tcp_offload.c
>> @@ -28,6 +28,68 @@ static void tcp_gso_tstamp(struct sk_buff *skb, unsigned int ts_seq,
>>  	}
>>  }
>>  
>> +static void __tcpv4_gso_segment_csum(struct sk_buff *seg,
>> +				     __be32 *oldip, __be32 *newip,
>> +				     __be16 *oldport, __be16 *newport)
>> +{
>> +	struct tcphdr *th;
>> +	struct iphdr *iph;
>> +
>> +	if (*oldip == *newip && *oldport == *newport)
>> +		return;
>> +
>> +	th = tcp_hdr(seg);
>> +	iph = ip_hdr(seg);
>> +
>> +	inet_proto_csum_replace4(&th->check, seg, *oldip, *newip, true);
>> +	inet_proto_csum_replace2(&th->check, seg, *oldport, *newport, false);
>> +	*oldport = *newport;
>> +
>> +	csum_replace4(&iph->check, *oldip, *newip);
>> +	*oldip = *newip;
>> +}
>> +
>> +static struct sk_buff *__tcpv4_gso_segment_list_csum(struct sk_buff *segs)
>> +{
>> +	struct sk_buff *seg;
>> +	struct tcphdr *th, *th2;
>> +	struct iphdr *iph, *iph2;
>> +
>> +	seg = segs;
>> +	th = tcp_hdr(seg);
>> +	iph = ip_hdr(seg);
>> +	th2 = tcp_hdr(seg->next);
>> +	iph2 = ip_hdr(seg->next);
>> +
>> +	if (!(*(u32 *)&th->source ^ *(u32 *)&th2->source) &&
>> +	    iph->daddr == iph2->daddr && iph->saddr == iph2->saddr)
>> +		return segs;
> 
> As mentioned in previous revisions, I think a problem with this
> approach is that the stack could make other changes to the TCP header
> after the GRO stage, that are unnoticed here and could cause csum
> corruption, if the egress device does not recompute the packet csum.

On segmentation, each packet keeps its original TCP header and csum. If 
the stack makes changes, they apply to the first packet only. I don't 
see how we could get csum corruption.

- Felix

  reply	other threads:[~2024-04-26  9:39 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-26  6:51 [PATCH v3 net-next v3 0/6] Add TCP fraglist GRO support Felix Fietkau
2024-04-26  6:51 ` [PATCH v3 net-next v3 1/6] net: move skb_gro_receive_list from udp to core Felix Fietkau
2024-04-26  7:33   ` Eric Dumazet
2024-04-26  6:51 ` [PATCH v3 net-next v3 2/6] net: add support for segmenting TCP fraglist GSO packets Felix Fietkau
2024-04-26  7:44   ` Eric Dumazet
2024-04-26  9:28     ` Felix Fietkau
2024-04-26  8:28   ` Paolo Abeni
2024-04-26  9:39     ` Felix Fietkau [this message]
2024-04-26 10:40       ` Paolo Abeni
2024-04-26 11:35         ` Felix Fietkau
2024-04-26  6:51 ` [PATCH v3 net-next v3 3/6] net: add code for TCP fraglist GRO Felix Fietkau
2024-04-26  7:47   ` Eric Dumazet
2024-04-26  9:44     ` Felix Fietkau
2024-04-26  8:21   ` Paolo Abeni
2024-04-26  9:41     ` Felix Fietkau
2024-04-26  6:51 ` [PATCH v3 net-next v3 4/6] net: create tcp_gro_lookup helper function Felix Fietkau
2024-04-26  7:25   ` Eric Dumazet
2024-04-26  6:51 ` [PATCH v3 net-next v3 5/6] net: create tcp_gro_header_pull " Felix Fietkau
2024-04-26  7:27   ` Eric Dumazet
2024-04-26  6:51 ` [PATCH v3 net-next v3 6/6] net: add heuristic for enabling TCP fraglist GRO Felix Fietkau
2024-04-26  7:32   ` Eric Dumazet
2024-04-26  9:21     ` Felix Fietkau

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=9350b6f7-abd8-45c5-931a-62f48a50bee4@nbd.name \
    --to=nbd@nbd.name \
    --cc=davem@davemloft.net \
    --cc=dsahern@kernel.org \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox