From: Vlad Yasevich <vyasevic@redhat.com>
To: "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: netdev@vger.kernel.org, Patrick McHardy <kaber@trash.net>,
"David S. Miller" <davem@davemloft.net>,
shemminger@vyatta.com
Subject: Re: [PATCH net-next] net: disallow drivers with buggy VLAN accel to register_netdevice()
Date: Tue, 29 Jan 2013 20:17:45 -0500 [thread overview]
Message-ID: <510874B9.5000208@redhat.com> (raw)
In-Reply-To: <c7fdfc32f69e7a4c3bfcaa8b2ee842aa9b286c91.1359507017.git.mirq-linux@rere.qmqm.pl>
On 01/29/2013 08:14 PM, Michał Mirosław wrote:
> Instead of jumping aroung bugs that are easily fixed just don't let them in:
> affected drivers should be either fixed or have NETIF_F_HW_VLAN_FILTER
> removed from advertised features.
>
> Quick grep in drivers/net shows two drivers that have NETIF_F_HW_VLAN_FILTER
> but not ndo_vlan_rx_add/kill_vid(), but those are false-positives (features
> are commented out).
>
> OTOH two drivers have ndo_vlan_rx_add/kill_vid() implemented but don't
> advertise NETIF_F_HW_VLAN_FILTER. Those are:
I am a bit hesitant to completely disable drivers, but I guess it would
force people to fix their drivers if this is applied.
-vlad
>
> +ethernet/cisco/enic/enic_main.c
> +ethernet/qlogic/qlcnic/qlcnic_main.c
>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> net/8021q/vlan.c | 7 -------
> net/8021q/vlan_core.c | 6 ++----
> net/core/dev.c | 8 ++++++++
> 3 files changed, 10 insertions(+), 11 deletions(-)
>
> Not run-tested. Survived make allmodconfig && make net/ drivers/net/
>
> diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
> index babfde9..addc578 100644
> --- a/net/8021q/vlan.c
> +++ b/net/8021q/vlan.c
> @@ -117,19 +117,12 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)
> int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id)
> {
> const char *name = real_dev->name;
> - const struct net_device_ops *ops = real_dev->netdev_ops;
>
> if (real_dev->features & NETIF_F_VLAN_CHALLENGED) {
> pr_info("VLANs not supported on %s\n", name);
> return -EOPNOTSUPP;
> }
>
> - if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) &&
> - (!ops->ndo_vlan_rx_add_vid || !ops->ndo_vlan_rx_kill_vid)) {
> - pr_info("Device %s has buggy VLAN hw accel\n", name);
> - return -EOPNOTSUPP;
> - }
> -
> if (vlan_find_dev(real_dev, vlan_id) != NULL)
> return -EEXIST;
>
> diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
> index 380440b..71b64fd 100644
> --- a/net/8021q/vlan_core.c
> +++ b/net/8021q/vlan_core.c
> @@ -224,8 +224,7 @@ static int __vlan_vid_add(struct vlan_info *vlan_info, unsigned short vid,
> if (!vid_info)
> return -ENOMEM;
>
> - if ((dev->features & NETIF_F_HW_VLAN_FILTER) &&
> - ops->ndo_vlan_rx_add_vid) {
> + if (dev->features & NETIF_F_HW_VLAN_FILTER) {
> err = ops->ndo_vlan_rx_add_vid(dev, vid);
> if (err) {
> kfree(vid_info);
> @@ -282,8 +281,7 @@ static void __vlan_vid_del(struct vlan_info *vlan_info,
> unsigned short vid = vid_info->vid;
> int err;
>
> - if ((dev->features & NETIF_F_HW_VLAN_FILTER) &&
> - ops->ndo_vlan_rx_kill_vid) {
> + if (dev->features & NETIF_F_HW_VLAN_FILTER) {
> err = ops->ndo_vlan_rx_kill_vid(dev, vid);
> if (err) {
> pr_warn("failed to kill vid %d for device %s\n",
> diff --git a/net/core/dev.c b/net/core/dev.c
> index a83375d..a87bc74 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -6054,6 +6054,14 @@ int register_netdevice(struct net_device *dev)
> }
> }
>
> + if (((dev->hw_features | dev->features) & NETIF_F_HW_VLAN_FILTER) &&
> + (!dev->netdev_ops->ndo_vlan_rx_add_vid ||
> + !dev->netdev_ops->ndo_vlan_rx_kill_vid)) {
> + netdev_WARN(dev, "Buggy VLAN acceleration in driver!\n");
> + ret = -EINVAL;
> + goto err_uninit;
> + }
> +
> ret = -EBUSY;
> if (!dev->ifindex)
> dev->ifindex = dev_new_index(net);
>
next prev parent reply other threads:[~2013-01-30 1:17 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-30 1:14 [PATCH net-next] net: disallow drivers with buggy VLAN accel to register_netdevice() Michał Mirosław
2013-01-30 1:17 ` Vlad Yasevich [this message]
2013-01-30 3:56 ` David Miller
2013-01-30 13:36 ` Vlad Yasevich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=510874B9.5000208@redhat.com \
--to=vyasevic@redhat.com \
--cc=davem@davemloft.net \
--cc=kaber@trash.net \
--cc=mirq-linux@rere.qmqm.pl \
--cc=netdev@vger.kernel.org \
--cc=shemminger@vyatta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.