From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: virtio-comment-return-1066-cohuck=redhat.com@lists.oasis-open.org Sender: List-Post: List-Help: List-Unsubscribe: List-Subscribe: Received: from lists.oasis-open.org (oasis-open.org [10.110.1.242]) by lists.oasis-open.org (Postfix) with ESMTP id 3CE3F985EAA for ; Wed, 19 Feb 2020 11:07:27 +0000 (UTC) Date: Wed, 19 Feb 2020 06:07:13 -0500 (EST) From: Yuri Benditovich Message-ID: <1841911156.7222325.1582110433680.JavaMail.zimbra@redhat.com> In-Reply-To: <20200219040122-mutt-send-email-mst@kernel.org> References: <20200219075337.23191-1-yuri.benditovich@daynix.com> <20200219075337.23191-2-yuri.benditovich@daynix.com> <20200219040122-mutt-send-email-mst@kernel.org> MIME-Version: 1.0 Subject: Re: [virtio-comment] Re: [PATCH v4 1/1] virtio-net: Define per-packet hash reporting feature Content-Type: multipart/alternative; boundary="----=_Part_7222324_139510119.1582110433679" To: "Michael S. Tsirkin" Cc: Yuri Benditovich , virtio-comment@lists.oasis-open.org List-ID: ------=_Part_7222324_139510119.1582110433679 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable ----- Original Message ----- > From: "Michael S. Tsirkin" > To: "Yuri Benditovich" > Cc: virtio-comment@lists.oasis-open.org > Sent: Wednesday, February 19, 2020 11:12:40 AM > Subject: [virtio-comment] Re: [PATCH v4 1/1] virtio-net: Define per-packe= t > hash reporting feature > On Wed, Feb 19, 2020 at 09:53:37AM +0200, Yuri Benditovich wrote: > > Fixes: https://github.com/oasis-tcs/virtio-spec/issues/66 > > Define respective feature bit for virtio-net. > > Extend packet layout to populate hash value and type. > > Move the definition of IP/TCP/UDP header fields to > > calculate the hash out of RSS section to common network > > device section. > > > > Signed-off-by: Yuri Benditovich > > --- > > content.tex | 347 ++++++++++++++++++++++++++++++++++------------------ > > 1 file changed, 229 insertions(+), 118 deletions(-) > > > > diff --git a/content.tex b/content.tex > > index b91a132..d7d4e42 100644 > > --- a/content.tex > > +++ b/content.tex > > @@ -2895,6 +2895,9 @@ \subsection{Feature bits}\label{sec:Device Types = / > > Network Device / Feature bits > > \item[VIRTIO_NET_F_CTRL_MAC_ADDR(23)] Set MAC address through control > > channel. > > > > +\item[VIRTIO_NET_F_HASH_REPORT(57)] Device can report per-packet hash > > + value and a type of calculated hash. > > + > > \item[VIRTIO_NET_F_GUEST_HDRLEN(59)] Driver can provide the exact > > \field{hdr_len} > > value. Device benefits from knowing the exact header length. > > > > @@ -2995,35 +2998,17 @@ \subsection{Device configuration > > layout}\label{sec:Device Types / Network Device > > le32 supported_hash_types; > > }; > > \end{lstlisting} > > -\label{sec:Device Types / Network Device / Device configuration layout= / > > RSS} > > -Three following fields, \field{rss_max_key_size}, > > \field{rss_max_indirection_table_length} > > -and \field{supported_hash_types} only exist if VIRTIO_NET_F_RSS is set= . > > +The following field, \field{rss_max_key_size} only exist if > > VIRTIO_NET_F_RSS or VIRTIO_NET_F_HASH_REPORT is set. > > +It specifies the maximal supported length of RSS key in bytes. > > > > -Field \field{rss_max_key_size} specifies the maximal supported length = of > > RSS key in bytes. > > +The following field, \field{rss_max_indirection_table_length} only exi= st > > if VIRTIO_NET_F_RSS is set. > > +It specifies the maximal number of 16-bit entries in RSS indirection > > table. > > > > -Field \field{rss_max_indirection_table_length} specifies the maximal > > number of 16-bit entries in RSS indirection table. > > +The next field, \field{supported_hash_types} exists only if the device > > supports hash calculation, > > +i.e. if VIRTIO_NET_F_RSS or VIRTIO_NET_F_HASH_REPORT is set. > > > > -Field \field{supported_hash_types} contains the bitmask of supported R= SS > > hash types. > > - > > -Hash types applicable for IPv4 packets: > > -\begin{lstlisting} > > -#define VIRTIO_NET_RSS_HASH_TYPE_IPv4 (1 << 0) > > -#define VIRTIO_NET_RSS_HASH_TYPE_TCPv4 (1 << 1) > > -#define VIRTIO_NET_RSS_HASH_TYPE_UDPv4 (1 << 2) > > -\end{lstlisting} > > -Hash types applicable for IPv6 packets without extension headers > > -\begin{lstlisting} > > -#define VIRTIO_NET_RSS_HASH_TYPE_IPv6 (1 << 3) > > -#define VIRTIO_NET_RSS_HASH_TYPE_TCPv6 (1 << 4) > > -#define VIRTIO_NET_RSS_HASH_TYPE_UDPv6 (1 << 5) > > -\end{lstlisting} > > -Hash types applicable for IPv6 packets with extension headers > > -\begin{lstlisting} > > -#define VIRTIO_NET_RSS_HASH_TYPE_IP_EX (1 << 6) > > -#define VIRTIO_NET_RSS_HASH_TYPE_TCP_EX (1 << 7) > > -#define VIRTIO_NET_RSS_HASH_TYPE_UDP_EX (1 << 8) > > -\end{lstlisting} > > -For the exact meaning of VIRTIO_NET_RSS_HASH_TYPE_ flags see > > \ref{sec:Device Types / Network Device / Device Operation / Control > > Virtqueue / Receive-side scaling (RSS) / RSS hash types}. > > +Field \field{supported_hash_types} contains the bitmask of supported h= ash > > types. > > +See \ref{sec:Device Types / Network Device / Device Operation / Proces= sing > > of Incoming Packets / Hash calculation for incoming packets / > > Supported/enabled hash types} for details of supported hash types. > > > > \devicenormative{\subsubsection}{Device configuration layout}{Device Ty= pes > > / Network Device / Device configuration layout} > > > > @@ -3048,7 +3033,7 @@ \subsection{Device configuration > > layout}\label{sec:Device Types / Network Device > > negotiated. > > > > The device MUST set \field{rss_max_key_size} to at least 40, if it offe= rs > > -VIRTIO_NET_F_RSS. > > +VIRTIO_NET_F_RSS or VIRTIO_NET_F_HASH_REPORT. > > > > The device MUST set \field{rss_max_indirection_table_length} to at leas= t > > 128, if it offers > > VIRTIO_NET_F_RSS. > > @@ -3195,6 +3180,8 @@ \subsection{Device Operation}\label{sec:Device Ty= pes > > / Network Device / Device O > > le16 csum_start; > > le16 csum_offset; > > le16 num_buffers; > > + le32 hash_value; (Only if VIRTIO_NET_F_HASH_REPORT negotiated) > > + le16 hash_type; (Only if VIRTIO_NET_F_HASH_REPORT negotiated) > > }; > Just noticed this - it's a bit problematic as it might force > compilers to add 2 bytes of padding at the end. Let's add extra 2 bytes > of padding explicitly? OK, no problem=20 > > \end{lstlisting} > > > > @@ -3517,6 +3504,12 @@ \subsubsection{Processing of Incoming > > Packets}\label{sec:Device Types / Network > > > > \end{enumerate} > > > > +If applicable, the device calculates per-packet hash for incoming pack= ets > > as > > +defined in \ref{sec:Device Types / Network Device / Device Operation / > > Processing of Incoming Packets / Hash calculation for incoming packets}= . > > + > > +If applicable, the device reports hash information for incoming packet= s as > > +defined in \ref{sec:Device Types / Network Device / Device Operation / > > Processing of Incoming Packets / Hash reporting for incoming packets}. > > + > > \devicenormative{\paragraph}{Processing of Incoming Packets}{Device Typ= es / > > Network Device / Device Operation / Processing of Incoming Packets} > > \label{devicenormative:Device Types / Network Device / Device Operation= / > > Processing of Packets}%old label for latexdiff > > > > @@ -3619,6 +3612,181 @@ \subsubsection{Processing of Incoming > > Packets}\label{sec:Device Types / Network > > If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor > > VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT > > rely on the packet checksum being correct. > > + > > +\paragraph{Hash calculation for incoming packets} > > +\label{sec:Device Types / Network Device / Device Operation / Processi= ng > > of Incoming Packets / Hash calculation for incoming packets} > > + > > +A device attempts to calculate a per-packet hash in the following case= s: > > +\begin{itemize} > > +\item The feature VIRTIO_NET_F_RSS was negotiated. The device uses the > > hash to determine the receive virtqueue to place incoming packets. > > +\item The feature VIRTIO_NET_F_HASH_REPORT was negotiated. The device > > reports the hash value and the hash type with the packet. > > +\end{itemize} > > + > > +If the feature VIRTIO_NET_F_RSS was negotiated: > > +\begin{itemize} > > +\item The device uses \field{hash_types} of the virtio_net_rss_config > > structure as 'Enabled hash types' bitmask. > > +\item The device uses a key as defined in \field{hash_key_data} and > > \field{hash_key_length} of the virtio_net_rss_config structure (see > > +\ref{sec:Device Types / Network Device / Device Operation / Control > > Virtqueue / Receive-side scaling (RSS) / Setting RSS parameters}). > > +\end{itemize} > > + > > +If the feature VIRTIO_NET_F_RSS was not negotiated: > > +\begin{itemize} > > +\item The device uses \field{hash_types} of the virtio_net_hash_config > > structure as 'Enabled hash types' bitmask. > > +\item The device uses a key as defined in \field{hash_key_data} and > > \field{hash_key_length} of the virtio_net_hash_config structure (see > > +\ref{sec:Device Types / Network Device / Device Operation / Control > > Virtqueue / Automatic receive steering in multiqueue mode / Hash > > calculation}). > > +\end{itemize} > > + > > +Note that if the device offers VIRTIO_NET_F_HASH_REPORT, even if it > > supports only one pair of virtqueues, it MUST support > > +at least one of commands of VIRTIO_NET_CTRL_MQ class to configure repo= rted > > hash parameters: > > +\begin{itemize} > > +\item If the device offers VIRTIO_NET_F_RSS, it MUST support > > VIRTIO_NET_CTRL_MQ_RSS_CONFIG command per > > + \ref{sec:Device Types / Network Device / Device Operation / Control > > Virtqueue / Receive-side scaling (RSS) / Setting RSS parameters}. > > +\item Otherwise the device MUST support VIRTIO_NET_CTRL_MQ_HASH_CONFIG > > command per > > + \ref{sec:Device Types / Network Device / Device Operation / Control > > Virtqueue / Automatic receive steering in multiqueue mode / Hash > > calculation}. > > +\end{itemize} > > + > > +\subparagraph{Supported/enabled hash types} > > +\label{sec:Device Types / Network Device / Device Operation / Processi= ng > > of Incoming Packets / Hash calculation for incoming packets / > > Supported/enabled hash types} > > +Hash types applicable for IPv4 packets: > > +\begin{lstlisting} > > +#define VIRTIO_NET_HASH_TYPE_IPv4 (1 << 0) > > +#define VIRTIO_NET_HASH_TYPE_TCPv4 (1 << 1) > > +#define VIRTIO_NET_HASH_TYPE_UDPv4 (1 << 2) > > +\end{lstlisting} > > +Hash types applicable for IPv6 packets without extension headers > > +\begin{lstlisting} > > +#define VIRTIO_NET_HASH_TYPE_IPv6 (1 << 3) > > +#define VIRTIO_NET_HASH_TYPE_TCPv6 (1 << 4) > > +#define VIRTIO_NET_HASH_TYPE_UDPv6 (1 << 5) > > +\end{lstlisting} > > +Hash types applicable for IPv6 packets with extension headers > > +\begin{lstlisting} > > +#define VIRTIO_NET_HASH_TYPE_IP_EX (1 << 6) > > +#define VIRTIO_NET_HASH_TYPE_TCP_EX (1 << 7) > > +#define VIRTIO_NET_HASH_TYPE_UDP_EX (1 << 8) > > +\end{lstlisting} > > + > > +\subparagraph{IPv4 packets} > > +\label{sec:Device Types / Network Device / Device Operation / Processi= ng > > of Incoming Packets / Hash calculation for incoming packets / IPv4 > > packets} > > +The device calculates the hash on IPv4 packets according to 'Enabled h= ash > > types' bitmask as follows: > > +\begin{itemize} > > +\item If VIRTIO_NET_HASH_TYPE_TCPv4 is set and the packet has > > +a TCP header, the hash is calculated over the following fields: > > +\begin{itemize} > > +\item Source IP address > > +\item Destination IP address > > +\item Source TCP port > > +\item Destination TCP port > > +\end{itemize} > > +\item Else if VIRTIO_NET_HASH_TYPE_UDPv4 is set and the > > +packet has a UDP header, the hash is calculated over the following fie= lds: > > +\begin{itemize} > > +\item Source IP address > > +\item Destination IP address > > +\item Source UDP port > > +\item Destination UDP port > > +\end{itemize} > > +\item Else if VIRTIO_NET_HASH_TYPE_IPv4 is set, the hash is > > +calculated over the following fields: > > +\begin{itemize} > > +\item Source IP address > > +\item Destination IP address > > +\end{itemize} > > +\item Else the device does not calculate the hash > > +\end{itemize} > > + > > +\subparagraph{IPv6 packets without extension header} > > +\label{sec:Device Types / Network Device / Device Operation / Processi= ng > > of Incoming Packets / Hash calculation for incoming packets / IPv6 pack= ets > > without extension header} > > +The device calculates the hash on IPv6 packets without extension > > +headers according to 'Enabled hash types' bitmask as follows: > > +\begin{itemize} > > +\item If VIRTIO_NET_HASH_TYPE_TCPv6 is set and the packet has > > +a TCPv6 header, the hash is calculated over the following fields: > > +\begin{itemize} > > +\item Source IPv6 address > > +\item Destination IPv6 address > > +\item Source TCP port > > +\item Destination TCP port > > +\end{itemize} > > +\item Else if VIRTIO_NET_HASH_TYPE_UDPv6 is set and the > > +packet has a UDPv6 header, the hash is calculated over the following > > fields: > > +\begin{itemize} > > +\item Source IPv6 address > > +\item Destination IPv6 address > > +\item Source UDP port > > +\item Destination UDP port > > +\end{itemize} > > +\item Else if VIRTIO_NET_HASH_TYPE_IPv6 is set, the hash is > > +calculated over the following fields: > > +\begin{itemize} > > +\item Source IPv6 address > > +\item Destination IPv6 address > > +\end{itemize} > > +\item Else the device does not calculate the hash > > +\end{itemize} > > + > > +\subparagraph{IPv6 packets with extension header} > > +\label{sec:Device Types / Network Device / Device Operation / Processi= ng > > of Incoming Packets / Hash calculation for incoming packets / IPv6 pack= ets > > with extension header} > > +The device calculates the hash on IPv6 packets with extension > > +headers according to 'Enabled hash types' bitmask as follows: > > +\begin{itemize} > > +\item If VIRTIO_NET_HASH_TYPE_TCP_EX is set and the packet > > +has a TCPv6 header, the hash is calculated over the following fields: > > +\begin{itemize} > > +\item Home address from the home address option in the IPv6 destinatio= n > > 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, us= e > > the Destination IPv6 address. > > +\item Source TCP port > > +\item Destination TCP port > > +\end{itemize} > > +\item Else if VIRTIO_NET_HASH_TYPE_UDP_EX is set and the > > +packet has a UDPv6 header, the hash is calculated over the following > > fields: > > +\begin{itemize} > > +\item Home address from the home address option in the IPv6 destinatio= n > > 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, us= e > > the Destination IPv6 address. > > +\item Source UDP port > > +\item Destination UDP port > > +\end{itemize} > > +\item Else if VIRTIO_NET_HASH_TYPE_IP_EX is set, the hash is > > +calculated over the following fields: > > +\begin{itemize} > > +\item Home address from the home address option in the IPv6 destinatio= n > > 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, us= e > > the Destination IPv6 address. > > +\end{itemize} > > +\item Else skip IPv6 extension headers and calculate the hash as > > +defined for an IPv6 packet without extension headers > > +(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} > > + > > +\paragraph{Hash reporting for incoming packets} > > +\label{sec:Device Types / Network Device / Device Operation / Processi= ng > > of Incoming Packets / Hash reporting for incoming packets} > > + > > +If VIRTIO_NET_F_HASH_REPORT was negotiated and > > + the device has calculated the hash for the packet, the device fills > > \field{hash_type} with the type of calculated hash > > +and \field{hash_value} with the value of calculated hash. > > + > > +If VIRTIO_NET_F_HASH_REPORT was negotiated but due to any reason the > > +hash was not calculated, the device sets \field{hash_type} to > > VIRTIO_NET_HASH_REPORT_NONE. > > + > > +Possible values that the device can report in \field{hash_type} are > > defined below. > > +They correspond to supported hash types defined in > > +\ref{sec:Device Types / Network Device / Device Operation / Processing= of > > Incoming Packets / Hash calculation for incoming packets / > > Supported/enabled hash types} > > +as follows: > > + > > +VIRTIO_NET_HASH_TYPE_XXX =3D 1 << (VIRTIO_NET_HASH_REPORT_XXX - 1) > So hash_type is the HASH_REPORT value then? That's quite confusing. > Let's rename to hash_report? No problem to rename anything, but I'd like to do it one time.=20 Currently meaningful hash report values are (1..9), 0 for none=20 They correspond to bitmask of 9 bits for enabled/supported.=20 It was possible to use the same definitions for enable/support/report=20 but then reported kind of hash should be 4 bytes.=20 As you anyway suggests padding at the end of the packet, we can do that,=20 i.e. add (32 bit hash + 32 bit type)=20 Or if we stay with the values as they are now:=20 values 0..9 - VIRTIO_NET_WHAT?=20 bits from 0 to 8 - VIRTIO_NET_WHAT?=20 > > + > > +\begin{lstlisting} > > +#define VIRTIO_NET_HASH_REPORT_NONE 0 > > +#define VIRTIO_NET_HASH_REPORT_IPv4 1 > > +#define VIRTIO_NET_HASH_REPORT_TCPv4 2 > > +#define VIRTIO_NET_HASH_REPORT_UDPv4 3 > > +#define VIRTIO_NET_HASH_REPORT_IPv6 4 > > +#define VIRTIO_NET_HASH_REPORT_TCPv6 5 > > +#define VIRTIO_NET_HASH_REPORT_UDPv6 6 > > +#define VIRTIO_NET_HASH_REPORT_IPv6_EX 7 > > +#define VIRTIO_NET_HASH_REPORT_TCPv6_EX 8 > > +#define VIRTIO_NET_HASH_REPORT_UDPv6_EX 9 > > +\end{lstlisting} > > + > > \subsubsection{Control Virtqueue}\label{sec:Device Types / Network Devi= ce / > > Device Operation / Control Virtqueue} > > > > The driver uses the control virtqueue (if VIRTIO_NET_F_CTRL_VQ is > > @@ -3896,6 +4064,7 @@ \subsubsection{Control Virtqueue}\label{sec:Devic= e > > Types / Network Device / Devi > > #define VIRTIO_NET_CTRL_MQ 4 > > #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET 0 (for automatic receive steeri= ng) > > #define VIRTIO_NET_CTRL_MQ_RSS_CONFIG 1 (for configurable receive steer= ing) > > + #define VIRTIO_NET_CTRL_MQ_HASH_CONFIG 2 (for configurable hash > > calculation) > > \end{lstlisting} > > > > If more than one multiqueue mode is negotiated, the resulting device > > configuration is defined by the last command sent by the driver. > > @@ -3961,10 +4130,37 @@ \subsubsection{Control Virtqueue}\label{sec:Dev= ice > > Types / Network Device / Devi > > according to the native endian of the guest rather than > > (necessarily when not using the legacy interface) little-endian. > > > > +\subparagraph{Hash calculation}\label{sec:Device Types / Network Devic= e / > > Device Operation / Control Virtqueue / Automatic receive steering in > > multiqueue mode / Hash calculation} > > +If VIRTIO_NET_F_HASH_REPORT was negotiated and the device uses automat= ic > > receive steering, > > +the device MUST support a command to configure hash calculation > > parameters. > > + > > +The driver provides parameters for hash calculation as follows: > > + > > +\field{class} VIRTIO_NET_CTRL_MQ, \field{command} > > VIRTIO_NET_CTRL_MQ_HASH_CONFIG. > > + > > +The \field{command-specific-data} has following format: > > +\begin{lstlisting} > > +struct virtio_net_hash_config { > > + le32 hash_types; > > + le16 reserved[4]; > > + u8 hash_key_length; > > + u8 hash_key_data[hash_key_length]; > > +}; > > +\end{lstlisting} > > +Field \field{hash_types} contains a bitmask of allowed hash types as > > +defined in > > +\ref{sec:Device Types / Network Device / Device Operation / Processing= of > > Incoming Packets / Hash calculation for incoming packets / > > Supported/enabled hash types}. > > +Initially the device has all hash types disabled and reports only > > VIRTIO_NET_HASH_REPORT_NONE. > > + > > +Field \field{reserved} MUST contain zeroes. It is defined to make the > > structure to match the layout of virtio_net_rss_config structure, > > +defined in \ref{sec:Device Types / Network Device / Device Operation / > > Control Virtqueue / Receive-side scaling (RSS)}. > > + > > +Fields \field{hash_key_length} and \field{hash_key_data} define the ke= y to > > be used in hash calculation. > > + > > \paragraph{Receive-side scaling (RSS)}\label{sec:Device Types / Network > > Device / Device Operation / Control Virtqueue / Receive-side scaling > > (RSS)} > > A device offers the feature VIRTIO_NET_F_RSS if it supports RSS receive > > steering with Toeplitz hash calculation and configurable parameters. > > > > -A driver queries RSS capabilities of the device by reading device > > configuration as defined in \ref{sec:Device Types / Network Device / > > Device configuration layout / RSS} > > +A driver queries RSS capabilities of the device by reading device > > configuration as defined in \ref{sec:Device Types / Network Device / > > Device configuration layout} > > > > \subparagraph{Setting RSS parameters}\label{sec:Device Types / Network > > Device / Device Operation / Control Virtqueue / Receive-side scaling (R= SS) > > / Setting RSS parameters} > > > > @@ -3981,7 +4177,8 @@ \subsubsection{Control Virtqueue}\label{sec:Devic= e > > Types / Network Device / Devi > > }; > > \end{lstlisting} > > Field \field{hash_types} contains a bitmask of allowed hash types as > > -defined in \ref{sec:Device Types / Network Device / Device Operation / > > Control Virtqueue / Receive-side scaling (RSS) / RSS hash types}. > > +defined in > > +\ref{sec:Device Types / Network Device / Device Operation / Processing= of > > Incoming Packets / Hash calculation for incoming packets / > > Supported/enabled hash types}. > > > > Field \field{indirection_table_mask} is a mask to be applied to > > the calculated hash to produce an index in the > > @@ -3995,93 +4192,7 @@ \subsubsection{Control Virtqueue}\label{sec:Devi= ce > > Types / Network Device / Devi > > > > A driver sets \field{max_tx_vq} to inform a device how many transmit > > virtqueues it may use (transmitq1\ldots transmitq \field{max_tx_vq}). > > > > -\subparagraph{RSS hash types}\label{sec:Device Types / Network Device = / > > Device Operation / Control Virtqueue / Receive-side scaling (RSS) / RSS > > hash types} > > - > > -The device calculates the hash on IPv4 packets according to the > > -field \field{hash_types} of the virtio_net_rss_config structure as > > follows: > > -\begin{itemize} > > -\item If VIRTIO_NET_RSS_HASH_TYPE_TCPv4 is set and the packet has > > -a TCP header, the hash is calculated over the following fields: > > -\begin{itemize} > > -\item Source IP address > > -\item Destination IP address > > -\item Source TCP port > > -\item Destination TCP port > > -\end{itemize} > > -\item Else if VIRTIO_NET_RSS_HASH_TYPE_UDPv4 is set and the > > -packet has a UDP header, the hash is calculated over the following fie= lds: > > -\begin{itemize} > > -\item Source IP address > > -\item Destination IP address > > -\item Source UDP port > > -\item Destination UDP port > > -\end{itemize} > > -\item Else if VIRTIO_NET_RSS_HASH_TYPE_IPv4 is set, the hash is > > -calculated over the following fields: > > -\begin{itemize} > > -\item Source IP address > > -\item Destination IP address > > -\end{itemize} > > -\item Else the device does not calculate the hash > > -\end{itemize} > > - > > -\label{itm:Device Types / Network Device / Device Operation / Control > > Virtqueue / Receive-side scaling (RSS) / RSS hash types/hash on IPv6 > > packets without extension headers} > > -The device calculates the hash on IPv6 packets without extension > > -headers according to the field \field{hash_types} of the > > virtio_net_rss_config structure as follows: > > -\begin{itemize} > > -\item If VIRTIO_NET_RSS_HASH_TYPE_TCPv6 is set and the packet has > > -a TCPv6 header, the hash is calculated over the following fields: > > -\begin{itemize} > > -\item Source IPv6 address > > -\item Destination IPv6 address > > -\item Source TCP port > > -\item Destination TCP port > > -\end{itemize} > > -\item Else if VIRTIO_NET_RSS_HASH_TYPE_UDPv6 is set and the > > -packet has a UDPv6 header, the hash is calculated over the following > > fields: > > -\begin{itemize} > > -\item Source IPv6 address > > -\item Destination IPv6 address > > -\item Source UDP port > > -\item Destination UDP port > > -\end{itemize} > > -\item Else if VIRTIO_NET_RSS_HASH_TYPE_IPv6 is set, the hash is > > -calculated over the following fields: > > -\begin{itemize} > > -\item Source IPv6 address > > -\item Destination IPv6 address > > -\end{itemize} > > -\item Else the device does not calculate the hash > > -\end{itemize} > > - > > -The device calculates the hash on IPv6 packets with extension > > -headers according to the field \field{hash_types} of the > > virtio_net_rss_config structure as follows: > > -\begin{itemize} > > -\item If VIRTIO_NET_RSS_HASH_TYPE_TCP_EX is set and the packet > > -has a TCPv6 header, the hash is calculated over the following fields: > > -\begin{itemize} > > -\item Home address from the home address option in the IPv6 destinatio= n > > 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, us= e > > the Destination IPv6 address. > > -\item Source TCP port > > -\item Destination TCP port > > -\end{itemize} > > -\item Else if VIRTIO_NET_RSS_HASH_TYPE_UDP_EX is set and the > > -packet has a UDPv6 header, the hash is calculated over the following > > fields: > > -\begin{itemize} > > -\item Home address from the home address option in the IPv6 destinatio= n > > 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, us= e > > the Destination IPv6 address. > > -\item Source UDP port > > -\item Destination UDP port > > -\end{itemize} > > -\item Else if VIRTIO_NET_RSS_HASH_TYPE_IP_EX is set, the hash is > > -calculated over the following fields: > > -\begin{itemize} > > -\item Home address from the home address option in the IPv6 destinatio= n > > 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, us= e > > the Destination IPv6 address. > > -\end{itemize} > > -\item Else skip IPv6 extension headers and calculate the hash as > > -defined for an IPv6 packet without extension headers (see \ref{itm:Dev= ice > > Types / Network Device / Device Operation / Control Virtqueue / > > Receive-side scaling (RSS) / RSS hash types/hash on IPv6 packets withou= t > > extension headers}). > > -\end{itemize} > > +Fields \field{hash_key_length} and \field{hash_key_data} define the ke= y to > > be used in hash calculation. > > > > \drivernormative{\subparagraph}{Setting RSS parameters}{Device Types / > > Network Device / Device Operation / Control Virtqueue / Receive-side > > scaling (RSS) } > > > > @@ -4093,12 +4204,12 @@ \subsubsection{Control Virtqueue}\label{sec:Dev= ice > > Types / Network Device / Devi > > > > A driver MUST use \field{indirection_table_mask} values that are less t= han > > \field{rss_max_indirection_table_length} reported by a device. > > > > -A driver MUST NOT set any VIRTIO_NET_RSS_HASH_TYPE_ flags that are not > > supported by a device. > > +A driver MUST NOT set any VIRTIO_NET_HASH_TYPE_ flags that are not > > supported by a device. > > > > \devicenormative{\subparagraph}{RSS processing}{Device Types / Network > > Device / Device Operation / Control Virtqueue / Receive-side scaling (R= SS) > > / RSS processing} > > The device MUST determine the destination queue for a network packet as > > follows: > > \begin{itemize} > > -\item Calculate the hash of the packet as defined in \ref{sec:Device T= ypes > > / Network Device / Device Operation / Control Virtqueue / Receive-side > > scaling (RSS) / RSS hash types} > > +\item Calculate the hash of the packet as defined in \ref{sec:Device T= ypes > > / Network Device / Device Operation / Processing of Incoming Packets / > > Hash calculation for incoming packets}. > > \item If the device did not calculate the hash for the specific packet,= the > > device directs the packet to the receiveq specified by > > \field{unclassified_queue} of virtio_net_rss_config structure (value of= 0 > > corresponds to receiveq1). > > \item Apply \field{indirection_table_mask} to the calculated hash and u= se > > the result as the index in the indirection table to get 0-based number = of > > destination receiveq (value of 0 corresponds to receiveq1). > > \end{itemize} > > -- > > 2.17.1 > This publicly archived list offers a means to provide input to the > OASIS Virtual I/O Device (VIRTIO) TC. > In order to verify user consent to the Feedback License terms and > to minimize spam in the list archive, subscription is required > before posting. > Subscribe: virtio-comment-subscribe@lists.oasis-open.org > Unsubscribe: virtio-comment-unsubscribe@lists.oasis-open.org > List help: virtio-comment-help@lists.oasis-open.org > List archive: https://lists.oasis-open.org/archives/virtio-comment/ > Feedback License: https://www.oasis-open.org/who/ipr/feedback_license.pdf > List Guidelines: https://www.oasis-open.org/policies-guidelines/mailing-l= ists > Committee: https://www.oasis-open.org/committees/virtio/ > Join OASIS: https://www.oasis-open.org/join/ ------=_Part_7222324_139510119.1582110433679 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable



