diff mbox

[RFT] brcmfmac: add support to move wiphy instance into network namespace

Message ID 1489528312-28304-1-git-send-email-arend.vanspriel@broadcom.com (mailing list archive)
State RFC
Delegated to: Kalle Valo
Headers show

Commit Message

Arend van Spriel March 14, 2017, 9:51 p.m. UTC
To support network namespace the driver must assure all created
network interfaces are in the same namespace as the wiphy instance.

Reported-by: Mark Asselstine <mark.asselstine@windriver.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
---
Hi Mark,

Please check this patch. I can not say I am an expert when it comes
to using namespaces. So let me know if it works and I can change
Reported-by into Tested-by.

Regards,
Arend
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c     | 5 ++++-
 2 files changed, 6 insertions(+), 2 deletions(-)

Comments

Johannes Berg March 14, 2017, 10:19 p.m. UTC | #1
On Tue, 2017-03-14 at 21:51 +0000, Arend van Spriel wrote:
> To support network namespace the driver must assure all created
> network interfaces are in the same namespace as the wiphy instance.

FWIW, looks fine to me.

>  	memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
> +	wiphy = cfg_to_wiphy(drvr->config);
> +	dev_net_set(ndev, wiphy_net(wiphy));

You (almost?) don't need the wiphy variable :)

johannes
Arend van Spriel March 15, 2017, 8:54 a.m. UTC | #2
On 14-3-2017 23:19, Johannes Berg wrote:
> On Tue, 2017-03-14 at 21:51 +0000, Arend van Spriel wrote:
>> To support network namespace the driver must assure all created
>> network interfaces are in the same namespace as the wiphy instance.
> 
> FWIW, looks fine to me.

Thanks. Any feedback is worth something ;-)

>>  	memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
>> +	wiphy = cfg_to_wiphy(drvr->config);
>> +	dev_net_set(ndev, wiphy_net(wiphy));
> 
> You (almost?) don't need the wiphy variable :)

Yeah. I could wrap that into wiphy_net() call as it is the only place I
need it. Will do that if I stay clear from column #80.

Regards,
Arend
Mark Asselstine March 16, 2017, 9:51 p.m. UTC | #3
On Tuesday, March 14, 2017 9:51:52 PM EDT Arend van Spriel wrote:
> To support network namespace the driver must assure all created
> network interfaces are in the same namespace as the wiphy instance.
> 
> Reported-by: Mark Asselstine <mark.asselstine@windriver.com>
> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> ---
> Hi Mark,
> 
> Please check this patch. I can not say I am an expert when it comes
> to using namespaces. So let me know if it works and I can change
> Reported-by into Tested-by.

Seems to pass the tests I threw at it. Seems happy with namespaces.

Mark

> 
> Regards,
> Arend
> ---
>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c     | 5 ++++-
>  2 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index
> 3856de6..e0d65df 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> @@ -6450,7 +6450,8 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy,
> struct brcmf_if *ifp) BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
>  				    BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
> 
> -	wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
> +	wiphy->flags |= WIPHY_FLAG_NETNS_OK |
> +			WIPHY_FLAG_PS_ON_BY_DEFAULT |
>  			WIPHY_FLAG_OFFCHAN_TX |
>  			WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
>  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index
> 22b4883..74ede27 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> @@ -463,6 +463,7 @@ static int brcmf_netdev_open(struct net_device *ndev)
>  int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
>  {
>  	struct brcmf_pub *drvr = ifp->drvr;
> +	struct wiphy *wiphy;
>  	struct net_device *ndev;
>  	s32 err;
> 
> @@ -476,8 +477,10 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool
> rtnl_locked) ndev->needed_headroom += drvr->hdrlen;
>  	ndev->ethtool_ops = &brcmf_ethtool_ops;
> 
> -	/* set the mac address */
> +	/* set the mac address & netns */
>  	memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
> +	wiphy = cfg_to_wiphy(drvr->config);
> +	dev_net_set(ndev, wiphy_net(wiphy));
> 
>  	INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
>  	INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);
Arend van Spriel March 17, 2017, 8:21 a.m. UTC | #4
On 16-3-2017 22:51, Mark Asselstine wrote:
> On Tuesday, March 14, 2017 9:51:52 PM EDT Arend van Spriel wrote:
>> To support network namespace the driver must assure all created
>> network interfaces are in the same namespace as the wiphy instance.
>>
>> Reported-by: Mark Asselstine <mark.asselstine@windriver.com>
>> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>> ---
>> Hi Mark,
>>
>> Please check this patch. I can not say I am an expert when it comes
>> to using namespaces. So let me know if it works and I can change
>> Reported-by into Tested-by.
> 
> Seems to pass the tests I threw at it. Seems happy with namespaces.

