> On 27 Jan 2020, at 13:54, Yuri Benditovich <yuri.benditov...@daynix.com>
> wrote:
>
> Add support for following hash types:
> IPV6 TCP with extension headers
> IPV4 UDP
> IPV6 UDP
> IPV6 UDP with extension headers
>
> Signed-off-by: Yuri Benditovich <yuri.benditov...@daynix.com>
Acked-by: Dmitry Fleytman <dmitry.fleyt...@gmail.com>
> ---
> hw/net/net_rx_pkt.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> hw/net/net_rx_pkt.h | 6 +++++-
> hw/net/trace-events | 4 ++++
> 3 files changed, 51 insertions(+), 1 deletion(-)
>
> diff --git a/hw/net/net_rx_pkt.c b/hw/net/net_rx_pkt.c
> index 98a5030ace..b2a06bd27d 100644
> --- a/hw/net/net_rx_pkt.c
> +++ b/hw/net/net_rx_pkt.c
> @@ -307,6 +307,20 @@ _net_rx_rss_prepare_tcp(uint8_t *rss_input,
> &tcphdr->th_dport, sizeof(uint16_t));
> }
>
> +static inline void
> +_net_rx_rss_prepare_udp(uint8_t *rss_input,
> + struct NetRxPkt *pkt,
> + size_t *bytes_written)
> +{
> + struct udp_header *udphdr = &pkt->l4hdr_info.hdr.udp;
> +
> + _net_rx_rss_add_chunk(rss_input, bytes_written,
> + &udphdr->uh_sport, sizeof(uint16_t));
> +
> + _net_rx_rss_add_chunk(rss_input, bytes_written,
> + &udphdr->uh_dport, sizeof(uint16_t));
> +}
> +
> uint32_t
> net_rx_pkt_calc_rss_hash(struct NetRxPkt *pkt,
> NetRxPktRssType type,
> @@ -347,6 +361,34 @@ net_rx_pkt_calc_rss_hash(struct NetRxPkt *pkt,
> trace_net_rx_pkt_rss_ip6_ex();
> _net_rx_rss_prepare_ip6(&rss_input[0], pkt, true, &rss_length);
> break;
> + case NetPktRssIpV6TcpEx:
> + assert(pkt->isip6);
> + assert(pkt->istcp);
> + trace_net_rx_pkt_rss_ip6_ex_tcp();
> + _net_rx_rss_prepare_ip6(&rss_input[0], pkt, true, &rss_length);
> + _net_rx_rss_prepare_tcp(&rss_input[0], pkt, &rss_length);
> + break;
> + case NetPktRssIpV4Udp:
> + assert(pkt->isip4);
> + assert(pkt->isudp);
> + trace_net_rx_pkt_rss_ip4_udp();
> + _net_rx_rss_prepare_ip4(&rss_input[0], pkt, &rss_length);
> + _net_rx_rss_prepare_udp(&rss_input[0], pkt, &rss_length);
> + break;
> + case NetPktRssIpV6Udp:
> + assert(pkt->isip6);
> + assert(pkt->isudp);
> + trace_net_rx_pkt_rss_ip6_udp();
> + _net_rx_rss_prepare_ip6(&rss_input[0], pkt, false, &rss_length);
> + _net_rx_rss_prepare_udp(&rss_input[0], pkt, &rss_length);
> + break;
> + case NetPktRssIpV6UdpEx:
> + assert(pkt->isip6);
> + assert(pkt->isudp);
> + trace_net_rx_pkt_rss_ip6_ex_udp();
> + _net_rx_rss_prepare_ip6(&rss_input[0], pkt, true, &rss_length);
> + _net_rx_rss_prepare_udp(&rss_input[0], pkt, &rss_length);
> + break;
> default:
> assert(false);
> break;
> diff --git a/hw/net/net_rx_pkt.h b/hw/net/net_rx_pkt.h
> index 7adf0fad51..048e3461f0 100644
> --- a/hw/net/net_rx_pkt.h
> +++ b/hw/net/net_rx_pkt.h
> @@ -133,7 +133,11 @@ typedef enum {
> NetPktRssIpV4Tcp,
> NetPktRssIpV6Tcp,
> NetPktRssIpV6,
> - NetPktRssIpV6Ex
> + NetPktRssIpV6Ex,
> + NetPktRssIpV6TcpEx,
> + NetPktRssIpV4Udp,
> + NetPktRssIpV6Udp,
> + NetPktRssIpV6UdpEx,
> } NetRxPktRssType;
>
> /**
> diff --git a/hw/net/trace-events b/hw/net/trace-events
> index 6f990ede87..73d4558f7e 100644
> --- a/hw/net/trace-events
> +++ b/hw/net/trace-events
> @@ -92,9 +92,13 @@ net_rx_pkt_l3_csum_validate_csum(size_t l3hdr_off,
> uint32_t csl, uint32_t cntr,
>
> net_rx_pkt_rss_ip4(void) "Calculating IPv4 RSS hash"
> net_rx_pkt_rss_ip4_tcp(void) "Calculating IPv4/TCP RSS hash"
> +net_rx_pkt_rss_ip4_udp(void) "Calculating IPv4/UDP RSS hash"
> net_rx_pkt_rss_ip6_tcp(void) "Calculating IPv6/TCP RSS hash"
> +net_rx_pkt_rss_ip6_udp(void) "Calculating IPv6/UDP RSS hash"
> net_rx_pkt_rss_ip6(void) "Calculating IPv6 RSS hash"
> net_rx_pkt_rss_ip6_ex(void) "Calculating IPv6/EX RSS hash"
> +net_rx_pkt_rss_ip6_ex_tcp(void) "Calculating IPv6/EX/TCP RSS hash"
> +net_rx_pkt_rss_ip6_ex_udp(void) "Calculating IPv6/EX/UDP RSS hash"
> net_rx_pkt_rss_hash(size_t rss_length, uint32_t rss_hash) "RSS hash for %zu
> bytes: 0x%X"
> net_rx_pkt_rss_add_chunk(void* ptr, size_t size, size_t input_offset) "Add
> RSS chunk %p, %zu bytes, RSS input offset %zu bytes"
>
> --
> 2.17.1
>