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?
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]