Thanks. Will queue it for submission and add Tested-by: tag.

Regards,
Arend

> Mark
> 
>>
>> Regards,
>> Arend
>> ---
>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c     | 5 ++++-
>>  2 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index
>> 3856de6..e0d65df 100644
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>> @@ -6450,7 +6450,8 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy,
>> struct brcmf_if *ifp) BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
>>  				    BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
>>
>> -	wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
>> +	wiphy->flags |= WIPHY_FLAG_NETNS_OK |
>> +			WIPHY_FLAG_PS_ON_BY_DEFAULT |
>>  			WIPHY_FLAG_OFFCHAN_TX |
>>  			WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
>>  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index
>> 22b4883..74ede27 100644
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>> @@ -463,6 +463,7 @@ static int brcmf_netdev_open(struct net_device *ndev)
>>  int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
>>  {
>>  	struct brcmf_pub *drvr = ifp->drvr;
>> +	struct wiphy *wiphy;
>>  	struct net_device *ndev;
>>  	s32 err;
>>
>> @@ -476,8 +477,10 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool
>> rtnl_locked) ndev->needed_headroom += drvr->hdrlen;
>>  	ndev->ethtool_ops = &brcmf_ethtool_ops;
>>
>> -	/* set the mac address */
>> +	/* set the mac address & netns */
>>  	memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
>> +	wiphy = cfg_to_wiphy(drvr->config);
>> +	dev_net_set(ndev, wiphy_net(wiphy));
>>
>>  	INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
>>  	INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);
> 
>
Arend van Spriel March 17, 2017, 9:06 a.m. UTC | #5
On 16-3-2017 22:51, Mark Asselstine wrote:
> On Tuesday, March 14, 2017 9:51:52 PM EDT Arend van Spriel wrote:
>> To support network namespace the driver must assure all created
>> network interfaces are in the same namespace as the wiphy instance.
>>
>> Reported-by: Mark Asselstine <mark.asselstine@windriver.com>
>> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>> ---
>> Hi Mark,
>>
>> Please check this patch. I can not say I am an expert when it comes
>> to using namespaces. So let me know if it works and I can change
>> Reported-by into Tested-by.
> 
> Seems to pass the tests I threw at it. Seems happy with namespaces.

I tested it myself and noticed something unexpected. Upon changing from
&init_net to brcm-wifi the wdev id has changed from 0x1 to 0x2 (see
below) and upon going from brcm-wifi to &init_net both interface change
their wdev id.

Regards,
Arend

     Terminal 1                 Terminal 2
     -------------------------- ---------------------------------
     # ip netns add brcm-wifi
                                # iw dev
                                phy#0
                                        Interface wlan3
                                                ifindex 11
                                                wdev 0x1
     # ip netns exec brcm-wifi bash
     # iw dev
     # echo $$
     20337
                                # iw phy0 set netns 20337
     # iw dev
     phy#0
        Interface wlan3
                ifindex 11
                *wdev 0x2*
     # iw phy0 interface add wl3.ap type __ap
     # iw dev
     phy#0
        Interface wl3.ap
                ifindex 2
                wdev 0x3
        Interface wlan3
                ifindex 11
                wdev 0x2
                                # iw dev
     # iw phy0 set netns 1
     # iw dev
                                # iw dev
                                phy#0
                                        Interface wl3.ap
                                                ifindex 12
                                                *wdev 0x5*
                                        Interface wlan3
                                                ifindex 11
                                                *wdev 0x4*

