[RFC PATCH 3/3] net/ncsi: Configure VLAN tag filter

Joel Stanley joel at jms.id.au
Thu Aug 10 17:49:29 AEST 2017


On Wed, Aug 9, 2017 at 6:24 PM, Samuel Mendoza-Jonas
<sam at mendozajonas.com> wrote:
> Make use of the ndo_vlan_rx_{add,kill}_vid callbacks to have the NCSI
> stack process new VLAN tags and configure the channel VLAN filter
> appropriately.
> Several VLAN tags can be set and a "Set VLAN Filter" packet must be sent
> for each one, meaning the ncsi_dev_state_config_svf state must be
> repeated. An internal list of VLAN tags is maintained, and compared
> against the current channel's ncsi_channel_filter in order to keep track
> within the state. VLAN filters are removed in a similar manner, with the
> introduction of the ncsi_dev_state_config_clear_vids state. The maximum
> number of VLAN tag filters is determined by the "Get Capabilities"
> response from the channel.
>
> Signed-off-by: Samuel Mendoza-Jonas <sam at mendozajonas.com>

Thanks Sam. I've made some comments below.

> ---
>  drivers/net/ethernet/faraday/ftgmac100.c |   2 +
>  include/net/ncsi.h                       |   2 +
>  net/ncsi/internal.h                      |  11 ++
>  net/ncsi/ncsi-manage.c                   | 257 ++++++++++++++++++++++++++++++-
>  net/ncsi/ncsi-rsp.c                      |  13 +-
>  5 files changed, 281 insertions(+), 4 deletions(-)


> @@ -699,11 +706,93 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
>                 nca.package = np->id;
>                 nca.channel = nc->id;
>
> +               /* Clear any active filters on the channel before setting */
> +               if (nd->state == ncsi_dev_state_config_clear_vids) {

This is epic. Could it go in a function?

> +                       clear = false;
> +                       vlan_index = -1;
> +                       spin_lock_irqsave(&nc->lock, flags);
> +                       ncf = nc->filters[NCSI_FILTER_VLAN];
> +                       while ((vlan_index = find_next_bit((void *)&ncf->bitmap, ncf->total, vlan_index + 1))

We should make ->bitmap an unsigned long, then we can pass it to
find_next_bit without casting. Other users of it do the same thing
with a temporary variable.

> +                              < ncf->total) {
> +                               clear = true;
> +                               // TODO retrieve the vid that was set

Still WIP?

> +                               netdev_printk(KERN_DEBUG, dev, "ncsi: removed vlan tag at index %d\n",

Do we get a ncsi prefix from the driver name?

> +                                               vlan_index);
> +                               ncsi_remove_filter(nc, NCSI_FILTER_VLAN, vlan_index);
> +                               break;
> +                       }
> +                       spin_unlock_irqrestore(&nc->lock, flags);
> +

> +int ncsi_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
> +{
> +       struct ncsi_channel_filter *ncf;
> +       struct ncsi_dev_priv *ndp;
> +       unsigned int n_vids = 0;
> +       struct vlan_vid *vlan;
> +       struct ncsi_dev *nd;
> +       bool found = false;

> +
> +       if (n_vids >= ncf->total) {
> +               netdev_info(dev, "NCSI Channel supports up to %u VLAN tags but %u are already set\n",
> +                               ncf->total, n_vids);
> +               return -EINVAL;
> +       }
> +
> +       vlan = kzalloc(sizeof(struct vlan_vid), GFP_KERNEL);

Does this get freed anywhere?

> +       if (!vlan) {
> +               netdev_err(dev, "could not alloc vlan_vid struct\n");
> +               return -ENOMEM;
> +       }
>


More information about the openbmc mailing list