Commit 4020b7ba authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'net-mlx5e-misc-changes-2025-07-22'

Tariq Toukan says:

====================
net/mlx5e: misc changes 2025-07-22

This series contains misc enhancements to the mlx5e driver.
====================

Link: https://patch.msgid.link/1753194228-333722-1-git-send-email-tariqt@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents cf51016b 5474ca21
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -311,6 +311,30 @@ mlx5e_tx_reporter_diagnose_common_config(struct devlink_health_reporter *reporte
	mlx5e_health_fmsg_named_obj_nest_end(fmsg);
}

static void
mlx5e_tx_reporter_diagnose_tis_config(struct devlink_health_reporter *reporter,
				      struct devlink_fmsg *fmsg)
{
	struct mlx5e_priv *priv = devlink_health_reporter_priv(reporter);
	u8 num_tc = mlx5e_get_dcb_num_tc(&priv->channels.params);
	u32 tc, i, tisn;

	devlink_fmsg_arr_pair_nest_start(fmsg, "TIS Config");
	for (i = 0; i < mlx5e_get_num_lag_ports(priv->mdev); i++) {
		for (tc = 0; tc < num_tc; tc++) {
			tisn = mlx5e_profile_get_tisn(priv->mdev, priv,
						      priv->profile, i, tc);

			devlink_fmsg_obj_nest_start(fmsg);
			devlink_fmsg_u32_pair_put(fmsg, "lag port", i);
			devlink_fmsg_u32_pair_put(fmsg, "tc", tc);
			devlink_fmsg_u32_pair_put(fmsg, "tisn", tisn);
			devlink_fmsg_obj_nest_end(fmsg);
		}
	}
	devlink_fmsg_arr_pair_nest_end(fmsg);
}

static int mlx5e_tx_reporter_diagnose(struct devlink_health_reporter *reporter,
				      struct devlink_fmsg *fmsg,
				      struct netlink_ext_ack *extack)
@@ -326,6 +350,7 @@ static int mlx5e_tx_reporter_diagnose(struct devlink_health_reporter *reporter,
		goto unlock;

	mlx5e_tx_reporter_diagnose_common_config(reporter, fmsg);
	mlx5e_tx_reporter_diagnose_tis_config(reporter, fmsg);
	devlink_fmsg_arr_pair_nest_start(fmsg, "SQs");

	for (i = 0; i < priv->channels.num; i++) {
+80 −2
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
#include <linux/inetdevice.h>
#include <linux/netdevice.h>
#include <net/netevent.h>
#include <net/ipv6_stubs.h>

#include "en.h"
#include "eswitch.h"
@@ -259,9 +260,15 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry,
				  struct mlx5_accel_esp_xfrm_attrs *attrs)
{
	struct mlx5_core_dev *mdev = mlx5e_ipsec_sa2dev(sa_entry);
	struct mlx5e_ipsec_addr *addrs = &attrs->addrs;
	struct net_device *netdev = sa_entry->dev;
	struct xfrm_state *x = sa_entry->x;
	struct dst_entry *rt_dst_entry;
	struct flowi4 fl4 = {};
	struct flowi6 fl6 = {};
	struct neighbour *n;
	u8 addr[ETH_ALEN];
	struct rtable *rt;
	const void *pkey;
	u8 *dst, *src;

@@ -274,18 +281,89 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry,
	case XFRM_DEV_OFFLOAD_IN:
		src = attrs->dmac;
		dst = attrs->smac;
		pkey = &attrs->addrs.saddr.a4;

		switch (addrs->family) {
		case AF_INET:
			fl4.flowi4_proto = x->sel.proto;
			fl4.daddr = addrs->saddr.a4;
			fl4.saddr = addrs->daddr.a4;
			pkey = &addrs->saddr.a4;
			break;
		case AF_INET6:
			fl6.flowi6_proto = x->sel.proto;
			memcpy(fl6.daddr.s6_addr32, addrs->saddr.a6, 16);
			memcpy(fl6.saddr.s6_addr32, addrs->daddr.a6, 16);
			pkey = &addrs->saddr.a6;
			break;
		default:
			return;
		}
		break;
	case XFRM_DEV_OFFLOAD_OUT:
		src = attrs->smac;
		dst = attrs->dmac;
		pkey = &attrs->addrs.daddr.a4;
		switch (addrs->family) {
		case AF_INET:
			fl4.flowi4_proto = x->sel.proto;
			fl4.daddr = addrs->daddr.a4;
			fl4.saddr = addrs->saddr.a4;
			pkey = &addrs->daddr.a4;
			break;
		case AF_INET6:
			fl6.flowi6_proto = x->sel.proto;
			memcpy(fl6.daddr.s6_addr32, addrs->daddr.a6, 16);
			memcpy(fl6.saddr.s6_addr32, addrs->saddr.a6, 16);
			pkey = &addrs->daddr.a6;
			break;
		default:
			return;
		}
		break;
	default:
		return;
	}

	ether_addr_copy(src, addr);

	/* Destination can refer to a routed network, so perform FIB lookup
	 * to resolve nexthop and get its MAC. Neighbour resolution is used as
	 * fallback.
	 */
	switch (addrs->family) {
	case AF_INET:
		rt = ip_route_output_key(dev_net(netdev), &fl4);
		if (IS_ERR(rt))
			goto neigh;

		if (rt->rt_type != RTN_UNICAST) {
			ip_rt_put(rt);
			goto neigh;
		}
		rt_dst_entry = &rt->dst;
		break;
	case AF_INET6:
		rt_dst_entry = ipv6_stub->ipv6_dst_lookup_flow(
			dev_net(netdev), NULL, &fl6, NULL);
		if (IS_ERR(rt_dst_entry))
			goto neigh;
		break;
	default:
		return;
	}

	n = dst_neigh_lookup(rt_dst_entry, pkey);
	if (!n) {
		dst_release(rt_dst_entry);
		goto neigh;
	}

	neigh_ha_snapshot(addr, n, netdev);
	ether_addr_copy(dst, addr);
	dst_release(rt_dst_entry);
	neigh_release(n);
	return;

neigh:
	n = neigh_lookup(&arp_tbl, pkey, netdev);
	if (!n) {
		n = neigh_create(&arp_tbl, pkey, netdev);