> Mark
> 
>>
>> Regards,
>> Arend
>> ---
>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c     | 5 ++++-
>>  2 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index
>> 3856de6..e0d65df 100644
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>> @@ -6450,7 +6450,8 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy,
>> struct brcmf_if *ifp) BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
>>  				    BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
>>
>> -	wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
>> +	wiphy->flags |= WIPHY_FLAG_NETNS_OK |
>> +			WIPHY_FLAG_PS_ON_BY_DEFAULT |
>>  			WIPHY_FLAG_OFFCHAN_TX |
>>  			WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
>>  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index
>> 22b4883..74ede27 100644
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>> @@ -463,6 +463,7 @@ static int brcmf_netdev_open(struct net_device *ndev)
>>  int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
>>  {
>>  	struct brcmf_pub *drvr = ifp->drvr;
>> +	struct wiphy *wiphy;
>>  	struct net_device *ndev;
>>  	s32 err;
>>
>> @@ -476,8 +477,10 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool
>> rtnl_locked) ndev->needed_headroom += drvr->hdrlen;
>>  	ndev->ethtool_ops = &brcmf_ethtool_ops;
>>
>> -	/* set the mac address */
>> +	/* set the mac address & netns */
>>  	memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
>> +	wiphy = cfg_to_wiphy(drvr->config);
>> +	dev_net_set(ndev, wiphy_net(wiphy));
>>
>>  	INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
>>  	INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);
> 
>
Arend van Spriel March 17, 2017, 9:30 a.m. UTC | #6
On 17-3-2017 10:06, Arend Van Spriel wrote:
> On 16-3-2017 22:51, Mark Asselstine wrote:
>> On Tuesday, March 14, 2017 9:51:52 PM EDT Arend van Spriel wrote:
>>> To support network namespace the driver must assure all created
>>> network interfaces are in the same namespace as the wiphy instance.
>>>
>>> Reported-by: Mark Asselstine <mark.asselstine@windriver.com>
>>> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>>> ---
>>> Hi Mark,
>>>
>>> Please check this patch. I can not say I am an expert when it comes
>>> to using namespaces. So let me know if it works and I can change
>>> Reported-by into Tested-by.
>>
>> Seems to pass the tests I threw at it. Seems happy with namespaces.
> 
> I tested it myself and noticed something unexpected. Upon changing from
> &init_net to brcm-wifi the wdev id has changed from 0x1 to 0x2 (see
> below) and upon going from brcm-wifi to &init_net both interface change
> their wdev id.

Hi Johannes,

Seems we get a NETDEV_REGISTER notification when changing to other
namespace thus increasing the struct wireless_dev::identifier.

# insmod brcmfmac
[253715.650567] brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0:
Feb 28 2017 12:44:14 version 7.112.21 (TOB) (r588403) FWID 01-3439bdc5
[253715.669388] brcmfmac: brcmf_cfg80211_reg_notifier: not a ISO3166
code (0x30 0x30)
[253715.698289] ieee80211 phy0: wdev id changed: 0 -> 1
[253715.704032] brcmfmac 0000:02:00.0 wlan3: renamed from wlan0
[253715.732362] systemd-udevd[21461]: renamed network interface wlan0 to
wlan3
[253715.779859] IPv6: ADDRCONF(NETDEV_UP): wlan3: link is not ready
[253721.326349] IPv6: ADDRCONF(NETDEV_CHANGE): wlan3: link becomes ready
# iw phy0 set netns 21499
[253788.877846] ieee80211 phy0: wdev id changed: 1 -> 2
[253788.886710] brcmfmac: brcmf_cfg80211_reg_notifier: not a ISO3166
code (0x30 0x30)

