Commit 1c18f145 authored by Arend van Spriel's avatar Arend van Spriel Committed by Johannes Berg

nl80211: allow user-space to set address for P2P_DEVICE

As per email discussion Jouni Malinen pointed out that:

"P2P message exchanges can be executed on the current operating channel
of any operation (both P2P and non-P2P station). These can be on 5 GHz
and even on 60 GHz (so yes, you _can_ do GO Negotiation on 60 GHz).

As an example, it would be possible to receive a GO Negotiation Request
frame on a 5 GHz only radio and then to complete GO Negotiation on that
band. This can happen both when connected to a P2P group (through client
discoverability mechanism) and when connected to a legacy AP (assuming
the station receive Probe Request frame from full scan in the beginning
of P2P device discovery)."

This means that P2P messages can be sent over different radio devices.
However, these should use the same P2P device address so it should be
able to provision this from user-space. This patch adds a parameter for
this to struct vif_params which should only be used during creation of
the P2P device interface.

Cc: Jouni Malinen <j@w1.fi>
Cc: Greg Goldman <ggoldman@broadcom.com>
Cc: Jithu Jance <jithu@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
[add error checking]
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 3b1c5a53
...@@ -281,9 +281,13 @@ struct ieee80211_supported_band { ...@@ -281,9 +281,13 @@ struct ieee80211_supported_band {
/** /**
* struct vif_params - describes virtual interface parameters * struct vif_params - describes virtual interface parameters
* @use_4addr: use 4-address frames * @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.
*/ */
struct vif_params { struct vif_params {
int use_4addr; int use_4addr;
u8 macaddr[ETH_ALEN];
}; };
/** /**
......
...@@ -2079,6 +2079,13 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) ...@@ -2079,6 +2079,13 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
!(rdev->wiphy.interface_modes & (1 << type))) !(rdev->wiphy.interface_modes & (1 << type)))
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (type == NL80211_IFTYPE_P2P_DEVICE && info->attrs[NL80211_ATTR_MAC]) {
nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
ETH_ALEN);
if (!is_valid_ether_addr(params.macaddr))
return -EADDRNOTAVAIL;
}
if (info->attrs[NL80211_ATTR_4ADDR]) { if (info->attrs[NL80211_ATTR_4ADDR]) {
params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment