Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6685987c authored by Petr Machata's avatar Petr Machata Committed by David S. Miller
Browse files

switchdev: Add extack argument to call_switchdev_notifiers()



A follow-up patch will enable vetoing of FDB entries. Make it possible
to communicate details of why an FDB entry is not acceptable back to the
user.

Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4c59b7d1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -196,7 +196,7 @@ The switch device will learn/forget source MAC address/VLAN on ingress packets
and notify the switch driver of the mac/vlan/port tuples.  The switch driver,
in turn, will notify the bridge driver using the switchdev notifier call:

	err = call_switchdev_notifiers(val, dev, info);
	err = call_switchdev_notifiers(val, dev, info, extack);

Where val is SWITCHDEV_FDB_ADD when learning and SWITCHDEV_FDB_DEL when
forgetting, and info points to a struct switchdev_notifier_fdb_info.  On
+4 −2
Original line number Diff line number Diff line
@@ -7294,7 +7294,8 @@ static void mlxsw_sp_rif_vlan_fdb_del(struct mlxsw_sp_rif *rif, const char *mac)

	info.addr = mac;
	info.vid = vid;
	call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, dev, &info.info);
	call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, dev, &info.info,
				 NULL);
}

static const struct mlxsw_sp_rif_ops mlxsw_sp_rif_vlan_ops = {
@@ -7381,7 +7382,8 @@ static void mlxsw_sp_rif_fid_fdb_del(struct mlxsw_sp_rif *rif, const char *mac)

	info.addr = mac;
	info.vid = 0;
	call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, dev, &info.info);
	call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, dev, &info.info,
				 NULL);
}

static const struct mlxsw_sp_rif_ops mlxsw_sp_rif_fid_ops = {
+6 −6
Original line number Diff line number Diff line
@@ -2443,7 +2443,7 @@ static void mlxsw_sp_fdb_vxlan_call_notifiers(struct net_device *dev,
	ether_addr_copy(info.eth_addr, mac);
	info.vni = vni;
	info.offloaded = adding;
	call_switchdev_notifiers(type, dev, &info.info);
	call_switchdev_notifiers(type, dev, &info.info, NULL);
}

static void mlxsw_sp_fdb_nve_call_notifiers(struct net_device *dev,
@@ -2468,7 +2468,7 @@ mlxsw_sp_fdb_call_notifiers(enum switchdev_notifier_type type,
	info.addr = mac;
	info.vid = vid;
	info.offloaded = offloaded;
	call_switchdev_notifiers(type, dev, &info.info);
	call_switchdev_notifiers(type, dev, &info.info, NULL);
}

static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
@@ -2819,7 +2819,7 @@ mlxsw_sp_switchdev_bridge_vxlan_fdb_event(struct mlxsw_sp *mlxsw_sp,
			return;
		vxlan_fdb_info.offloaded = true;
		call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
					 &vxlan_fdb_info.info);
					 &vxlan_fdb_info.info, NULL);
		mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
					    vxlan_fdb_info.eth_addr,
					    fdb_info->vid, dev, true);
@@ -2832,7 +2832,7 @@ mlxsw_sp_switchdev_bridge_vxlan_fdb_event(struct mlxsw_sp *mlxsw_sp,
						     false);
		vxlan_fdb_info.offloaded = false;
		call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
					 &vxlan_fdb_info.info);
					 &vxlan_fdb_info.info, NULL);
		break;
	}
}
@@ -2977,7 +2977,7 @@ mlxsw_sp_switchdev_vxlan_fdb_add(struct mlxsw_sp *mlxsw_sp,
		}
		vxlan_fdb_info->offloaded = true;
		call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
					 &vxlan_fdb_info->info);
					 &vxlan_fdb_info->info, NULL);
		mlxsw_sp_fid_put(fid);
		return;
	}
@@ -2998,7 +2998,7 @@ mlxsw_sp_switchdev_vxlan_fdb_add(struct mlxsw_sp *mlxsw_sp,
		goto err_fdb_tunnel_uc_op;
	vxlan_fdb_info->offloaded = true;
	call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
				 &vxlan_fdb_info->info);
				 &vxlan_fdb_info->info, NULL);
	mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
				    vxlan_fdb_info->eth_addr, vid, dev, true);

+1 −1
Original line number Diff line number Diff line
@@ -2725,7 +2725,7 @@ rocker_fdb_offload_notify(struct rocker_port *rocker_port,
	info.vid = recv_info->vid;
	info.offloaded = true;
	call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
				 rocker_port->dev, &info.info);
				 rocker_port->dev, &info.info, NULL);
}

static void rocker_switchdev_event_work(struct work_struct *work)
+2 −2
Original line number Diff line number Diff line
@@ -1833,10 +1833,10 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work)
	rtnl_lock();
	if (learned && removing)
		call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE,
					 lw->ofdpa_port->dev, &info.info);
					 lw->ofdpa_port->dev, &info.info, NULL);
	else if (learned && !removing)
		call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE,
					 lw->ofdpa_port->dev, &info.info);
					 lw->ofdpa_port->dev, &info.info, NULL);
	rtnl_unlock();

	kfree(work);
Loading