Messages in this thread | ![/](/images/icornerl.gif) | | Date | Thu, 30 Dec 2021 16:39:23 +0200 | From | Ido Schimmel <> | Subject | Re: [PATCH net-next v2 6/6] net: marvell: prestera: Implement initial inetaddr notifiers |
| |
On Mon, Dec 27, 2021 at 11:52:31PM +0200, Yevhen Orlov wrote: > Add inetaddr notifiers to support add/del IPv4 address on switchdev > port. We create TRAP on first address, added on port and delete TRAP, > when last address removed. > Currently, driver supports only regular port to became routed. > Other port type support will be added later > > Co-developed-by: Taras Chornyi <tchornyi@marvell.com> > Signed-off-by: Taras Chornyi <tchornyi@marvell.com> > Co-developed-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu> > Signed-off-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu> > Signed-off-by: Yevhen Orlov <yevhen.orlov@plvision.eu> > --- > v1-->v2 > * Remove useless assigment in prestera_fix_tb_id > --- > .../marvell/prestera/prestera_router.c | 40 +++++++++++++++++++ > 1 file changed, 40 insertions(+) > > diff --git a/drivers/net/ethernet/marvell/prestera/prestera_router.c b/drivers/net/ethernet/marvell/prestera/prestera_router.c > index 0eb5f5e00e4e..483f0ba45ce0 100644 > --- a/drivers/net/ethernet/marvell/prestera/prestera_router.c > +++ b/drivers/net/ethernet/marvell/prestera/prestera_router.c > @@ -4,16 +4,31 @@ > #include <linux/kernel.h> > #include <linux/types.h> > #include <linux/inetdevice.h> > +#include <net/switchdev.h> > > #include "prestera.h" > #include "prestera_router_hw.h" > > +/* This util to be used, to convert kernel rules for default vr in hw_vr */ > +static u32 prestera_fix_tb_id(u32 tb_id) > +{ > + if (tb_id == RT_TABLE_UNSPEC || > + tb_id == RT_TABLE_LOCAL || > + tb_id == RT_TABLE_DEFAULT) > + tb_id = RT_TABLE_MAIN; > + > + return tb_id; > +} > + > static int __prestera_inetaddr_port_event(struct net_device *port_dev, > unsigned long event, > struct netlink_ext_ack *extack) > { > struct prestera_port *port = netdev_priv(port_dev); > int err; > + struct prestera_rif_entry *re; > + struct prestera_rif_entry_key re_key = {}; > + u32 kern_tb_id;
Reverse xmas tree
> > err = prestera_is_valid_mac_addr(port, port_dev->dev_addr); > if (err) { > @@ -21,9 +36,34 @@ static int __prestera_inetaddr_port_event(struct net_device *port_dev, > return err; > } > > + kern_tb_id = l3mdev_fib_table(port_dev); > + re_key.iface.type = PRESTERA_IF_PORT_E; > + re_key.iface.dev_port.hw_dev_num = port->dev_id; > + re_key.iface.dev_port.port_num = port->hw_id; > + re = prestera_rif_entry_find(port->sw, &re_key); > + > switch (event) { > case NETDEV_UP: > + if (re) { > + NL_SET_ERR_MSG_MOD(extack, "rif_entry already exist");
These messages are communicated to user space so use a message that is more user friendly / informative
> + return -EEXIST; > + } > + re = prestera_rif_entry_create(port->sw, &re_key, > + prestera_fix_tb_id(kern_tb_id), > + port_dev->dev_addr); > + if (!re) { > + NL_SET_ERR_MSG_MOD(extack, "Can't create rif_entry"); > + return -EINVAL; > + } > + dev_hold(port_dev);
What is the purpose of this dev_hold()?
> + break; > case NETDEV_DOWN: > + if (!re) { > + NL_SET_ERR_MSG_MOD(extack, "rif_entry not exist"); > + return -EEXIST; > + } > + prestera_rif_entry_destroy(port->sw, re); > + dev_put(port_dev); > break; > } > > -- > 2.17.1 >
| ![\](/images/icornerr.gif) |