Hi Ido,

On Thu, Mar 05, 2020 at 04:49:37PM +0200, Ido Schimmel wrote:
> On Tue, Feb 25, 2020 at 04:30:54PM +0000, Vadym Kochan wrote:
> > +int mvsw_pr_port_learning_set(struct mvsw_pr_port *port, bool learn)
> > +{
> > +   return mvsw_pr_hw_port_learning_set(port, learn);
> > +}
> > +
> > +int mvsw_pr_port_flood_set(struct mvsw_pr_port *port, bool flood)
> > +{
> > +   return mvsw_pr_hw_port_flood_set(port, flood);
> > +}
> 
> Flooding and learning are per-port attributes? Not per-{port, VLAN} ?
> If so, you need to have various restrictions in the driver in case
> someone configures multiple vlan devices on top of a port and enslaves
> them to different bridges.
> 
> > +
> > +
> > +   INIT_LIST_HEAD(&port->vlans_list);
> > +   port->pvid = MVSW_PR_DEFAULT_VID;
> 
> If you're using VID 1, then you need to make sure that user cannot
> configure a VLAN device with with this VID. If possible, I suggest that
> you use VID 4095, as it cannot be configured from user space.
> 
> I'm actually not entirely sure why you need a default VID.
> 
 
> > +mvsw_pr_port_vlan_bridge_join(struct mvsw_pr_port_vlan *port_vlan,
> > +                         struct mvsw_pr_bridge_port *br_port,
> > +                         struct netlink_ext_ack *extack)
> > +{
> > +   struct mvsw_pr_port *port = port_vlan->mvsw_pr_port;
> > +   struct mvsw_pr_bridge_vlan *br_vlan;
> > +   u16 vid = port_vlan->vid;
> > +   int err;
> > +
> > +   if (port_vlan->bridge_port)
> > +           return 0;
> > +
> > +   err = mvsw_pr_port_flood_set(port, br_port->flags & BR_FLOOD);
> > +   if (err)
> > +           return err;
> > +
> > +   err = mvsw_pr_port_learning_set(port, br_port->flags & BR_LEARNING);
> > +   if (err)
> > +           goto err_port_learning_set;
> 
> It seems that learning and flooding are not per-{port, VLAN} attributes,
> so I'm not sure why you have this here.
> 
> The fact that you don't undo this in mvsw_pr_port_vlan_bridge_leave()
> tells me it should not be here.
> 

 > +
> > +void
> > +mvsw_pr_port_vlan_bridge_leave(struct mvsw_pr_port_vlan *port_vlan)
> > +{
> > +   struct mvsw_pr_port *port = port_vlan->mvsw_pr_port;
> > +   struct mvsw_pr_bridge_vlan *br_vlan;
> > +   struct mvsw_pr_bridge_port *br_port;
> > +   int port_count;
> > +   u16 vid = port_vlan->vid;
> > +   bool last_port, last_vlan;
> > +
> > +   br_port = port_vlan->bridge_port;
> > +   last_vlan = list_is_singular(&br_port->vlan_list);
> > +   port_count =
> > +       mvsw_pr_bridge_vlan_port_count_get(br_port->bridge_device, vid);
> > +   br_vlan = mvsw_pr_bridge_vlan_find(br_port, vid);
> > +   last_port = port_count == 1;
> > +   if (last_vlan) {
> > +           mvsw_pr_fdb_flush_port(port, MVSW_PR_FDB_FLUSH_MODE_DYNAMIC);
> > +   } else if (last_port) {
> > +           mvsw_pr_fdb_flush_vlan(port->sw, vid,
> > +                                  MVSW_PR_FDB_FLUSH_MODE_DYNAMIC);
> > +   } else {
> > +           mvsw_pr_fdb_flush_port_vlan(port, vid,
> > +                                       MVSW_PR_FDB_FLUSH_MODE_DYNAMIC);
> 
> If you always flush based on {port, VID}, then why do you need the other
> two?
> 

 > +
> > +static int mvsw_pr_port_obj_attr_set(struct net_device *dev,
> > +                                const struct switchdev_attr *attr,
> > +                                struct switchdev_trans *trans)
> > +{
> > +   int err = 0;
> > +   struct mvsw_pr_port *port = netdev_priv(dev);
> > +
> > +   switch (attr->id) {
> > +   case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
> > +           err = -EOPNOTSUPP;
> 
> You don't support STP?

Not, yet. But it will be in the next submission or official patch.
> 
> > +           break;
 
> > +   default:
> > +           kfree(switchdev_work);
> > +           return NOTIFY_DONE;
> > +   }
> > +
> > +   queue_work(mvsw_owq, &switchdev_work->work);
> 
> Once you defer the operation you cannot return an error, which is
> problematic. Do you have a way to know if the operation will succeed or
> not? That is, if the hardware has enough space for this new FDB entry?
> 
Right, fdb configuration on via fw is blocking operation I still need to
think on it if it is possible by current design.


> 
> Why do you need both 'struct mvsw_pr_switchdev' and 'struct
> mvsw_pr_bridge'? I think the second is enough. Also, I assume
> 'switchdev' naming is inspired by mlxsw, but 'bridge' is better.
> 
I changed to use bridge for bridge object, because having bridge_device
may confuse.

Thank you for your comments they were very useful, sorry for so late
answer, I decided to re-implement this version a bit. Regarding flooding
and default vid I still need to check it.

Regards,
Vadym Kochan

Reply via email to