Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Jan 2018 09:26:31 +0000
From:      Steven Hartland <steven@multiplay.co.uk>
To:        Eugene Grosbein <eugen@grosbein.net>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r327559 - in head: . sys/net
Message-ID:  <c42bfb9e-e583-aca3-bf0d-4d92c0153d2f@multiplay.co.uk>
In-Reply-To: <5A4EDC62.50508@grosbein.net>
References:  <201801042005.w04K5liB049411@repo.freebsd.org> <5A4E9397.9000308@grosbein.net> <f133b587-1f7e-4594-31d1-974775ad55be@freebsd.org> <5A4EDC62.50508@grosbein.net>

index | next in thread | previous in thread | raw e-mail


On 05/01/2018 02:01, Eugene Grosbein wrote:
> 05.01.2018 4:52, Steven Hartland wrote:
>
>>> RSS by definition has meaning to received stream. What is "outbound" stream
>>> in this context, why can the hash calculatiom method change and what exactly
>>> does it mean "a stream being incorrectly split"?
>> Yes RSS is indeed a received stream but that is used by lagg for lacp and loadbalance protocols
>> to decide which port of the lagg to "send" the packet out of.
>> As the flowid is not known when a new "output" stream is instigated the current code
>> falls back to manual hash calculation to determine which port to send the initial packet from.
>> Once a response is received a tx then uses the flowid.
>> This change of hash calculation method can result in the initial packet being sent
>> from a different port than the rest of the stream; this is what I meant by "incorrectly split".
>>
>> See the following:
>> https://github.com/freebsd/freebsd/blob/master/sys/net/if_lagg.c#L2066
>> https://github.com/freebsd/freebsd/blob/master/sys/net/ieee8023ad_lacp.c#L846
> I still do not get what is "output stream" for you.
>
> If you are talking on forwarding (routing) transit packets at IP layer,
> they all have flowid from the beginning and first packet does not differ from others at all.
At the simplest level its a tcp stream that is started from the host. So 
given we have hostA (src) and hostB (dest), the output stream is one 
started by hostA with a destination of hostB where hostA is configured 
with lagg.

In this case with use_flowid we've confirmed we get the following (the 
interfaces used vary per flow of cause):
hostA - SYN (ix0)       -> hostB # Manual hash calculated
hostB - SYN,ACK (ix0)   -> hostA# flowid used
hostA - ACK (ix1)       -> hostB # flowid used
hostA - Data(ix1)       -> hostB # flowid used
hostB - ACK (ix0)       -> hostA # flowid used
...

Here hostA and hostB both had lagg0 comprising of ix0 and ix1.

I believe your referring to packets flowing through the physical 
interface, if so then this is too late as for LACP the flowid would need 
to be per-calculated for the first packet in order to make the decision 
on which port to send it on. Unless I'm missing something, this is a 
chicken and egg situation.

> If you are talking on locally originated (not transit) data streem from local TCP socket
> being sent in response to corresponding incoming TCP segments, then these outgoing
> packets should have their own fixed flow id by default in case of LACP
> and thhis flow id should not depend on (possibly ever changing) flow id of incoming TCP segments.
Nope in this case we have all the information needed, but I don't 
believe we can't tell that's the case.
> If you insist that flow id of outgoing packets does depend on ever changing incoming packet's flow id,
> then this is the bug that should be fixed and not lagg's defaults.
As detailed above once the session is established then the flowid 
remains fixed.

     Regards
     Steve


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?c42bfb9e-e583-aca3-bf0d-4d92c0153d2f>