[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: [PATCH 2/2] virtio_net: support inner header hash for GRE-encapsulated packets
On Wed, Nov 9, 2022 at 7:33 PM Heng Qi <hengqi@linux.alibaba.com> wrote: > > From: Heng Qi <henqqi@linux.alibaba.com> > > 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 <henqqi@linux.alibaba.com> > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > --- > 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. > + > +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 >
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]