Commit 32d098bb authored by Yevhen Orlov's avatar Yevhen Orlov Committed by Jakub Kicinski
Browse files

net: marvell: prestera: Refactor router functions



* Reverse xmas tree variables order
* User friendly messages on error paths
* Refactor __prestera_inetaddr_event to use early return

Signed-off-by: default avatarYevhen Orlov <yevhen.orlov@plvision.eu>
Link: https://lore.kernel.org/r/20220111011051.4941-1-yevhen.orlov@plvision.eu


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 6a1ba875
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -1831,8 +1831,8 @@ static int prestera_iface_to_msg(struct prestera_iface *iface,
int prestera_hw_rif_create(struct prestera_switch *sw,
int prestera_hw_rif_create(struct prestera_switch *sw,
			   struct prestera_iface *iif, u8 *mac, u16 *rif_id)
			   struct prestera_iface *iif, u8 *mac, u16 *rif_id)
{
{
	struct prestera_msg_rif_req req;
	struct prestera_msg_rif_resp resp;
	struct prestera_msg_rif_resp resp;
	struct prestera_msg_rif_req req;
	int err;
	int err;


	memcpy(req.mac, mac, ETH_ALEN);
	memcpy(req.mac, mac, ETH_ALEN);
@@ -1868,9 +1868,9 @@ int prestera_hw_rif_delete(struct prestera_switch *sw, u16 rif_id,


int prestera_hw_vr_create(struct prestera_switch *sw, u16 *vr_id)
int prestera_hw_vr_create(struct prestera_switch *sw, u16 *vr_id)
{
{
	int err;
	struct prestera_msg_vr_resp resp;
	struct prestera_msg_vr_resp resp;
	struct prestera_msg_vr_req req;
	struct prestera_msg_vr_req req;
	int err;


	err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ROUTER_VR_CREATE,
	err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ROUTER_VR_CREATE,
			       &req.cmd, sizeof(req), &resp.ret, sizeof(resp));
			       &req.cmd, sizeof(req), &resp.ret, sizeof(resp));
+11 −9
Original line number Original line Diff line number Diff line
@@ -25,10 +25,10 @@ static int __prestera_inetaddr_port_event(struct net_device *port_dev,
					  struct netlink_ext_ack *extack)
					  struct netlink_ext_ack *extack)
{
{
	struct prestera_port *port = netdev_priv(port_dev);
	struct prestera_port *port = netdev_priv(port_dev);
	int err;
	struct prestera_rif_entry *re;
	struct prestera_rif_entry_key re_key = {};
	struct prestera_rif_entry_key re_key = {};
	struct prestera_rif_entry *re;
	u32 kern_tb_id;
	u32 kern_tb_id;
	int err;


	err = prestera_is_valid_mac_addr(port, port_dev->dev_addr);
	err = prestera_is_valid_mac_addr(port, port_dev->dev_addr);
	if (err) {
	if (err) {
@@ -45,21 +45,21 @@ static int __prestera_inetaddr_port_event(struct net_device *port_dev,
	switch (event) {
	switch (event) {
	case NETDEV_UP:
	case NETDEV_UP:
		if (re) {
		if (re) {
			NL_SET_ERR_MSG_MOD(extack, "rif_entry already exist");
			NL_SET_ERR_MSG_MOD(extack, "RIF already exist");
			return -EEXIST;
			return -EEXIST;
		}
		}
		re = prestera_rif_entry_create(port->sw, &re_key,
		re = prestera_rif_entry_create(port->sw, &re_key,
					       prestera_fix_tb_id(kern_tb_id),
					       prestera_fix_tb_id(kern_tb_id),
					       port_dev->dev_addr);
					       port_dev->dev_addr);
		if (!re) {
		if (!re) {
			NL_SET_ERR_MSG_MOD(extack, "Can't create rif_entry");
			NL_SET_ERR_MSG_MOD(extack, "Can't create RIF");
			return -EINVAL;
			return -EINVAL;
		}
		}
		dev_hold(port_dev);
		dev_hold(port_dev);
		break;
		break;
	case NETDEV_DOWN:
	case NETDEV_DOWN:
		if (!re) {
		if (!re) {
			NL_SET_ERR_MSG_MOD(extack, "rif_entry not exist");
			NL_SET_ERR_MSG_MOD(extack, "Can't find RIF");
			return -EEXIST;
			return -EEXIST;
		}
		}
		prestera_rif_entry_destroy(port->sw, re);
		prestera_rif_entry_destroy(port->sw, re);
@@ -75,11 +75,11 @@ static int __prestera_inetaddr_event(struct prestera_switch *sw,
				     unsigned long event,
				     unsigned long event,
				     struct netlink_ext_ack *extack)
				     struct netlink_ext_ack *extack)
{
{
	if (prestera_netdev_check(dev) && !netif_is_bridge_port(dev) &&
	if (!prestera_netdev_check(dev) || netif_is_bridge_port(dev) ||
	    !netif_is_lag_port(dev) && !netif_is_ovs_port(dev))
	    netif_is_lag_port(dev) || netif_is_ovs_port(dev))
		return __prestera_inetaddr_port_event(dev, event, extack);

		return 0;
		return 0;

	return __prestera_inetaddr_port_event(dev, event, extack);
}
}


static int __prestera_inetaddr_cb(struct notifier_block *nb,
static int __prestera_inetaddr_cb(struct notifier_block *nb,
@@ -126,6 +126,8 @@ static int __prestera_inetaddr_valid_cb(struct notifier_block *nb,
		goto out;
		goto out;


	if (ipv4_is_multicast(ivi->ivi_addr)) {
	if (ipv4_is_multicast(ivi->ivi_addr)) {
		NL_SET_ERR_MSG_MOD(ivi->extack,
				   "Multicast addr on RIF is not supported");
		err = -EINVAL;
		err = -EINVAL;
		goto out;
		goto out;
	}
	}
+1 −1
Original line number Original line Diff line number Diff line
@@ -123,7 +123,7 @@ __prestera_rif_entry_key_copy(const struct prestera_rif_entry_key *in,
		out->iface.vlan_id = in->iface.vlan_id;
		out->iface.vlan_id = in->iface.vlan_id;
		break;
		break;
	default:
	default:
		pr_err("Unsupported iface type");
		WARN(1, "Unsupported iface type");
		return -EINVAL;
		return -EINVAL;
	}
	}