Re: [PATCH] wireless: support configuring vdev mac addr on create.
On 10/01/2014 01:35 AM, Arend van Spriel wrote: > On 09/30/14 20:43, gree...@candelatech.com wrote: >> From: Ben Greear >> >> This is useful when creating virtual-stations, and probably >> APs and other devices as well. Keeps udev from mucking with >> things it shouldn't, since the default MAC is never seen >> by udev when specified on the cmd-line during creation. >> >> Signed-off-by: Ben Greear >> --- >> include/net/cfg80211.h | 6 +++--- >> include/uapi/linux/nl80211.h | 3 +++ >> net/mac80211/iface.c | 5 - >> net/mac80211/main.c | 1 + >> net/wireless/nl80211.c | 2 +- >> 5 files changed, 12 insertions(+), 5 deletions(-) >> >> diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h >> index e1641e6..de9a67f 100644 >> --- a/include/net/cfg80211.h >> +++ b/include/net/cfg80211.h >> @@ -319,9 +319,9 @@ struct ieee80211_supported_band { >> /** >>* struct vif_params - describes virtual interface parameters >>* @use_4addr: use 4-address frames >> - * @macaddr: address to use for this virtual interface. This will only >> - * be used for non-netdevice interfaces. If this parameter is set >> - * to zero address the driver may determine the address as needed. >> + * @macaddr: address to use for this virtual interface. >> + * If this parameter is set to zero address the driver may >> + *determine the address as needed. >>*/ >> struct vif_params { >> int use_4addr; >> diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h >> index 4b28dc0..fd14703 100644 >> --- a/include/uapi/linux/nl80211.h >> +++ b/include/uapi/linux/nl80211.h >> @@ -4042,6 +4042,8 @@ enum nl80211_ap_sme_features { >>*multiplexing powersave, ie. can turn off all but one chain >>*and then wake the rest up as required after, for example, >>*rts/cts handshake. >> + * @NL80211_FEATURE_MAC_ON_CREATE: Device supports configuring >> + *the vdev's MAC address upon creation. >>*/ >> enum nl80211_feature_flags { >> NL80211_FEATURE_SK_TX_STATUS= 1<< 0, >> @@ -4070,6 +4072,7 @@ enum nl80211_feature_flags { >> NL80211_FEATURE_ACKTO_ESTIMATION= 1<< 23, >> NL80211_FEATURE_STATIC_SMPS= 1<< 24, >> NL80211_FEATURE_DYNAMIC_SMPS= 1<< 25, >> +NL80211_FEATURE_MAC_ON_CREATE= 1<< 26, > > Hi Ben, > > It is unclear to me why this should be ap_sme feature flag. As your > description indicates this is a device feature/capability so it seems more > appropriate that > this would be a wiphy flag. I think that is just patch getting confused, the actual change is to this enum: nl80211_feature_flags >> ieee80211_assign_perm_addr(local, ndev->perm_addr, type); >> -memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN); >> +if (params&& !is_zero_ether_addr(params->macaddr)) > > I would expect checkpatch will complain on these whitespace errors. Also > would be better to use is_valid_ether_addr() to assure it is not a > multicast/broadcast > address. I do not see that whitespace problem in the patch I posted. I will change it to is_valid_ether_addr as you suggested. Thanks, Ben -- Ben Greear Candela Technologies Inc http://www.candelatech.com -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] wireless: support configuring vdev mac addr on create.
On 09/30/14 20:43, gree...@candelatech.com wrote: From: Ben Greear This is useful when creating virtual-stations, and probably APs and other devices as well. Keeps udev from mucking with things it shouldn't, since the default MAC is never seen by udev when specified on the cmd-line during creation. Signed-off-by: Ben Greear --- include/net/cfg80211.h | 6 +++--- include/uapi/linux/nl80211.h | 3 +++ net/mac80211/iface.c | 5 - net/mac80211/main.c | 1 + net/wireless/nl80211.c | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index e1641e6..de9a67f 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -319,9 +319,9 @@ struct ieee80211_supported_band { /** * struct vif_params - describes virtual interface parameters * @use_4addr: use 4-address frames - * @macaddr: address to use for this virtual interface. This will only - * be used for non-netdevice interfaces. If this parameter is set - * to zero address the driver may determine the address as needed. + * @macaddr: address to use for this virtual interface. + * If this parameter is set to zero address the driver may + * determine the address as needed. */ struct vif_params { int use_4addr; diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 4b28dc0..fd14703 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -4042,6 +4042,8 @@ enum nl80211_ap_sme_features { *multiplexing powersave, ie. can turn off all but one chain *and then wake the rest up as required after, for example, *rts/cts handshake. + * @NL80211_FEATURE_MAC_ON_CREATE: Device supports configuring + * the vdev's MAC address upon creation. */ enum nl80211_feature_flags { NL80211_FEATURE_SK_TX_STATUS= 1<< 0, @@ -4070,6 +4072,7 @@ enum nl80211_feature_flags { NL80211_FEATURE_ACKTO_ESTIMATION= 1<< 23, NL80211_FEATURE_STATIC_SMPS = 1<< 24, NL80211_FEATURE_DYNAMIC_SMPS= 1<< 25, + NL80211_FEATURE_MAC_ON_CREATE = 1<< 26, Hi Ben, It is unclear to me why this should be ap_sme feature flag. As your description indicates this is a device feature/capability so it seems more appropriate that this would be a wiphy flag. Regards, Arend }; /** diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 878bfca..ba5d0d5 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -1715,7 +1715,10 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, } ieee80211_assign_perm_addr(local, ndev->perm_addr, type); - memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN); + if (params&& !is_zero_ether_addr(params->macaddr)) I would expect checkpatch will complain on these whitespace errors. Also would be better to use is_valid_ether_addr() to assure it is not a multicast/broadcast address. Regards, Arend + memcpy(ndev->dev_addr, params->macaddr, ETH_ALEN); + else + memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN); SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); /* don't use IEEE80211_DEV_TO_SUB_IF -- it checks too much */ diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 8106770..eb7bdd1 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -550,6 +550,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, NL80211_FEATURE_SAE | NL80211_FEATURE_HT_IBSS | NL80211_FEATURE_VIF_TXPOWER | + NL80211_FEATURE_MAC_ON_CREATE | NL80211_FEATURE_USERSPACE_MPM; if (!ops->hw_scan) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 8a010bd..cf79707 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -2605,7 +2605,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) !(rdev->wiphy.interface_modes& (1<< type))) return -EOPNOTSUPP; - if (type == NL80211_IFTYPE_P2P_DEVICE&& info->attrs[NL80211_ATTR_MAC]) { + if (info->attrs[NL80211_ATTR_MAC]) { nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); if (!is_valid_ether_addr(params.macaddr)) -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] wireless: support configuring vdev mac addr on create.
From: Ben Greear This is useful when creating virtual-stations, and probably APs and other devices as well. Keeps udev from mucking with things it shouldn't, since the default MAC is never seen by udev when specified on the cmd-line during creation. Signed-off-by: Ben Greear --- include/net/cfg80211.h | 6 +++--- include/uapi/linux/nl80211.h | 3 +++ net/mac80211/iface.c | 5 - net/mac80211/main.c | 1 + net/wireless/nl80211.c | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index e1641e6..de9a67f 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -319,9 +319,9 @@ struct ieee80211_supported_band { /** * struct vif_params - describes virtual interface parameters * @use_4addr: use 4-address frames - * @macaddr: address to use for this virtual interface. This will only - * be used for non-netdevice interfaces. If this parameter is set - * to zero address the driver may determine the address as needed. + * @macaddr: address to use for this virtual interface. + * If this parameter is set to zero address the driver may + * determine the address as needed. */ struct vif_params { int use_4addr; diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 4b28dc0..fd14703 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -4042,6 +4042,8 @@ enum nl80211_ap_sme_features { * multiplexing powersave, ie. can turn off all but one chain * and then wake the rest up as required after, for example, * rts/cts handshake. + * @NL80211_FEATURE_MAC_ON_CREATE: Device supports configuring + * the vdev's MAC address upon creation. */ enum nl80211_feature_flags { NL80211_FEATURE_SK_TX_STATUS= 1 << 0, @@ -4070,6 +4072,7 @@ enum nl80211_feature_flags { NL80211_FEATURE_ACKTO_ESTIMATION= 1 << 23, NL80211_FEATURE_STATIC_SMPS = 1 << 24, NL80211_FEATURE_DYNAMIC_SMPS= 1 << 25, + NL80211_FEATURE_MAC_ON_CREATE = 1 << 26, }; /** diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 878bfca..ba5d0d5 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -1715,7 +1715,10 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, } ieee80211_assign_perm_addr(local, ndev->perm_addr, type); - memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN); + if (params && !is_zero_ether_addr(params->macaddr)) + memcpy(ndev->dev_addr, params->macaddr, ETH_ALEN); + else + memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN); SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); /* don't use IEEE80211_DEV_TO_SUB_IF -- it checks too much */ diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 8106770..eb7bdd1 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -550,6 +550,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, NL80211_FEATURE_SAE | NL80211_FEATURE_HT_IBSS | NL80211_FEATURE_VIF_TXPOWER | + NL80211_FEATURE_MAC_ON_CREATE | NL80211_FEATURE_USERSPACE_MPM; if (!ops->hw_scan) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 8a010bd..cf79707 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -2605,7 +2605,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) !(rdev->wiphy.interface_modes & (1 << type))) return -EOPNOTSUPP; - if (type == NL80211_IFTYPE_P2P_DEVICE && info->attrs[NL80211_ATTR_MAC]) { + if (info->attrs[NL80211_ATTR_MAC]) { nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); if (!is_valid_ether_addr(params.macaddr)) -- 1.7.11.7 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html