aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/hyperv
diff options
context:
space:
mode:
authorWei Hu <whu@FreeBSD.org>2021-02-24 05:07:46 +0000
committerWei Hu <whu@FreeBSD.org>2021-03-05 04:46:54 +0000
commit80f39bd95f22322152709ea5fae3a3c546044c9c (patch)
treef076016bcc372b24b55958749caa1f31c76ef18a /sys/dev/hyperv
parentff6a7e4ba6bf8be9ead9e1bc5537709243390654 (diff)
Diffstat (limited to 'sys/dev/hyperv')
-rw-r--r--sys/dev/hyperv/netvsc/if_hn.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/sys/dev/hyperv/netvsc/if_hn.c b/sys/dev/hyperv/netvsc/if_hn.c
index 5a57ea796d0e..9243ff226f5b 100644
--- a/sys/dev/hyperv/netvsc/if_hn.c
+++ b/sys/dev/hyperv/netvsc/if_hn.c
@@ -3077,13 +3077,24 @@ hn_encap(struct ifnet *ifp, struct hn_tx_ring *txr, struct hn_txdesc *txd,
if (txr->hn_tx_flags & HN_TX_FLAG_HASHVAL) {
/*
- * Set the hash value for this packet, so that the host could
- * dispatch the TX done event for this packet back to this TX
- * ring's channel.
+ * Set the hash value for this packet.
*/
pi_data = hn_rndis_pktinfo_append(pkt, HN_RNDIS_PKT_LEN,
HN_NDIS_HASH_VALUE_SIZE, HN_NDIS_PKTINFO_TYPE_HASHVAL);
- *pi_data = txr->hn_tx_idx;
+
+ if (M_HASHTYPE_ISHASH(m_head))
+ /*
+ * The flowid field contains the hash value host
+ * set in the rx queue if it is a ip forwarding pkt.
+ * Set the same hash value so host can send on the
+ * cpu it was received.
+ */
+ *pi_data = m_head->m_pkthdr.flowid;
+ else
+ /*
+ * Otherwise just put the tx queue index.
+ */
+ *pi_data = txr->hn_tx_idx;
}
if (m_head->m_flags & M_VLANTAG) {