I guess this is intended behavior?

Regards,
Arend

> Regards,
> Arend
> 
>      Terminal 1                 Terminal 2
>      -------------------------- ---------------------------------
>      # ip netns add brcm-wifi
>                                 # iw dev
>                                 phy#0
>                                         Interface wlan3
>                                                 ifindex 11
>                                                 wdev 0x1
>      # ip netns exec brcm-wifi bash
>      # iw dev
>      # echo $$
>      20337
>                                 # iw phy0 set netns 20337
>      # iw dev
>      phy#0
>         Interface wlan3
>                 ifindex 11
>                 *wdev 0x2*
>      # iw phy0 interface add wl3.ap type __ap
>      # iw dev
>      phy#0
>         Interface wl3.ap
>                 ifindex 2
>                 wdev 0x3
>         Interface wlan3
>                 ifindex 11
>                 wdev 0x2
>                                 # iw dev
>      # iw phy0 set netns 1
>      # iw dev
>                                 # iw dev
>                                 phy#0
>                                         Interface wl3.ap
>                                                 ifindex 12
>                                                 *wdev 0x5*
>                                         Interface wlan3
>                                                 ifindex 11
>                                                 *wdev 0x4*
> 
>> Mark
>>
>>>
>>> Regards,
>>> Arend
>>> ---
>>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
>>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c     | 5 ++++-
>>>  2 files changed, 6 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index
>>> 3856de6..e0d65df 100644
>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
>>> @@ -6450,7 +6450,8 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy,
>>> struct brcmf_if *ifp) BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
>>>  				    BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
>>>
>>> -	wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
>>> +	wiphy->flags |= WIPHY_FLAG_NETNS_OK |
>>> +			WIPHY_FLAG_PS_ON_BY_DEFAULT |
>>>  			WIPHY_FLAG_OFFCHAN_TX |
>>>  			WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
>>>  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
>>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index
>>> 22b4883..74ede27 100644
>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
>>> @@ -463,6 +463,7 @@ static int brcmf_netdev_open(struct net_device *ndev)
>>>  int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
>>>  {
>>>  	struct brcmf_pub *drvr = ifp->drvr;
>>> +	struct wiphy *wiphy;
>>>  	struct net_device *ndev;
>>>  	s32 err;
>>>
>>> @@ -476,8 +477,10 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool
>>> rtnl_locked) ndev->needed_headroom += drvr->hdrlen;
>>>  	ndev->ethtool_ops = &brcmf_ethtool_ops;
>>>
>>> -	/* set the mac address */
>>> +	/* set the mac address & netns */
>>>  	memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
>>> +	wiphy = cfg_to_wiphy(drvr->config);
>>> +	dev_net_set(ndev, wiphy_net(wiphy));
>>>
>>>  	INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
>>>  	INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);
>>
>>
Mark Asselstine March 17, 2017, 12:43 p.m. UTC | #7
On Friday, March 17, 2017 10:30:24 AM EDT Arend Van Spriel wrote:
> On 17-3-2017 10:06, Arend Van Spriel wrote:
> > On 16-3-2017 22:51, Mark Asselstine wrote:
> >> On Tuesday, March 14, 2017 9:51:52 PM EDT Arend van Spriel wrote:
> >>> To support network namespace the driver must assure all created
> >>> network interfaces are in the same namespace as the wiphy instance.
> >>> 
> >>> Reported-by: Mark Asselstine <mark.asselstine@windriver.com>
> >>> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> >>> ---
> >>> Hi Mark,
> >>> 
> >>> Please check this patch. I can not say I am an expert when it comes
> >>> to using namespaces. So let me know if it works and I can change
> >>> Reported-by into Tested-by.
> >> 
> >> Seems to pass the tests I threw at it. Seems happy with namespaces.
> > 
> > I tested it myself and noticed something unexpected. Upon changing from
> > &init_net to brcm-wifi the wdev id has changed from 0x1 to 0x2 (see
> > below) and upon going from brcm-wifi to &init_net both interface change
> > their wdev id.
> 
> Hi Johannes,
> 
> Seems we get a NETDEV_REGISTER notification when changing to other
> namespace thus increasing the struct wireless_dev::identifier.
> 
> # insmod brcmfmac
> [253715.650567] brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0:
> Feb 28 2017 12:44:14 version 7.112.21 (TOB) (r588403) FWID 01-3439bdc5
> [253715.669388] brcmfmac: brcmf_cfg80211_reg_notifier: not a ISO3166
> code (0x30 0x30)
> [253715.698289] ieee80211 phy0: wdev id changed: 0 -> 1
> [253715.704032] brcmfmac 0000:02:00.0 wlan3: renamed from wlan0
> [253715.732362] systemd-udevd[21461]: renamed network interface wlan0 to
> wlan3
> [253715.779859] IPv6: ADDRCONF(NETDEV_UP): wlan3: link is not ready
> [253721.326349] IPv6: ADDRCONF(NETDEV_CHANGE): wlan3: link becomes ready
> # iw phy0 set netns 21499
> [253788.877846] ieee80211 phy0: wdev id changed: 1 -> 2
> [253788.886710] brcmfmac: brcmf_cfg80211_reg_notifier: not a ISO3166
> code (0x30 0x30)
> 
> I guess this is intended behavior?

