svn commit: r327559 - in head: . sys/net

Eugene Grosbein eugen at grosbein.net
Fri Jan 5 17:16:54 UTC 2018


05.01.2018 22:42, 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.
>> It should be:
>>
>> hostA - SYN (ix0)       -> hostB # Manual hash (1) calculated
>> hostB - SYN,ACK (ix0)   -> hostA# hardware flowid (2) received
>> hostA - ACK (ix1)       -> hostB # Manual hash (1) calculated
>> hostA - Data(ix1)       -> hostB # hardware flowid (2 or 3) received
>> hostB - ACK (ix0)       -> hostA # Manual hash (1) calculated

Hmm, yes, here I was mistaken.

hostA - SYN (ix0)       -> hostB # Manual hash (1) calculated
hostB - SYN,ACK (ix0)   -> hostA # hardware flowid (2) received
hostA - ACK (ix1)       -> hostB # Manual hash (1) calculated
hostA - Data(ix1)       -> hostB # Manual hash (1) calculated
hostB - ACK (ix0)       -> hostA # hardware flowid (2 or 3) received

>> That is, there is no guarantee of persistance of flowid of incoming packets
>> as they can be received with distinct ports of lagg being distinct hardware
>> computing flowid differently. Some ports may not support RSS at all.
>> We should not use incoming hardware flowid for anything by default in case of TCP.
> I don't believe your statement about persistence of flowid due to the use of variant ports is correct
> as LACP states that packets from the same flow "should" under normal conditions (no failure) be received on the same port.

It still does not guarantee that and you miss opportunity of network failures that can easily change flowid of incoming packets.

> In the case where the HW doesn't support RSS, then flowid should either always be unset or be set by OS to consistent value hence that should function as expected.
> 
> That said I don't disagree that all hostA -> hostB should use Manual hash, as I can't see anyway to use to HW hash,
> however the ports in your example are wrong

Yes, I stand corrected (just copied your example and adjusted it incompletly).

>> Why do you mix flowid of incoming stream with flowid of outgoing stream?
>>
> I expect this was done so we don't have the overhead of calculating a packet hash for every outgoing packet
> i.e. its an optimization, however I believe this is only possible for the destination host which always
> has a valid flowid, and not for the source host.

How do you know that flowid of incoming packet is preserved on outgoing path? It should not.



More information about the svn-src-head mailing list