summaryrefslogtreecommitdiffhomepage
path: root/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c')
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
index bebe37e139c9..9e5009be8e98 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
@@ -471,3 +471,60 @@ bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *skb, u8 num_frags,
xdp_buff_get_skb_flags(xdp));
return skb;
}
+
+int bnxt_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash,
+ enum xdp_rss_hash_type *rss_type)
+{
+ const struct bnxt_xdp_buff *xdp = (void *)ctx;
+ const struct rx_cmp_ext *rxcmp1 = xdp->rxcmp1;
+ const struct rx_cmp *rxcmp = xdp->rxcmp;
+ enum xdp_rss_hash_type hash_type = 0;
+ u32 itypes;
+
+ if (!rxcmp || !RX_CMP_HASH_VALID(rxcmp))
+ return -ENODATA;
+
+ *hash = le32_to_cpu(rxcmp->rx_cmp_rss_hash);
+
+ if (!rxcmp1) {
+ *rss_type = XDP_RSS_TYPE_L2;
+ return 0;
+ }
+
+ if (xdp->cmp_type == CMP_TYPE_RX_L2_CMP) {
+ itypes = RX_CMP_ITYPES(rxcmp);
+ if (rxcmp1->rx_cmp_flags2 &
+ cpu_to_le32(RX_CMP_FLAGS2_IP_TYPE)) {
+ hash_type |= XDP_RSS_TYPE_L3_IPV6;
+ } else {
+ hash_type |= XDP_RSS_TYPE_L3_IPV4;
+ }
+
+ switch (itypes) {
+ case RX_CMP_FLAGS_ITYPE_TCP:
+ hash_type |= XDP_RSS_L4 | XDP_RSS_L4_TCP;
+ break;
+ case RX_CMP_FLAGS_ITYPE_UDP:
+ hash_type |= XDP_RSS_L4 | XDP_RSS_L4_UDP;
+ break;
+ case RX_CMP_FLAGS_ITYPE_ICMP:
+ hash_type |= XDP_RSS_L4 | XDP_RSS_L4_ICMP;
+ break;
+ default:
+ break;
+ }
+ } else if (xdp->cmp_type == CMP_TYPE_RX_L2_V3_CMP) {
+ struct bnxt *bp = netdev_priv(xdp->xdp.rxq->dev);
+
+ if (rxcmp1->rx_cmp_flags2 & cpu_to_le32(RX_CMP_FLAGS2_IP_TYPE))
+ hash_type |= XDP_RSS_TYPE_L3_IPV6;
+ else
+ hash_type |= XDP_RSS_TYPE_L3_IPV4;
+
+ if (bnxt_rss_ext_op(bp, rxcmp) == PKT_HASH_TYPE_L4)
+ hash_type |= XDP_RSS_L4;
+ }
+
+ *rss_type = hash_type;
+ return 0;
+}