[1/2] NetRxPkt: Introduce support for additional hash types
diff mbox series

Message ID 20200127115405.13459-1-yuri.benditovich@daynix.com
State New
Headers show
Series
  • [1/2] NetRxPkt: Introduce support for additional hash types
Related show

Commit Message

Yuri Benditovich Jan. 27, 2020, 11:54 a.m. UTC
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.benditovich@daynix.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(-)

Comments

Dmitry Fleytman Jan. 29, 2020, 4:09 p.m. UTC | #1
> On 27 Jan 2020, at 13:54, Yuri Benditovich <yuri.benditovich@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.benditovich@daynix.com>


Acked-by: Dmitry Fleytman <dmitry.fleytman@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
>
Yuri Benditovich Feb. 12, 2020, 8:50 a.m. UTC | #2
Hi Jason,

Can you please review these 2 patches and apply if there are no objections.

Thanks,
Yuri Benditovich

On Wed, Jan 29, 2020 at 6:09 PM Dmitry Fleytman
<dmitry.fleytman@gmail.com> wrote:
>
>
>
> > On 27 Jan 2020, at 13:54, Yuri Benditovich <yuri.benditovich@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.benditovich@daynix.com>
>
>
> Acked-by: Dmitry Fleytman <dmitry.fleytman@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
> >
>
Jason Wang Feb. 12, 2020, 9:01 a.m. UTC | #3
On 2020/2/12 下午4:50, Yuri Benditovich wrote:
> Hi Jason,
>
> Can you please review these 2 patches and apply if there are no objections.
>
> Thanks,
> Yuri Benditovich


Applied.

Thanks

Patch
diff mbox series

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"