[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: [PATCH] virtio-net: define support for controlled steering mode
Introducing feature bit and set of control commands for steering mode configuration. --- content.tex | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/content.tex b/content.tex index 8f0498e..3515ed1 100644 --- a/content.tex +++ b/content.tex @@ -2732,6 +2732,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_CTRL_STEERING_MODE(61)] Device supports selectable + steering mode and/or control of steering mode parameters. + \item[VIRTIO_NET_F_RSC_EXT(61)] Device can process duplicated ACKs and report number of coalesced segments and duplicated ACKs @@ -2761,6 +2764,7 @@ \subsubsection{Feature bit requirements}\label{sec:Device Types / Network Device \item[VIRTIO_NET_F_MQ] Requires VIRTIO_NET_F_CTRL_VQ. \item[VIRTIO_NET_F_CTRL_MAC_ADDR] Requires VIRTIO_NET_F_CTRL_VQ. \item[VIRTIO_NET_F_RSC_EXT] Requires VIRTIO_NET_F_HOST_TSO4 or VIRTIO_NET_F_HOST_TSO6. +\item[VIRTIO_NET_F_CTRL_STEERING_MODE] Requires VIRTIO_NET_F_MQ. \end{description} \subsubsection{Legacy Interface: Feature bits}\label{sec:Device Types / Network Device / Feature bits / Legacy Interface: Feature bits} @@ -3700,8 +3704,113 @@ \subsubsection{Control Virtqueue}\label{sec:Device Types / Network Device / Devi MUST format \field{offloads} according to the native endian of the guest rather than (necessarily when not using the legacy interface) little-endian. +\paragraph{Controlled steering mode}\label{sec:Device Types / Network Device / Device Operation / Control Virtqueue / Controlled steering mode} +Device indicates presence of this feature if it supports selectable/configurable steering modes. +\subparagraph{Querying and setting steering mode}\label{sec:Device Types / Network Device / Device Operation / Control Virtqueue / Controlled steering mode / Querying and setting steering mode} +There are two kinds of defined commands: GET and SET. + +For both types of commands driver sends output buffer containing \field{virtio_net_ctrl}, as defined by the \ref{sec:Device Types / Network Device / Device Operation / Control Virtqueue}. + +For GET commands driver provides input for response structure defined for respective GET command. + +Each response structure includes first byte for \field{ack} code of regular response for control command. + +Driver uses following value as \field{class} for all the commands related to steering control +\begin{lstlisting} +#define VIRTIO_NET_CTRL_STEERING_MODE 6 +\end{lstlisting} +To query available steering modes driver uses following value as \field{command} + +Device responds with \field{ack} following by bitmask designating supported steering modes + +\begin{lstlisting} +#define VIRTIO_NET_CTRL_SM_GET_SUPPORTED_MODES 0 +/* automatic steering mode (default defined by the device) */ +#define STEERING_MODE_AUTO (1 << 0) +/* RSS (Receive Side Scaling): input queue defined by + calculated hash and indirection table */ +#define STEERING_MODE_RSS (1 << 1) +struct virtio_net_supported_steering_modes { + u8 ack; + u8 steering_modes; +}; +\end{lstlisting} + +For all operation related to specific steering mode driver uses following value as \field{command} +and uses following structure for \field{command-specific-data} +\begin{lstlisting} +#define VIRTIO_NET_CTRL_SM_CONTROL 1 + +struct virtio_net_steering_mode_control { + u8 steering_mode; + u8 mode_command; +}; +\end{lstlisting} +In case of \field{steering_mode}=STEERING_MODE_AUTO the value of \field{mode_command} is ignored. + +In case of \field{steering_mode}=STEERING_MODE_RSS possible values of \field{mode_command} are: +\begin{lstlisting} +#define VIRTIO_NET_SM_CTRL_RSS_SET 0 +#define VIRTIO_NET_SM_CTRL_RSS_GET_SUPPORTED_FUNCTIONS 1 +#define VIRTIO_NET_SM_CTRL_RSS_GET_SUPPORTED_HASHES 2 +\end{lstlisting} +Response on VIRTIO_NET_SM_CTRL_RSS_GET_SUPPORTED_FUNCTIONS is a structure containing bitmask value: +\begin{lstlisting} +struct virtio_net_supported_hash_functions { + u8 ack; + u8 supported_hash_functions; +}; +#define VIRTIO_RSS_HASH_FUNCTION_TOEPLITZ (1 << 0) +#define VIRTIO_RSS_HASH_FUNCTION_SYMMETRIC (1 << 1) +\end{lstlisting} +Response on VIRTIO_NET_SM_CTRL_RSS_GET_SUPPORTED_HASHES command is a structure containing bitmask values: + +Device reports supported hash types separately for IPv4 and IPv6. +\begin{lstlisting} +struct virtio_net_supported_hashes { + u8 ack; + u8 hash_types_v4; + u8 hash_types_v6; + u8 max_key_length; + /* maximal number of 16-bit entries */ + le16 max_indirection_table_len; +}; +#define VIRTIO_NET_SM_HASH_SUPPORT_IP (1 << 0) +#define VIRTIO_NET_SM_HASH_SUPPORT_IP_EX (1 << 1) +#define VIRTIO_NET_SM_HASH_SUPPORT_TCP (1 << 2) +#define VIRTIO_NET_SM_HASH_SUPPORT_TCP_EX (1 << 3) +#define VIRTIO_NET_SM_HASH_SUPPORT_UDP (1 << 4) +#define VIRTIO_NET_SM_HASH_SUPPORT_UDP_EX (1 << 5) +\end{lstlisting} +For VIRTIO_NET_SM_CTRL_RSS_SET command driver sends following structure: +\begin{lstlisting} +struct virtio_net_rss_conf { + u8 hash_types_v4; /* one or more of VIRTIO_NET_SM_HASH_SUPPORT bits*/ + u8 hash_types_v6; /* one or more of VIRTIO_NET_SM_HASH_SUPPORT bits*/ + u8 hash_function; /* one of VIRTIO_RSS_HASH_FUNCTION*/ + u8 hash_key_length; + le16 indirection_table_length; + /* queue to place unclassified packets in */ + le16 default_queue; + /* le16 indirection_table[indirection_table_length] */ + /* u8 hash key data[hash_key_length]*/ +}; +\end{lstlisting} +\drivernormative{\subparagraph}{Querying and setting steering mode}{Device Types / Network Device / Device Operation / Control Virtqueue / Controlled steering mode / Querying and setting steering mode} + +A driver MUST NOT use commands of steering mode control if +the feature VIRTIO_NET_F_CTRL_STEERING_MODE has not been negotiated +and before it successfully enabled operation with multiple queues. + +A driver MUST fill \field{indirection_table} array only with indices of active queues. + +A \field{indirection_table_length} MUST be power of two. +\devicenormative{\subparagraph}{RSS Toeplitz implementation}{Device Types / Network Device / Device Operation / Control Virtqueue / Controlled steering mode / Querying and setting steering mode } +If device reports support for VIRTIO_RSS_HASH_FUNCTION_TOEPLITZ: +It MUST support keys of at least 40 bytes and indirection table of at least 128 entries. +The device applies mask of (indirection_table_length - 1) to the calculated hash and uses the result as the index in the indirection table to get index of destination receive queue. \subsubsection{Legacy Interface: Framing Requirements}\label{sec:Device Types / Network Device / Legacy Interface: Framing Requirements} -- 2.17.2
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]