On Thu, Nov 17, 2022 at 10:53 AM Heng Qi <[email protected]> wrote: > > > > 在 2022/11/17 上午7:32, Yuri Benditovich 写道: > > I would suggest to specify also the hash type the device should report > > in case the hash reporting feature is enabled. For example, should the > > device specify somehow in the report that the hash was calculated on > > the inner header or on the regular header? > > It seems unnecessary. The calculation of RSS hash using the regular or > inner header is actually > transparent to the driver, and after the hash value and hash type > calculated by the device, > the feedback on skb is that skb only has L4 or L3 hash boolean type.
I think what Yuri meant is what if the user wants to calculate hash based on the inner header? Do we need VIRTIO_NET_HASH_TYPE_GRE_XXX? Thanks > > Thanks. > > > > > On Thu, Nov 10, 2022 at 5:41 AM Heng Qi <[email protected]> wrote: > >> > >> > >> 在 2022/11/10 上午11:35, Jason Wang 写道: > >>> On Wed, Nov 9, 2022 at 7:33 PM Heng Qi <[email protected]> wrote: > >>>> From: Heng Qi <[email protected]> > >>>> > >>>> When VIRTIO_NET_F_RSS is negotiated and the tunnel is used to > >>>> encapsulate the packets, the hash calculated using the outer header > >>>> of the receive packets is always fixed for the same flow packets, > >>>> i.e. they will be steered to the same receive queue. > >>>> > >>>> We add a VIRTIO_NET_HASH_TYPE_GRE_INNER bitmask in \field{hash_types}, > >>>> which instructs the device to calculate the hash using the inner headers > >>>> of GRE-encapsulated packets. > >>>> > >>>> Signed-off-by: Heng Qi <[email protected]> > >>>> Signed-off-by: Xuan Zhuo <[email protected]> > >>>> --- > >>>> content.tex | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > >>>> 1 file changed, 116 insertions(+) > >>>> > >>>> diff --git a/content.tex b/content.tex > >>>> index 6fabf1d..319d401 100644 > >>>> --- a/content.tex > >>>> +++ b/content.tex > >>>> @@ -3883,6 +3883,10 @@ \subsubsection{Processing of Incoming > >>>> Packets}\label{sec:Device Types / Network > >>>> #define VIRTIO_NET_HASH_TYPE_TCP_EX (1 << 7) > >>>> #define VIRTIO_NET_HASH_TYPE_UDP_EX (1 << 8) > >>>> \end{lstlisting} > >>>> +Hash types applicable to inner payloads of GRE-encapsulated packets > >>>> +\begin{lstlisting} > >>>> +#define VIRTIO_NET_HASH_TYPE_GRE_INNER (1 << 9) > >>>> +\end{lstlisting} > >>>> > >>>> \subparagraph{IPv4 packets} > >>>> \label{sec:Device Types / Network Device / Device Operation / > >>>> Processing of Incoming Packets / Hash calculation for incoming packets / > >>>> IPv4 packets} > >>>> @@ -3975,6 +3979,114 @@ \subsubsection{Processing of Incoming > >>>> Packets}\label{sec:Device Types / Network > >>>> (see \ref{sec:Device Types / Network Device / Device Operation / > >>>> Processing of Incoming Packets / Hash calculation for incoming packets / > >>>> IPv6 packets without extension header}). > >>>> \end{itemize} > >>>> > >>>> +\subparagraph{Inner payloads of GRE-encapsulated packets} > >>>> +\label{sec:Device Types / Network Device / Device Operation / > >>>> Processing of Incoming Packets / Hash calculation for incoming packets / > >>>> Inner payloads of GRE-encapsulated packets}} > >>>> +VIRTIO_NET_HASH_TYPE_GRE_INNER bit MUST be set at the same time as one > >>>> of > >>>> +the bits between VIRTIO_NET_HASH_TYPE_IPv4 and > >>>> VIRTIO_NET_HASH_TYPE_UDP_EX. > >>> "MUST" keyword must belong to the normative section. > >> Okay. Thanks for pointing out. > >> > >>>> + > >>>> +The device calculates the hash on GRE-encapsulated packets whose inner > >>>> payloads > >>>> +are IPv4 packets according to 'Enabled hash types' bitmasks as follows: > >>>> +\begin{itemize} > >>>> + \item If both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_TCPv4 bits > >>>> + are set, and the GRE-encapsulated packet has an inner TCPv4 > >>>> header in its > >>>> + payload, the hash is calculated over the following fields: > >>>> + \begin{itemsize} > >>>> + \item Inner source IP address > >>>> + \item Inner destination IP address > >>>> + \item Inner source TCP port > >>>> + \item Inner destination TCP port > >>>> + \end{itemsize} > >>>> + \item Else if both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_UDPv4 > >>>> + bits are set, and the GRE-encapsulated packet has an inner UDPv4 > >>>> header in > >>>> + its payload, the hash is calculated over the following fields: > >>>> + \begin{itemsize} > >>>> + \item Inner source IP address > >>>> + \item Inner destination IP address > >>>> + \item Inner source UDP port > >>>> + \item Inner destination UDP port > >>>> + \end{itemize} > >>>> + \item Else if both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_IPv4 > >>>> + bits are set, the hash is calculated over the following fields: > >>>> + \begin{itemsize} > >>>> + \item Inner source IP address > >>>> + \item Inner destination IP address > >>>> + \end{itemsize} > >>>> + \item Else the device does not calculate the hash > >>>> +\end{itemize} > >>>> + > >>>> +The device calculates the hash on GRE-encapsulated packets whose inner > >>>> payloads > >>>> +are IPv6 packets without extension headers according to 'Enabled hash > >>>> types' > >>>> +bitmasks as follows: > >>>> +\begin{itemsize} > >>>> + \item If both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_TCPv6 > >>>> + bits are set, and the GRE-encapsulated packet has an inner TCPv6 > >>>> header in > >>>> + its payload, the hash is calculated over the following fields: > >>>> + \begin{itemsize} > >>>> + \item Inner source IPv6 address > >>>> + \item Inner destination IPv6 address > >>>> + \item Inner source TCP port > >>>> + \item Inner destination TCP port > >>>> + \end{itemsize} > >>>> + \item Else if both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_UDPv6 > >>>> + bits are set, and the GRE-encapsulated packet has an inner UDPv6 > >>>> header in > >>>> + its payload, the hash is calculated over the following fields: > >>>> + \begin{itemsize} > >>>> + \item Inner source IPv6 address > >>>> + \item Inner destination IPv6 address > >>>> + \item Inner source UDP port > >>>> + \item Inner destination UDP port > >>>> + \end{itemize} > >>>> + \item Else if both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_IPv6 > >>>> + bits are set, the hash is calculated over the following fields: > >>>> + \begin{itemsize} > >>>> + \item Inner source IPv6 address > >>>> + \item Inner destination IPv6 address > >>>> + \end{itemsize} > >>>> + \item Else the device does not calculate the hash > >>>> +\end{itemize} > >>>> + > >>>> +The device calculates the hash on GRE-encapsulated packets whose inner > >>>> payloads > >>>> +are IPv6 packets with extension headers according to 'Enabled hash > >>>> types' > >>>> +bitmasks as follows: > >>>> +\begin{itemsize} > >>>> + \item If both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_TCP_EX > >>>> + bits are set, and the GRE-encapsulated packet has an inner TCPv6 > >>>> header in > >>>> + its payload, the hash is calculated over the following fields: > >>>> + \begin{itemize} > >>>> + \item Home address from the home address option in the IPv6 > >>>> destination options > >>> Is this inner or outer? > >>> > >>> Thanks > >>> > >>>> + header. If the extension header is not present, use the > >>>> Source IPv6 address. > >>>> + \item IPv6 address that is contained in the Routing-Header-Type-2 > >>>> from the > >>>> + associated extension header. If the extension header is not > >>>> present, use > >>>> + the Destination IPv6 address. > >>>> + \item Source TCP port > >>>> + \item Destination TCP port > >>>> + \end{itemize} > >>>> + \item Else if both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_UDP_EX > >>>> + bits are set, and the GRE-encapsulated packet has an inner UDPv6 > >>>> header in its > >>>> + payload, the hash is calculated over the following fields: > >>>> + \begin{itemsize} > >>>> + \item Home address from the home address option in the IPv6 > >>>> destination options > >>>> + header. If the extension header is not present, use the > >>>> Source IPv6 address. > >>>> + \item IPv6 address that is contained in the Routing-Header-Type-2 > >>>> from the > >>>> + associated extension header. If the extension header is not > >>>> present, use the > >>>> + Destination IPv6 address. > >>>> + \item Source UDP port > >>>> + \item Destination UDP port > >>>> + \end{itemize} > >>>> + \item Else if both VIRTIO_NET_HASH_TYPE_GRE_INNER and > >>>> VIRTIO_NET_HASH_TYPE_IP_EX > >>>> + bits are set, the hash is calculated over the following fields: > >>>> + \begin{itemsize} > >>>> + \item Home address from the home address option in the IPv6 > >>>> destination options > >>>> + header. If the extension header is not present, use the > >>>> Source IPv6 address. > >>>> + \item IPv6 address that is contained in the Routing-Header-Type-2 > >>>> from the > >>>> + associated extension header. If the extension header is not > >>>> present, use the > >>>> + Destination IPv6 address. > >>>> + \end{itemize} > >>>> + \item Else skip IPv6 extension headers and calculate the hash as > >>>> defined for > >>>> + a GRE-encapsulated packet whose inner payload is an IPv6 packet > >>>> without > >>>> + extension headers > >>>> +\end{itemsize} > >>>> + > >>>> \paragraph{Hash reporting for incoming packets} > >>>> \label{sec:Device Types / Network Device / Device Operation / > >>>> Processing of Incoming Packets / Hash reporting for incoming packets} > >>>> > >>>> @@ -4005,6 +4117,10 @@ \subsubsection{Processing of Incoming > >>>> Packets}\label{sec:Device Types / Network > >>>> #define VIRTIO_NET_HASH_REPORT_UDPv6_EX 9 > >>>> \end{lstlisting} > >>>> > >>>> +VIRTIO_NET_HASH_TYPE_GRE_INNER bit is not included in > >>>> \field{hash_report}, > >>>> +it just indicates that the hash is calculated using the inner header > >>>> inside > >>>> +the GRE-encapsulated packet. > >>>> + > >>>> \subsubsection{Control Virtqueue}\label{sec:Device Types / Network > >>>> Device / Device Operation / Control Virtqueue} > >>>> > >>>> The driver uses the control virtqueue (if VIRTIO_NET_F_CTRL_VQ is > >>>> -- > >>>> 2.19.1.6.gb485710b > >>>> > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [email protected] > >> For additional commands, e-mail: [email protected] > >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
