[dpdk-dev] A question about GRO neighbor packet matching

Stephen Hemminger stephen at networkplumber.org
Wed Dec 6 19:12:00 CET 2017


On Wed, 6 Dec 2017 18:02:21 +0400
Ilya Matveychikov <matvejchikov at gmail.com> wrote:

> Hello all,
> 
> 
> My question is about neighbor packet matching algorithm for TCP. Is it
> correct to expect that IP packets should have continuous ID enumeration
> (i.e. iph-next.id = iph-prev.id + 1)?


No.

> ~~~
> lib/librte_gro/gro_tcp4.c:check_seq_option()
> 	...
> 	/* check if the two packets are neighbors */
> 	tcp_dl0 = pkt0->pkt_len - pkt0->l2_len - pkt0->l3_len - tcp_hl0;
> 	if ((sent_seq == (item->sent_seq + tcp_dl0)) &&
> 			(ip_id == (item->ip_id + 1)))
> 		/* append the new packet */
> 		return 1;
> 	else if (((sent_seq + tcp_dl) == item->sent_seq) &&
> 			((ip_id + item->nb_merged) == item->ip_id))
> 		/* pre-pend the new packet */
> 		return -1;
> 	else
> 		return 0;
> ~~~
> 
> As per RFC791:
> 
>   Identification:  16 bits
> 
>     An identifying value assigned by the sender to aid in assembling the
>     fragments of a datagram.

The IP header id is meaningless in most TCP sessions.
Good TCP implementations use PMTU discovery which sets the Don't Fragment bit.
With DF, the IP id is unused (since no fragmentation).
Many implementations just send 0 since generating unique IP id requires an
atomic operation which is potential bottleneck.


More information about the dev mailing list