I had thought this was intended behavior as well but I see that a patch is 
already prepped and tested to make this not happen. At any rate it wasn't 
appearing to affect my usecase.

Mark

> 
> Regards,
> Arend
> 
> > Regards,
> > Arend
> > 
> >      Terminal 1                 Terminal 2
> >      -------------------------- ---------------------------------
> >      # ip netns add brcm-wifi
> >      
> >                                 # iw dev
> >                                 phy#0
> >                                 
> >                                         Interface wlan3
> >                                         
> >                                                 ifindex 11
> >                                                 wdev 0x1
> >      
> >      # ip netns exec brcm-wifi bash
> >      # iw dev
> >      # echo $$
> >      20337
> >      
> >                                 # iw phy0 set netns 20337
> >      
> >      # iw dev
> >      phy#0
> >      
> >         Interface wlan3
> >         
> >                 ifindex 11
> >                 *wdev 0x2*
> >      
> >      # iw phy0 interface add wl3.ap type __ap
> >      # iw dev
> >      phy#0
> >      
> >         Interface wl3.ap
> >         
> >                 ifindex 2
> >                 wdev 0x3
> >         
> >         Interface wlan3
> >         
> >                 ifindex 11
> >                 wdev 0x2
> >                 
> >                                 # iw dev
> >      
> >      # iw phy0 set netns 1
> >      # iw dev
> >      
> >                                 # iw dev
> >                                 phy#0
> >                                 
> >                                         Interface wl3.ap
> >                                         
> >                                                 ifindex 12
> >                                                 *wdev 0x5*
> >                                         
> >                                         Interface wlan3
> >                                         
> >                                                 ifindex 11
> >                                                 *wdev 0x4*
> >> 
> >> Mark
> >> 
> >>> Regards,
> >>> Arend
> >>> ---
> >>> 
> >>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
> >>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c     | 5 ++++-
> >>>  2 files changed, 6 insertions(+), 2 deletions(-)
> >>> 
> >>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> >>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index
> >>> 3856de6..e0d65df 100644
> >>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> >>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> >>> @@ -6450,7 +6450,8 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy,
> >>> struct brcmf_if *ifp) BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
> >>> 
> >>>  				    BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
> >>> 
> >>> -	wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
> >>> +	wiphy->flags |= WIPHY_FLAG_NETNS_OK |
> >>> +			WIPHY_FLAG_PS_ON_BY_DEFAULT |
> >>> 
> >>>  			WIPHY_FLAG_OFFCHAN_TX |
> >>>  			WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
> >>>  	
> >>>  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
> >>> 
> >>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> >>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index
> >>> 22b4883..74ede27 100644
> >>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> >>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> >>> @@ -463,6 +463,7 @@ static int brcmf_netdev_open(struct net_device
> >>> *ndev)
> >>> 
> >>>  int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
> >>>  {
> >>>  
> >>>  	struct brcmf_pub *drvr = ifp->drvr;
> >>> 
> >>> +	struct wiphy *wiphy;
> >>> 
> >>>  	struct net_device *ndev;
> >>>  	s32 err;
> >>> 
> >>> @@ -476,8 +477,10 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool
> >>> rtnl_locked) ndev->needed_headroom += drvr->hdrlen;
> >>> 
> >>>  	ndev->ethtool_ops = &brcmf_ethtool_ops;
> >>> 
> >>> -	/* set the mac address */
> >>> +	/* set the mac address & netns */
> >>> 
> >>>  	memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
> >>> 
> >>> +	wiphy = cfg_to_wiphy(drvr->config);
> >>> +	dev_net_set(ndev, wiphy_net(wiphy));
> >>> 
> >>>  	INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
> >>>  	INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);
Johannes Berg March 17, 2017, 12:58 p.m. UTC | #8
> > I guess this is intended behavior?
> 
> I had thought this was intended behavior as well but I see that a
> patch is already prepped and tested to make this not happen. At any
> rate it wasn't appearing to affect my usecase.

