aboutsummaryrefslogtreecommitdiff
path: root/hw/net/net_rx_pkt.c
diff options
context:
space:
mode:
authorYuri Benditovich <yuri.benditovich@daynix.com>2020-01-27 13:54:04 +0200
committerJason Wang <jasowang@redhat.com>2020-03-03 18:04:47 +0800
commit33bbc05eabe5109d270faf10493a3ebebd541ecd (patch)
treed3172dcd3528beaec307d0ff748ab561e57c6bcf /hw/net/net_rx_pkt.c
parentb559ea95eaee8cbf72d910e8f98d2601c7f74f97 (diff)
NetRxPkt: Introduce support for additional hash types
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> Signed-off-by: Jason Wang <jasowang@redhat.com>
Diffstat (limited to 'hw/net/net_rx_pkt.c')
-rw-r--r--hw/net/net_rx_pkt.c42
1 files changed, 42 insertions, 0 deletions
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;