= From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Yur= i Benditovich" <yuri.benditovich@daynix.com>
Cc: virtio-com= ment@lists.oasis-open.org
Sent: Wednesday, February 19, 2020 11:1= 2:40 AM
Subject: [virtio-comment] Re: [PATCH v4 1/1] virtio-net: = Define per-packet hash reporting feature

On Wed, Feb 19, = 2020 at 09:53:37AM +0200, Yuri Benditovich wrote:
> Fixes: https://gi= thub.com/oasis-tcs/virtio-spec/issues/66
> Define respective feature = bit for virtio-net.
> Extend packet layout to populate hash value and= type.
> Move the definition of IP/TCP/UDP header fields to
> c= alculate the hash out of RSS section to common network
> device secti= on.
>
> Signed-off-by: Yuri Benditovich <yuri.benditovich@d= aynix.com>
> ---
>  content.tex | 347 +++++++++++++++++= +++++++++++++++++------------------
>  1 file changed, 229 inser= tions(+), 118 deletions(-)
>
> diff --git a/content.tex b/cont= ent.tex
> index b91a132..d7d4e42 100644
> --- a/content.tex
= > +++ b/content.tex
> @@ -2895,6 +2895,9 @@ \subsection{Feature bi= ts}\label{sec:Device Types / Network Device / Feature bits
>  \i= tem[VIRTIO_NET_F_CTRL_MAC_ADDR(23)] Set MAC address through control
>=      channel.
>  
> +\item[VIRTIO_NET_F_HA= SH_REPORT(57)] Device can report per-packet hash
> +    val= ue and a type of calculated hash.
> +
>  \item[VIRTIO_NET_= F_GUEST_HDRLEN(59)] Driver can provide the exact \field{hdr_len}
> &n= bsp;    value. Device benefits from knowing the exact header leng= th.
>  
> @@ -2995,35 +2998,17 @@ \subsection{Device confi= guration layout}\label{sec:Device Types / Network Device
>   &nb= sp;      le32 supported_hash_types;
>  };
>=  \end{lstlisting}
> -\label{sec:Device Types / Network Device /= Device configuration layout / RSS}
> -Three following fields, \field= {rss_max_key_size}, \field{rss_max_indirection_table_length}
> -and \= field{supported_hash_types} only exist if VIRTIO_NET_F_RSS is set.
> = +The following field, \field{rss_max_key_size} only exist if VIRTIO_NET_F_R= SS or VIRTIO_NET_F_HASH_REPORT is set.
> +It specifies the maximal su= pported length of RSS key in bytes.
>  
> -Field \field{rs= s_max_key_size} specifies the maximal supported length of RSS key in bytes.=
> +The following field, \field{rss_max_indirection_table_length} onl= y exist if VIRTIO_NET_F_RSS is set.
> +It specifies the maximal numbe= r of 16-bit entries in RSS indirection table.
>  
> -Field= \field{rss_max_indirection_table_length} specifies the maximal number of 1= 6-bit entries in RSS indirection table.
> +The next field, \field{sup= ported_hash_types} exists only if the device supports hash calculation,
= > +i.e. if VIRTIO_NET_F_RSS or VIRTIO_NET_F_HASH_REPORT is set.
> =  
> -Field \field{supported_hash_types} contains the bitmask of = supported RSS hash types.
> -
> -Hash types applicable for IPv4= packets:
> -\begin{lstlisting}
> -#define VIRTIO_NET_RSS_HASH_= TYPE_IPv4              (1 << 0)> -#define VIRTIO_NET_RSS_HASH_TYPE_TCPv4         &= nbsp;   (1 << 1)
> -#define VIRTIO_NET_RSS_HASH_TYPE_UDPv4=             (1 << 2)
> -\end{lst= listing}
> -Hash types applicable for IPv6 packets without extension = headers
> -\begin{lstlisting}
> -#define VIRTIO_NET_RSS_HASH_TY= PE_IPv6              (1 << 3)
&= gt; -#define VIRTIO_NET_RSS_HASH_TYPE_TCPv6         &nb= sp;   (1 << 4)
> -#define VIRTIO_NET_RSS_HASH_TYPE_UDPv6 &= nbsp;           (1 << 5)
> -\end{lstli= sting}
> -Hash types applicable for IPv6 packets with extension heade= rs
> -\begin{lstlisting}
> -#define VIRTIO_NET_RSS_HASH_TYPE_IP= _EX             (1 << 6)
> -#defi= ne VIRTIO_NET_RSS_HASH_TYPE_TCP_EX            = ;(1 << 7)
> -#define VIRTIO_NET_RSS_HASH_TYPE_UDP_EX   &nb= sp;        (1 << 8)
> -\end{lstlisting}
= > -For the exact meaning of VIRTIO_NET_RSS_HASH_TYPE_ flags see \ref{sec= :Device Types / Network Device / Device Operation / Control Virtqueue / Rec= eive-side scaling (RSS) / RSS hash types}.
> +Field \field{supported_= hash_types} contains the bitmask of supported hash types.
> +See \ref= {sec:Device Types / Network Device / Device Operation / Processing of Incom= ing Packets / Hash calculation for incoming packets / Supported/enabled has= h types} for details of supported hash types.
>  
>  = \devicenormative{\subsubsection}{Device configuration layout}{Device Types = / Network Device / Device configuration layout}
>  
> @@ -= 3048,7 +3033,7 @@ \subsection{Device configuration layout}\label{sec:Device= Types / Network Device
>  negotiated.
>  
> &n= bsp;The device MUST set \field{rss_max_key_size} to at least 40, if it offe= rs
> -VIRTIO_NET_F_RSS.
> +VIRTIO_NET_F_RSS or VIRTIO_NET_F_HAS= H_REPORT.
>  
>  The device MUST set \field{rss_max_i= ndirection_table_length} to at least 128, if it offers
>  VIRTIO= _NET_F_RSS.
> @@ -3195,6 +3180,8 @@ \subsection{Device Operation}\lab= el{sec:Device Types / Network Device / Device O
>      = ;    le16 csum_start;
>          l= e16 csum_offset;
>          le16 num_buffers= ;
> +        le32 hash_value; (Only if VIRTIO_NET= _F_HASH_REPORT negotiated)
> +        le16 hash_t= ype;  (Only if VIRTIO_NET_F_HASH_REPORT negotiated)
>  };

Just noticed this - it's a bit problematic as it might for= ce
compilers to add 2 bytes of padding at the end. Let's add extra 2 byt= es
of padding explicitly?
OK, no problem
=


>  \end{lstlisting}
>  
> @@ -3517,6 +3= 504,12 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device T= ypes / Network
>  
>  \end{enumerate}
>  <= br>> +If applicable, the device calculates per-packet hash for incoming = packets as
> +defined in \ref{sec:Device Types / Network Device / Dev= ice Operation / Processing of Incoming Packets / Hash calculation for incom= ing packets}.
> +
> +If applicable, the device reports hash inf= ormation for incoming packets as
> +defined in \ref{sec:Device Types = / Network Device / Device Operation / Processing of Incoming Packets / Hash= reporting for incoming packets}.
> +
>  \devicenormative{= \paragraph}{Processing of Incoming Packets}{Device Types / Network Device /= Device Operation / Processing of Incoming Packets}
>  \label{de= vicenormative:Device Types / Network Device / Device Operation / Processing= of Packets}%old label for latexdiff
>  
> @@ -3619,6 +361= 2,181 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Ty= pes / Network
>  If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
&= gt;  VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
> &= nbsp;rely on the packet checksum being correct.
> +
> +\paragra= ph{Hash calculation for incoming packets}
> +\label{sec:Device Types = / Network Device / Device Operation / Processing of Incoming Packets / Hash= calculation for incoming packets}
> +
> +A device attempts to = calculate a per-packet hash in the following cases:
> +\begin{itemize= }
> +\item The feature VIRTIO_NET_F_RSS was negotiated. The device us= es the hash to determine the receive virtqueue to place incoming packets.> +\item The feature VIRTIO_NET_F_HASH_REPORT was negotiated. The devi= ce reports the hash value and the hash type with the packet.
> +\end{= itemize}
> +
> +If the feature VIRTIO_NET_F_RSS was negotiated:=
> +\begin{itemize}
> +\item The device uses \field{hash_types}= of the virtio_net_rss_config structure as 'Enabled hash types' bitmask.> +\item The device uses a key as defined in \field{hash_key_data} and = \field{hash_key_length} of the virtio_net_rss_config structure (see
>= +\ref{sec:Device Types / Network Device / Device Operation / Control Virtq= ueue / Receive-side scaling (RSS) / Setting RSS parameters}).
> +\end= {itemize}
> +
> +If the feature VIRTIO_NET_F_RSS was not negoti= ated:
> +\begin{itemize}
> +\item The device uses \field{hash_t= ypes} of the virtio_net_hash_config structure as 'Enabled hash types' bitma= sk.
> +\item The device uses a key as defined in \field{hash_key_data= } and \field{hash_key_length} of the virtio_net_hash_config structure (see<= br>> +\ref{sec:Device Types / Network Device / Device Operation / Contro= l Virtqueue / Automatic receive steering in multiqueue mode / Hash calculat= ion}).
> +\end{itemize}
> +
> +Note that if the device of= fers VIRTIO_NET_F_HASH_REPORT, even if it supports only one pair of virtque= ues, it MUST support
> +at least one of commands of VIRTIO_NET_CTRL_M= Q class to configure reported hash parameters:
> +\begin{itemize}
= > +\item If the device offers VIRTIO_NET_F_RSS, it MUST support VIRTIO_N= ET_CTRL_MQ_RSS_CONFIG command per
> + \ref{sec:Device Types / Network= Device / Device Operation / Control Virtqueue / Receive-side scaling (RSS)= / Setting RSS parameters}.
> +\item Otherwise the device MUST suppor= t VIRTIO_NET_CTRL_MQ_HASH_CONFIG command per
> + \ref{sec:Device Type= s / Network Device / Device Operation / Control Virtqueue / Automatic recei= ve steering in multiqueue mode / Hash calculation}.
> +\end{itemize}<= br>> +
> +\subparagraph{Supported/enabled hash types}
> +\la= bel{sec:Device Types / Network Device / Device Operation / Processing of In= coming Packets / Hash calculation for incoming packets / Supported/enabled = hash types}
> +Hash types applicable for IPv4 packets:
> +\begi= n{lstlisting}
> +#define VIRTIO_NET_HASH_TYPE_IPv4     &nbs= p;        (1 << 0)
> +#define VIRTIO_NET_HA= SH_TYPE_TCPv4             (1 << 1)
&= gt; +#define VIRTIO_NET_HASH_TYPE_UDPv4           =   (1 << 2)
> +\end{lstlisting}
> +Hash types applica= ble for IPv6 packets without extension headers
> +\begin{lstlisting}<= br>> +#define VIRTIO_NET_HASH_TYPE_IPv6         &nbs= p;    (1 << 3)
> +#define VIRTIO_NET_HASH_TYPE_TCPv6 =             (1 << 4)
> +#define V= IRTIO_NET_HASH_TYPE_UDPv6             (1 <= < 5)
> +\end{lstlisting}
> +Hash types applicable for IPv6 p= ackets with extension headers
> +\begin{lstlisting}
> +#define = VIRTIO_NET_HASH_TYPE_IP_EX             (1 <= ;< 6)
> +#define VIRTIO_NET_HASH_TYPE_TCP_EX       =      (1 << 7)
> +#define VIRTIO_NET_HASH_TYPE_UD= P_EX            (1 << 8)
> +\end{= lstlisting}
> +
> +\subparagraph{IPv4 packets}
> +\label{= sec:Device Types / Network Device / Device Operation / Processing of Incomi= ng Packets / Hash calculation for incoming packets / IPv4 packets}
> = +The device calculates the hash on IPv4 packets according to 'Enabled hash = types' bitmask as follows:
> +\begin{itemize}
> +\item If VIRTI= O_NET_HASH_TYPE_TCPv4 is set and the packet has
> +a TCP header, the = hash is calculated over the following fields:
> +\begin{itemize}
&= gt; +\item Source IP address
> +\item Destination IP address
> = +\item Source TCP port
> +\item Destination TCP port
> +\end{it= emize}
> +\item Else if VIRTIO_NET_HASH_TYPE_UDPv4 is set and the
= > +packet has a UDP header, the hash is calculated over the following fi= elds:
> +\begin{itemize}
> +\item Source IP address
> +\i= tem Destination IP address
> +\item Source UDP port
> +\item De= stination UDP port
> +\end{itemize}
> +\item Else if VIRTIO_NET= _HASH_TYPE_IPv4 is set, the hash is
> +calculated over the following = fields:
> +\begin{itemize}
> +\item Source IP address
> += \item Destination IP address
> +\end{itemize}
> +\item Else the= device does not calculate the hash
> +\end{itemize}
> +
>= ; +\subparagraph{IPv6 packets without extension header}
> +\label{sec= :Device Types / Network Device / Device Operation / Processing of Incoming = Packets / Hash calculation for incoming packets / IPv6 packets without exte= nsion header}
> +The device calculates the hash on IPv6 packets witho= ut extension
> +headers according to 'Enabled hash types' bitmask as = follows:
> +\begin{itemize}
> +\item If VIRTIO_NET_HASH_TYPE_TC= Pv6 is set and the packet has
> +a TCPv6 header, the hash is calculat= ed over the following fields:
> +\begin{itemize}
> +\item Sourc= e IPv6 address
> +\item Destination IPv6 address
> +\item Sourc= e TCP port
> +\item Destination TCP port
> +\end{itemize}
&g= t; +\item Else if VIRTIO_NET_HASH_TYPE_UDPv6 is set and the
> +packet= has a UDPv6 header, the hash is calculated over the following fields:
&= gt; +\begin{itemize}
> +\item Source IPv6 address
> +\item Dest= ination IPv6 address
> +\item Source UDP port
> +\item Destinat= ion UDP port
> +\end{itemize}
> +\item Else if VIRTIO_NET_HASH_= TYPE_IPv6 is set, the hash is
> +calculated over the following fields= :
> +\begin{itemize}
> +\item Source IPv6 address
> +\ite= m Destination IPv6 address
> +\end{itemize}
> +\item Else the d= evice does not calculate the hash
> +\end{itemize}
> +
> = +\subparagraph{IPv6 packets with extension header}
> +\label{sec:Devi= ce Types / Network Device / Device Operation / Processing of Incoming Packe= ts / Hash calculation for incoming packets / IPv6 packets with extension he= ader}
> +The device calculates the hash on IPv6 packets with extensio= n
> +headers according to 'Enabled hash types' bitmask as follows:> +\begin{itemize}
> +\item If VIRTIO_NET_HASH_TYPE_TCP_EX is set= and the packet
> +has a TCPv6 header, the hash is calculated over th= e following fields:
> +\begin{itemize}
> +\item Home address fr= om the home address option in the IPv6 destination options header. If the e= xtension header is not present, use the Source IPv6 address.
> +\item= IPv6 address that is contained in the Routing-Header-Type-2 from the assoc= iated extension header. If the extension header is not present, use the Des= tination IPv6 address.
> +\item Source TCP port
> +\item Destin= ation TCP port
> +\end{itemize}
> +\item Else if VIRTIO_NET_HAS= H_TYPE_UDP_EX is set and the
> +packet has a UDPv6 header, the hash i= s calculated over the following fields:
> +\begin{itemize}
> +\= item Home address from the home address option in the IPv6 destination opti= ons header. If the extension header is not present, use the Source IPv6 add= ress.
> +\item IPv6 address that is contained in the Routing-Header-T= ype-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 El= se if VIRTIO_NET_HASH_TYPE_IP_EX is set, the hash is
> +calculated ov= er the following fields:
> +\begin{itemize}
> +\item Home addre= ss 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 th= e Destination IPv6 address.
> +\end{itemize}
> +\item Else skip= IPv6 extension headers and calculate the hash as
> +defined for an I= Pv6 packet without extension headers
> +(see \ref{sec:Device Types / = Network Device / Device Operation / Processing of Incoming Packets / Hash c= alculation for incoming packets / IPv6 packets without extension header}).<= br>> +\end{itemize}
> +
> +\paragraph{Hash reporting for inc= oming packets}
> +\label{sec:Device Types / Network Device / Device O= peration / Processing of Incoming Packets / Hash reporting for incoming pac= kets}
> +
> +If VIRTIO_NET_F_HASH_REPORT was negotiated and
= > + the device has calculated the hash for the packet, the device fills = \field{hash_type} with the type of calculated hash
> +and \field{hash= _value} with the value of calculated hash.
> +
> +If VIRTIO_NET= _F_HASH_REPORT was negotiated but due to any reason the
> +hash was n= ot calculated, the device sets \field{hash_type} to VIRTIO_NET_HASH_REPORT_= NONE.
> +
> +Possible values that the device can report in \fie= ld{hash_type} are defined below.
> +They correspond to supported hash= types defined in
> +\ref{sec:Device Types / Network Device / Device = Operation / Processing of Incoming Packets / Hash calculation for incoming = packets / Supported/enabled hash types}
> +as follows:
> +
&= gt; +VIRTIO_NET_HASH_TYPE_XXX =3D 1 << (VIRTIO_NET_HASH_REPORT_XXX - = 1)


So hash_type is the HASH_REPORT value then? That's= quite confusing.
Let's rename to hash_report?
No p= roblem to rename anything, but I'd like to do it one time.
Cu= rrently meaningful hash report values are (1..9), 0 for none
= They correspond to bitmask of 9 bits for enabled/supported.
I= t was possible to use the same definitions for enable/support/report
but then reported kind of hash should be 4 bytes.
As = you anyway suggests padding at the end of the packet, we can do that,
i.e. add (32 bit hash + 32 bit type)

= Or if we stay with the values as they are now:
values 0..9 - = VIRTIO_NET_WHAT?
bits from 0 to 8 - VIRTIO_NET_WHAT?

> +
> +\begin{lstlisting}
> +#define VIRTIO_NET_HASH_REPOR= T_NONE            0
> +#define VIRTIO_N= ET_HASH_REPORT_IPv4            1
> +#de= fine VIRTIO_NET_HASH_REPORT_TCPv4           2
&= gt; +#define VIRTIO_NET_HASH_REPORT_UDPv4          = ; 3
> +#define VIRTIO_NET_HASH_REPORT_IPv6        = ;    4
> +#define VIRTIO_NET_HASH_REPORT_TCPv6    = ;       5
> +#define VIRTIO_NET_HASH_REPORT_UDPv6 &nbs= p;         6
> +#define VIRTIO_NET_HASH_REPORT_IP= v6_EX         7
> +#define VIRTIO_NET_HASH_REPORT= _TCPv6_EX        8
> +#define VIRTIO_NET_HASH_REP= ORT_UDPv6_EX        9
> +\end{lstlisting}
>= +
>  \subsubsection{Control Virtqueue}\label{sec:Device Types /= Network Device / Device Operation / Control Virtqueue}
>  
&= gt;  The driver uses the control virtqueue (if VIRTIO_NET_F_CTRL_VQ is=
> @@ -3896,6 +4064,7 @@ \subsubsection{Control Virtqueue}\label{sec:= Device Types / Network Device / Devi
>  #define VIRTIO_NET_CTRL_= MQ    4
>   #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET &n= bsp;      0 (for automatic receive steering)
>   = #define VIRTIO_NET_CTRL_MQ_RSS_CONFIG          1 (= for configurable receive steering)
> + #define VIRTIO_NET_CTRL_MQ_HAS= H_CONFIG         2 (for configurable hash calculation)<= br>>  \end{lstlisting}
>  
>  If more than on= e multiqueue mode is negotiated, the resulting device configuration is defi= ned by the last command sent by the driver.
> @@ -3961,10 +4130,37 @@= \subsubsection{Control Virtqueue}\label{sec:Device Types / Network Device = / Devi
>  according to the native endian of the guest rather tha= n
>  (necessarily when not using the legacy interface) little-en= dian.
>  
> +\subparagraph{Hash calculation}\label{sec:Dev= ice Types / Network Device / Device Operation / Control Virtqueue / Automat= ic receive steering in multiqueue mode / Hash calculation}
> +If VIRT= IO_NET_F_HASH_REPORT was negotiated and the device uses automatic receive s= teering,
> +the device MUST support a command to configure hash calcu= lation parameters.
> +
> +The driver provides parameters for ha= sh calculation as follows:
> +
> +\field{class} VIRTIO_NET_CTRL= _MQ, \field{command} VIRTIO_NET_CTRL_MQ_HASH_CONFIG.
> +
> +The= \field{command-specific-data} has following format:
> +\begin{lstlis= ting}
> +struct virtio_net_hash_config {
> +    le32 = hash_types;
> +    le16 reserved[4];
> +    = ;u8 hash_key_length;
> +    u8 hash_key_data[hash_key_lengt= h];
> +};
> +\end{lstlisting}
> +Field \field{hash_types}= contains a bitmask of allowed hash types as
> +defined in
> +\= ref{sec:Device Types / Network Device / Device Operation / Processing of In= coming Packets / Hash calculation for incoming packets / Supported/enabled = hash types}.
> +Initially the device has all hash types disabled and = reports only VIRTIO_NET_HASH_REPORT_NONE.
> +
> +Field \field{r= eserved} MUST contain zeroes. It is defined to make the structure to match = the layout of virtio_net_rss_config structure,
> +defined in \ref{sec= :Device Types / Network Device / Device Operation / Control Virtqueue / Rec= eive-side scaling (RSS)}.
> +
> +Fields \field{hash_key_length}= and \field{hash_key_data} define the key to be used in hash calculation.> +
>  \paragraph{Receive-side scaling (RSS)}\label{sec:Dev= ice Types / Network Device / Device Operation / Control Virtqueue / Receive= -side scaling (RSS)}
>  A device offers the feature VIRTIO_NET_F= _RSS if it supports RSS receive steering with Toeplitz hash calculation and= configurable parameters.
>  
> -A driver queries RSS capa= bilities of the device by reading device configuration as defined in \ref{s= ec:Device Types / Network Device / Device configuration layout / RSS}
&g= t; +A driver queries RSS capabilities of the device by reading device confi= guration as defined in \ref{sec:Device Types / Network Device / Device conf= iguration layout}
>  
>  \subparagraph{Setting RSS pa= rameters}\label{sec:Device Types / Network Device / Device Operation / Cont= rol Virtqueue / Receive-side scaling (RSS) / Setting RSS parameters}
>= ;  
> @@ -3981,7 +4177,8 @@ \subsubsection{Control Virtqueue}\la= bel{sec:Device Types / Network Device / Devi
>  };
>  = ;\end{lstlisting}
>  Field \field{hash_types} contains a bitmask= of allowed hash types as
> -defined in \ref{sec:Device Types / Netwo= rk Device / Device Operation / Control Virtqueue / Receive-side scaling (RS= S) / RSS hash types}.
> +defined in
> +\ref{sec:Device Types / = Network Device / Device Operation / Processing of Incoming Packets / Hash c= alculation for incoming packets / Supported/enabled hash types}.
> &n= bsp;
>  Field \field{indirection_table_mask} is a mask to be app= lied to
>  the calculated hash to produce an index in the
>= ; @@ -3995,93 +4192,7 @@ \subsubsection{Control Virtqueue}\label{sec:Device= Types / Network Device / Devi
>  
>  A driver sets \= field{max_tx_vq} to inform a device how many transmit virtqueues it may use= (transmitq1\ldots transmitq \field{max_tx_vq}).
>  
> -\s= ubparagraph{RSS hash types}\label{sec:Device Types / Network Device / Devic= e Operation / Control Virtqueue / Receive-side scaling (RSS) / RSS hash typ= es}
> -
> -The device calculates the hash on IPv4 packets accor= ding to the
> -field \field{hash_types} of the virtio_net_rss_config = structure as follows:
> -\begin{itemize}
> -\item If VIRTIO_NET= _RSS_HASH_TYPE_TCPv4 is set and the packet has
> -a TCP header, the h= ash is calculated over the following fields:
> -\begin{itemize}
&g= t; -\item Source IP address
> -\item Destination IP address
> -= \item Source TCP port
> -\item Destination TCP port
> -\end{ite= mize}
> -\item Else if VIRTIO_NET_RSS_HASH_TYPE_UDPv4 is set and the<= br>> -packet has a UDP header, the hash is calculated over the following= fields:
> -\begin{itemize}
> -\item Source IP address
> = -\item Destination IP address
> -\item Source UDP port
> -\item= Destination UDP port
> -\end{itemize}
> -\item Else if VIRTIO_= NET_RSS_HASH_TYPE_IPv4 is set, the hash is
> -calculated over the fol= lowing fields:
> -\begin{itemize}
> -\item Source IP address> -\item Destination IP address
> -\end{itemize}
> -\item E= lse the device does not calculate the hash
> -\end{itemize}
> -=
> -\label{itm:Device Types / Network Device / Device Operation / Con= trol Virtqueue / Receive-side scaling (RSS) / RSS hash types/hash on IPv6 p= ackets without extension headers}
> -The device calculates the hash o= n IPv6 packets without extension
> -headers according to the field \f= ield{hash_types} of the virtio_net_rss_config structure as follows:
>= -\begin{itemize}
> -\item If VIRTIO_NET_RSS_HASH_TYPE_TCPv6 is set a= nd the packet has
> -a TCPv6 header, the hash is calculated over the = following fields:
> -\begin{itemize}
> -\item Source IPv6 addre= ss
> -\item Destination IPv6 address
> -\item Source TCP port> -\item Destination TCP port
> -\end{itemize}
> -\item El= se if VIRTIO_NET_RSS_HASH_TYPE_UDPv6 is set and the
> -packet has a U= DPv6 header, the hash is calculated over the following fields:
> -\be= gin{itemize}
> -\item Source IPv6 address
> -\item Destination = IPv6 address
> -\item Source UDP port
> -\item Destination UDP = port
> -\end{itemize}
> -\item Else if VIRTIO_NET_RSS_HASH_TYPE= _IPv6 is set, the hash is
> -calculated over the following fields:> -\begin{itemize}
> -\item Source IPv6 address
> -\item De= stination IPv6 address
> -\end{itemize}
> -\item Else the devic= e does not calculate the hash
> -\end{itemize}
> -
> -The= device calculates the hash on IPv6 packets with extension
> -headers= according to the field \field{hash_types} of the virtio_net_rss_config str= ucture as follows:
> -\begin{itemize}
> -\item If VIRTIO_NET_RS= S_HASH_TYPE_TCP_EX is set and the packet
> -has a TCPv6 header, the h= ash is calculated over the following fields:
> -\begin{itemize}
&g= t; -\item Home address from the home address option in the IPv6 destination= options header. If the extension header is not present, use the Source IPv= 6 address.
> -\item IPv6 address that is contained in the Routing-Hea= der-Type-2 from the associated extension header. If the extension header is= not present, use the Destination IPv6 address.
> -\item Source TCP p= ort
> -\item Destination TCP port
> -\end{itemize}
> -\it= em Else if VIRTIO_NET_RSS_HASH_TYPE_UDP_EX is set and the
> -packet h= as a UDPv6 header, the hash is calculated over the following fields:
>= ; -\begin{itemize}
> -\item Home address from the home address option= in the IPv6 destination options header. If the extension header is not pre= sent, use the Source IPv6 address.
> -\item IPv6 address that is cont= ained 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
> -\e= nd{itemize}
> -\item Else if VIRTIO_NET_RSS_HASH_TYPE_IP_EX is set, t= he hash is
> -calculated over the following fields:
> -\begin{i= temize}
> -\item Home address from the home address option in the IPv= 6 destination options header. If the extension header is not present, use t= he Source IPv6 address.
> -\item IPv6 address that is contained in th= e Routing-Header-Type-2 from the associated extension header. If the extens= ion header is not present, use the Destination IPv6 address.
> -\end{= itemize}
> -\item Else skip IPv6 extension headers and calculate the = hash as
> -defined for an IPv6 packet without extension headers (see = \ref{itm:Device Types / Network Device / Device Operation / Control Virtque= ue / Receive-side scaling (RSS) / RSS hash types/hash on IPv6 packets witho= ut extension headers}).
> -\end{itemize}
> +Fields \field{hash_= key_length} and \field{hash_key_data} define the key to be used in hash cal= culation.
>  
>  \drivernormative{\subparagraph}{Sett= ing RSS parameters}{Device Types / Network Device / Device Operation / Cont= rol Virtqueue / Receive-side scaling (RSS) }
>  
> @@ -409= 3,12 +4204,12 @@ \subsubsection{Control Virtqueue}\label{sec:Device Types /= Network Device / Devi
>  
>  A driver MUST use \fiel= d{indirection_table_mask} values that are less than \field{rss_max_indirect= ion_table_length} reported by a device.
>  
> -A driver MU= ST NOT set any VIRTIO_NET_RSS_HASH_TYPE_ flags that are not supported by a = device.
> +A driver MUST NOT set any VIRTIO_NET_HASH_TYPE_ flags that= are not supported by a device.
>  
>  \devicenormati= ve{\subparagraph}{RSS processing}{Device Types / Network Device / Device Op= eration / Control Virtqueue / Receive-side scaling (RSS) / RSS processing}<= br>>  The device MUST determine the destination queue for a network= packet as follows:
>  \begin{itemize}
> -\item Calculate = the hash of the packet as defined in \ref{sec:Device Types / Network Device= / Device Operation / Control Virtqueue / Receive-side scaling (RSS) / RSS = hash types}
> +\item Calculate the hash of the packet as defined in \= ref{sec:Device Types / Network Device / Device Operation / Processing of In= coming Packets / Hash calculation for incoming packets}.
>  \ite= m If the device did not calculate the hash for the specific packet, the dev= ice directs the packet to the receiveq specified by \field{unclassified_que= ue} of virtio_net_rss_config structure (value of 0 corresponds to receiveq1= ).
>  \item Apply \field{indirection_table_mask} to the calculat= ed hash and use the result as the index in the indirection table to get 0-b= ased number of destination receiveq (value of 0 corresponds to receiveq1).<= br>>  \end{itemize}
> --
> 2.17.1

This publicly archived list offers a means to provide input to the
OA= SIS Virtual I/O Device (VIRTIO) TC.

In order to verify user consent= to the Feedback License terms and
to minimize spam in the list archive= , subscription is required
before posting.

Subscribe: virtio-co= mment-subscribe@lists.oasis-open.org
Unsubscribe: virtio-comment-unsubs= cribe@lists.oasis-open.org
List help: virtio-comment-help@lists.oasis-o= pen.org
List archive: https://lists.oasis-open.org/archives/virtio-comm= ent/
Feedback License: https://www.oasis-open.org/who/ipr/feedback_lice= nse.pdf
List Guidelines: https://www.oasis-open.org/policies-guidelines= /mailing-lists
Committee: https://www.oasis-open.org/committees/virtio/=
Join OASIS: https://www.oasis-open.org/join/


------=_Part_7222324_139510119.1582110433679--