I can't actually see how it'd affect any usecase, since you really need
to check inside the new netns what's going on etc. anyway, and you
don't really want to pass such identifiers across the boundaries. But
preserving it makes more sense, if only for debugging and making sure
we won't run out of numbers :)

johannes
Mark Asselstine March 17, 2017, 1:05 p.m. UTC | #9
On Friday, March 17, 2017 1:58:58 PM EDT Johannes Berg wrote:
> > > I guess this is intended behavior?
> > 
> > I had thought this was intended behavior as well but I see that a
> > patch is already prepped and tested to make this not happen. At any
> > rate it wasn't appearing to affect my usecase.
> 
> I can't actually see how it'd affect any usecase, since you really need
> to check inside the new netns what's going on etc. anyway, and you
> don't really want to pass such identifiers across the boundaries. But
> preserving it makes more sense, if only for debugging and making sure
> we won't run out of numbers :)

OK, I can see how preserving this makes sense for debugging. Understood and 
thanks for getting this namespace support in.

Mark

> 
> johannes
diff mbox

Patch

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index 3856de6..e0d65df 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -6450,7 +6450,8 @@  static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
 				    BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
 				    BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
 
-	wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
+	wiphy->flags |= WIPHY_FLAG_NETNS_OK |
+			WIPHY_FLAG_PS_ON_BY_DEFAULT |
 			WIPHY_FLAG_OFFCHAN_TX |
 			WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 22b4883..74ede27 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -463,6 +463,7 @@  static int brcmf_netdev_open(struct net_device *ndev)
 int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
 {
 	struct brcmf_pub *drvr = ifp->drvr;
+	struct wiphy *wiphy;
 	struct net_device *ndev;
 	s32 err;
 
@@ -476,8 +477,10 @@  int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
 	ndev->needed_headroom += drvr->hdrlen;
 	ndev->ethtool_ops = &brcmf_ethtool_ops;
 
-	/* set the mac address */
+	/* set the mac address & netns */
 	memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
+	wiphy = cfg_to_wiphy(drvr->config);
+	dev_net_set(ndev, wiphy_net(wiphy));
 
 	INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
 	INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);