Commit bb2798d4 authored by Thomas Pedersen's avatar Thomas Pedersen Committed by Johannes Berg

nl80211: explicit userspace MPM

Secure mesh had the implicit requirement that the Mesh
Peering Management entity be in userspace.  However
userspace might want to implement an open MPM as well, so
specify a mesh setup parameter to indicate this.
Signed-off-by: default avatarThomas Pedersen <thomas@cozybit.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 2ff2b690
...@@ -1151,6 +1151,7 @@ struct mesh_config { ...@@ -1151,6 +1151,7 @@ struct mesh_config {
* @ie_len: length of vendor information elements * @ie_len: length of vendor information elements
* @is_authenticated: this mesh requires authentication * @is_authenticated: this mesh requires authentication
* @is_secure: this mesh uses security * @is_secure: this mesh uses security
* @user_mpm: userspace handles all MPM functions
* @dtim_period: DTIM period to use * @dtim_period: DTIM period to use
* @beacon_interval: beacon interval to use * @beacon_interval: beacon interval to use
* @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a] * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a]
...@@ -1168,6 +1169,7 @@ struct mesh_setup { ...@@ -1168,6 +1169,7 @@ struct mesh_setup {
u8 ie_len; u8 ie_len;
bool is_authenticated; bool is_authenticated;
bool is_secure; bool is_secure;
bool user_mpm;
u8 dtim_period; u8 dtim_period;
u16 beacon_interval; u16 beacon_interval;
int mcast_rate[IEEE80211_NUM_BANDS]; int mcast_rate[IEEE80211_NUM_BANDS];
......
...@@ -513,9 +513,11 @@ ...@@ -513,9 +513,11 @@
* @NL80211_CMD_NEW_PEER_CANDIDATE: Notification on the reception of a * @NL80211_CMD_NEW_PEER_CANDIDATE: Notification on the reception of a
* beacon or probe response from a compatible mesh peer. This is only * beacon or probe response from a compatible mesh peer. This is only
* sent while no station information (sta_info) exists for the new peer * sent while no station information (sta_info) exists for the new peer
* candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH is set. On * candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH,
* reception of this notification, userspace may decide to create a new * @NL80211_MESH_SETUP_USERSPACE_AMPE, or
* station (@NL80211_CMD_NEW_STATION). To stop this notification from * @NL80211_MESH_SETUP_USERSPACE_MPM is set. On reception of this
* notification, userspace may decide to create a new station
* (@NL80211_CMD_NEW_STATION). To stop this notification from
* reoccurring, the userspace authentication daemon may want to create the * reoccurring, the userspace authentication daemon may want to create the
* new station with the AUTHENTICATED flag unset and maybe change it later * new station with the AUTHENTICATED flag unset and maybe change it later
* depending on the authentication result. * depending on the authentication result.
...@@ -1199,10 +1201,10 @@ enum nl80211_commands { ...@@ -1199,10 +1201,10 @@ enum nl80211_commands {
* @NL80211_ATTR_SUPPORT_MESH_AUTH: Currently, this means the underlying driver * @NL80211_ATTR_SUPPORT_MESH_AUTH: Currently, this means the underlying driver
* allows auth frames in a mesh to be passed to userspace for processing via * allows auth frames in a mesh to be passed to userspace for processing via
* the @NL80211_MESH_SETUP_USERSPACE_AUTH flag. * the @NL80211_MESH_SETUP_USERSPACE_AUTH flag.
* @NL80211_ATTR_STA_PLINK_STATE: The state of a mesh peer link as * @NL80211_ATTR_STA_PLINK_STATE: The state of a mesh peer link as defined in
* defined in &enum nl80211_plink_state. Used when userspace is * &enum nl80211_plink_state. Used when userspace is driving the peer link
* driving the peer link management state machine. * management state machine. @NL80211_MESH_SETUP_USERSPACE_AMPE or
* @NL80211_MESH_SETUP_USERSPACE_AMPE must be enabled. * @NL80211_MESH_SETUP_USERSPACE_MPM must be enabled.
* *
* @NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED: indicates, as part of the wiphy * @NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED: indicates, as part of the wiphy
* capabilities, the supported WoWLAN triggers * capabilities, the supported WoWLAN triggers
...@@ -2612,6 +2614,9 @@ enum nl80211_meshconf_params { ...@@ -2612,6 +2614,9 @@ enum nl80211_meshconf_params {
* vendor specific synchronization method or disable it to use the default * vendor specific synchronization method or disable it to use the default
* neighbor offset synchronization * neighbor offset synchronization
* *
* @NL80211_MESH_SETUP_USERSPACE_MPM: Enable this option if userspace will
* implement an MPM which handles peer allocation and state.
*
* @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number * @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number
* *
* @__NL80211_MESH_SETUP_ATTR_AFTER_LAST: Internal use * @__NL80211_MESH_SETUP_ATTR_AFTER_LAST: Internal use
...@@ -2624,6 +2629,7 @@ enum nl80211_mesh_setup_params { ...@@ -2624,6 +2629,7 @@ enum nl80211_mesh_setup_params {
NL80211_MESH_SETUP_USERSPACE_AUTH, NL80211_MESH_SETUP_USERSPACE_AUTH,
NL80211_MESH_SETUP_USERSPACE_AMPE, NL80211_MESH_SETUP_USERSPACE_AMPE,
NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC, NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC,
NL80211_MESH_SETUP_USERSPACE_MPM,
/* keep last */ /* keep last */
__NL80211_MESH_SETUP_ATTR_AFTER_LAST, __NL80211_MESH_SETUP_ATTR_AFTER_LAST,
...@@ -3526,6 +3532,10 @@ enum nl80211_ap_sme_features { ...@@ -3526,6 +3532,10 @@ enum nl80211_ap_sme_features {
* stations the authenticated/associated bits have to be set in the mask. * stations the authenticated/associated bits have to be set in the mask.
* @NL80211_FEATURE_ADVERTISE_CHAN_LIMITS: cfg80211 advertises channel limits * @NL80211_FEATURE_ADVERTISE_CHAN_LIMITS: cfg80211 advertises channel limits
* (HT40, VHT 80/160 MHz) if this flag is set * (HT40, VHT 80/160 MHz) if this flag is set
* @NL80211_FEATURE_USERSPACE_MPM: This driver supports a userspace Mesh
* Peering Management entity which may be implemented by registering for
* beacons or NL80211_CMD_NEW_PEER_CANDIDATE events. The mesh beacon is
* still generated by the driver.
*/ */
enum nl80211_feature_flags { enum nl80211_feature_flags {
NL80211_FEATURE_SK_TX_STATUS = 1 << 0, NL80211_FEATURE_SK_TX_STATUS = 1 << 0,
...@@ -3544,6 +3554,7 @@ enum nl80211_feature_flags { ...@@ -3544,6 +3554,7 @@ enum nl80211_feature_flags {
/* bit 13 is reserved */ /* bit 13 is reserved */
NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1 << 14, NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1 << 14,
NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1 << 15, NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1 << 15,
NL80211_FEATURE_USERSPACE_MPM = 1 << 16,
}; };
/** /**
......
...@@ -85,6 +85,7 @@ const struct mesh_setup default_mesh_setup = { ...@@ -85,6 +85,7 @@ const struct mesh_setup default_mesh_setup = {
.ie = NULL, .ie = NULL,
.ie_len = 0, .ie_len = 0,
.is_secure = false, .is_secure = false,
.user_mpm = false,
.beacon_interval = MESH_DEFAULT_BEACON_INTERVAL, .beacon_interval = MESH_DEFAULT_BEACON_INTERVAL,
.dtim_period = MESH_DEFAULT_DTIM_PERIOD, .dtim_period = MESH_DEFAULT_DTIM_PERIOD,
}; };
......
...@@ -4618,6 +4618,7 @@ static const struct nla_policy ...@@ -4618,6 +4618,7 @@ static const struct nla_policy
[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
[NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
[NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
[NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY, [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,
.len = IEEE80211_MAX_DATA_LEN }, .len = IEEE80211_MAX_DATA_LEN },
[NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
...@@ -4756,6 +4757,7 @@ do { \ ...@@ -4756,6 +4757,7 @@ do { \
static int nl80211_parse_mesh_setup(struct genl_info *info, static int nl80211_parse_mesh_setup(struct genl_info *info,
struct mesh_setup *setup) struct mesh_setup *setup)
{ {
struct cfg80211_registered_device *rdev = info->user_ptr[0];
struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
if (!info->attrs[NL80211_ATTR_MESH_SETUP]) if (!info->attrs[NL80211_ATTR_MESH_SETUP])
...@@ -4792,8 +4794,14 @@ static int nl80211_parse_mesh_setup(struct genl_info *info, ...@@ -4792,8 +4794,14 @@ static int nl80211_parse_mesh_setup(struct genl_info *info,
setup->ie = nla_data(ieattr); setup->ie = nla_data(ieattr);
setup->ie_len = nla_len(ieattr); setup->ie_len = nla_len(ieattr);
} }
if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
!(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
return -EINVAL;
setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
if (setup->is_secure)
setup->user_mpm = true;
return 0; return 0;
} }
......
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