diff mbox

[v2] mac80211: Supporting of IFLA_INFO_KIND rtnl attribute

Message ID 1417947627-2329-1-git-send-email-vadim4j@gmail.com (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Vadim Kochan Dec. 7, 2014, 10:20 a.m. UTC
It allows to identify the wlan kind of device for
the user application, e.g.:

    # ip -d link

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0
    2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
        link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0
    3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0
        wlan

Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
 net/mac80211/iface.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Johannes Berg Dec. 8, 2014, 7:27 a.m. UTC | #1
On Sun, 2014-12-07 at 12:20 +0200, Vadim Kochan wrote:

> +++ b/net/mac80211/iface.c

> @@ -1624,6 +1625,10 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
>  	mutex_unlock(&local->iflist_mtx);
>  }
>  
> +static struct rtnl_link_ops wireless_link_ops __read_mostly = {
> +	.kind = "wlan",
> +};

I think it would make sense to set it - if not already set - in the
netdev notifier in cfg80211.

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vadim Kochan Dec. 8, 2014, 10:07 a.m. UTC | #2
You meant here ?

net/wireless/core.c : static int cfg80211_netdev_notifier_call(struct
notifier_block *nb,
                                          unsigned long state, void *ptr)
{

    ...
    switch (state) {
             case NETDEV_POST_INIT:
                     SET_NETDEV_DEVTYPE(dev, &wiphy_type);
                     break;
             case NETDEV_REGISTER:
                     ...
                     dev->rtnl_link_ops = &wireless_link_ops;
                     ...
    }
    ...
}

Regards,

On Mon, Dec 8, 2014 at 9:27 AM, Johannes Berg <johannes@sipsolutions.net> wrote:
> On Sun, 2014-12-07 at 12:20 +0200, Vadim Kochan wrote:
>
>> +++ b/net/mac80211/iface.c
>
>> @@ -1624,6 +1625,10 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
>>       mutex_unlock(&local->iflist_mtx);
>>  }
>>
>> +static struct rtnl_link_ops wireless_link_ops __read_mostly = {
>> +     .kind = "wlan",
>> +};
>
> I think it would make sense to set it - if not already set - in the
> netdev notifier in cfg80211.
>
> johannes
>
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Berg Dec. 8, 2014, 10:17 a.m. UTC | #3
On Mon, 2014-12-08 at 12:07 +0200, Vadim Kochan wrote:
> You meant here ?
> 
> net/wireless/core.c : static int cfg80211_netdev_notifier_call(struct
> notifier_block *nb,
>                                           unsigned long state, void *ptr)
> {
> 
>     ...
>     switch (state) {
>              case NETDEV_POST_INIT:
>                      SET_NETDEV_DEVTYPE(dev, &wiphy_type);
>                      break;
>              case NETDEV_REGISTER:
>                      ...
>                      dev->rtnl_link_ops = &wireless_link_ops;
>                      ...
>     }

Well it seems it could go more with the SET_NETDEV_TYPE()?

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vadim Kochan Dec. 8, 2014, 9:48 p.m. UTC | #4
On Mon, Dec 08, 2014 at 11:17:03AM +0100, Johannes Berg wrote:
> On Mon, 2014-12-08 at 12:07 +0200, Vadim Kochan wrote:
> > You meant here ?
> > 
> > net/wireless/core.c : static int cfg80211_netdev_notifier_call(struct
> > notifier_block *nb,
> >                                           unsigned long state, void *ptr)
> > {
> > 
> >     ...
> >     switch (state) {
> >              case NETDEV_POST_INIT:
> >                      SET_NETDEV_DEVTYPE(dev, &wiphy_type);
> >                      break;
> >              case NETDEV_REGISTER:
> >                      ...
> >                      dev->rtnl_link_ops = &wireless_link_ops;
> >                      ...
> >     }
> 
> Well it seems it could go more with the SET_NETDEV_TYPE()?
> 
> johannes
> 

What I worry about is this peace of code in net/core/dev.c : 

    int register_netdevice(struct net_device *dev)
    {
            ...

            if (!dev->rtnl_link_ops ||
                dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
                    rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U, GFP_KERNEL);
            ...
    }

which will skip sending RTM_NEWLINK message if it has rtnl_link_ops ...
Actually meanwhile I dont see any problems as my wifi works OK with
these changes, but I want to be sure in 100% that it does not break
anything ...

So I am under investigating this ... Maybe you can suggest ?

Thanks,
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Berg Dec. 9, 2014, 8:24 a.m. UTC | #5
On Mon, 2014-12-08 at 23:48 +0200, vadim4j@gmail.com wrote:

> What I worry about is this peace of code in net/core/dev.c : 
> 
>     int register_netdevice(struct net_device *dev)
>     {
>             ...
> 
>             if (!dev->rtnl_link_ops ||
>                 dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
>                     rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U, GFP_KERNEL);
>             ...
>     }

rtnl_link_state should be RTNL_LINK_INITIALIZED though, unless somebody
set something else.

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vadim Kochan Dec. 9, 2014, 10:08 p.m. UTC | #6
On Tue, Dec 09, 2014 at 09:24:18AM +0100, Johannes Berg wrote:
> On Mon, 2014-12-08 at 23:48 +0200, vadim4j@gmail.com wrote:
> 
> > What I worry about is this peace of code in net/core/dev.c : 
> > 
> >     int register_netdevice(struct net_device *dev)
> >     {
> >             ...
> > 
> >             if (!dev->rtnl_link_ops ||
> >                 dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
> >                     rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U, GFP_KERNEL);
> >             ...
> >     }
> 
> rtnl_link_state should be RTNL_LINK_INITIALIZED though, unless somebody
> set something else.
> 
> johannes
> 

OK I tested & checked by code that RTNL_LINK_INITIALIZED is set, and
RTM_NEWLINK message will be sent as it was before.

I will resend the patch.

Thanks,
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 653f5eb..e48372b 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -18,6 +18,7 @@ 
 #include <linux/rtnetlink.h>
 #include <net/mac80211.h>
 #include <net/ieee80211_radiotap.h>
+#include <net/rtnetlink.h>
 #include "ieee80211_i.h"
 #include "sta_info.h"
 #include "debugfs_netdev.h"
@@ -1624,6 +1625,10 @@  static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
 	mutex_unlock(&local->iflist_mtx);
 }
 
+static struct rtnl_link_ops wireless_link_ops __read_mostly = {
+	.kind = "wlan",
+};
+
 int ieee80211_if_add(struct ieee80211_local *local, const char *name,
 		     struct wireless_dev **new_wdev, enum nl80211_iftype type,
 		     struct vif_params *params)
@@ -1684,6 +1689,8 @@  int ieee80211_if_add(struct ieee80211_local *local, const char *name,
 		memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN);
 		memcpy(sdata->name, ndev->name, IFNAMSIZ);
 
+		ndev->rtnl_link_ops = &wireless_link_ops;
+
 		sdata->dev = ndev;
 	}