diff options
| -rw-r--r-- | include/net/cfg80211.h | 2 | ||||
| -rw-r--r-- | include/uapi/linux/nl80211.h | 25 | ||||
| -rw-r--r-- | net/wireless/mesh.c | 1 | ||||
| -rw-r--r-- | net/wireless/nl80211.c | 8 |
4 files changed, 29 insertions, 7 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index dfef0d5b5d3d..69b2b2631b9a 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -1151,6 +1151,7 @@ struct mesh_config { | |||
| 1151 | * @ie_len: length of vendor information elements | 1151 | * @ie_len: length of vendor information elements |
| 1152 | * @is_authenticated: this mesh requires authentication | 1152 | * @is_authenticated: this mesh requires authentication |
| 1153 | * @is_secure: this mesh uses security | 1153 | * @is_secure: this mesh uses security |
| 1154 | * @user_mpm: userspace handles all MPM functions | ||
| 1154 | * @dtim_period: DTIM period to use | 1155 | * @dtim_period: DTIM period to use |
| 1155 | * @beacon_interval: beacon interval to use | 1156 | * @beacon_interval: beacon interval to use |
| 1156 | * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a] | 1157 | * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a] |
| @@ -1168,6 +1169,7 @@ struct mesh_setup { | |||
| 1168 | u8 ie_len; | 1169 | u8 ie_len; |
| 1169 | bool is_authenticated; | 1170 | bool is_authenticated; |
| 1170 | bool is_secure; | 1171 | bool is_secure; |
| 1172 | bool user_mpm; | ||
| 1171 | u8 dtim_period; | 1173 | u8 dtim_period; |
| 1172 | u16 beacon_interval; | 1174 | u16 beacon_interval; |
| 1173 | int mcast_rate[IEEE80211_NUM_BANDS]; | 1175 | int mcast_rate[IEEE80211_NUM_BANDS]; |
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 2d0cff57ff89..8134c6a96f57 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h | |||
| @@ -513,9 +513,11 @@ | |||
| 513 | * @NL80211_CMD_NEW_PEER_CANDIDATE: Notification on the reception of a | 513 | * @NL80211_CMD_NEW_PEER_CANDIDATE: Notification on the reception of a |
| 514 | * beacon or probe response from a compatible mesh peer. This is only | 514 | * beacon or probe response from a compatible mesh peer. This is only |
| 515 | * sent while no station information (sta_info) exists for the new peer | 515 | * sent while no station information (sta_info) exists for the new peer |
| 516 | * candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH is set. On | 516 | * candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH, |
| 517 | * reception of this notification, userspace may decide to create a new | 517 | * @NL80211_MESH_SETUP_USERSPACE_AMPE, or |
| 518 | * station (@NL80211_CMD_NEW_STATION). To stop this notification from | 518 | * @NL80211_MESH_SETUP_USERSPACE_MPM is set. On reception of this |
| 519 | * notification, userspace may decide to create a new station | ||
| 520 | * (@NL80211_CMD_NEW_STATION). To stop this notification from | ||
| 519 | * reoccurring, the userspace authentication daemon may want to create the | 521 | * reoccurring, the userspace authentication daemon may want to create the |
| 520 | * new station with the AUTHENTICATED flag unset and maybe change it later | 522 | * new station with the AUTHENTICATED flag unset and maybe change it later |
| 521 | * depending on the authentication result. | 523 | * depending on the authentication result. |
| @@ -1199,10 +1201,10 @@ enum nl80211_commands { | |||
| 1199 | * @NL80211_ATTR_SUPPORT_MESH_AUTH: Currently, this means the underlying driver | 1201 | * @NL80211_ATTR_SUPPORT_MESH_AUTH: Currently, this means the underlying driver |
| 1200 | * allows auth frames in a mesh to be passed to userspace for processing via | 1202 | * allows auth frames in a mesh to be passed to userspace for processing via |
| 1201 | * the @NL80211_MESH_SETUP_USERSPACE_AUTH flag. | 1203 | * the @NL80211_MESH_SETUP_USERSPACE_AUTH flag. |
| 1202 | * @NL80211_ATTR_STA_PLINK_STATE: The state of a mesh peer link as | 1204 | * @NL80211_ATTR_STA_PLINK_STATE: The state of a mesh peer link as defined in |
| 1203 | * defined in &enum nl80211_plink_state. Used when userspace is | 1205 | * &enum nl80211_plink_state. Used when userspace is driving the peer link |
| 1204 | * driving the peer link management state machine. | 1206 | * management state machine. @NL80211_MESH_SETUP_USERSPACE_AMPE or |
| 1205 | * @NL80211_MESH_SETUP_USERSPACE_AMPE must be enabled. | 1207 | * @NL80211_MESH_SETUP_USERSPACE_MPM must be enabled. |
| 1206 | * | 1208 | * |
| 1207 | * @NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED: indicates, as part of the wiphy | 1209 | * @NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED: indicates, as part of the wiphy |
| 1208 | * capabilities, the supported WoWLAN triggers | 1210 | * capabilities, the supported WoWLAN triggers |
| @@ -2612,6 +2614,9 @@ enum nl80211_meshconf_params { | |||
| 2612 | * vendor specific synchronization method or disable it to use the default | 2614 | * vendor specific synchronization method or disable it to use the default |
| 2613 | * neighbor offset synchronization | 2615 | * neighbor offset synchronization |
| 2614 | * | 2616 | * |
| 2617 | * @NL80211_MESH_SETUP_USERSPACE_MPM: Enable this option if userspace will | ||
| 2618 | * implement an MPM which handles peer allocation and state. | ||
| 2619 | * | ||
| 2615 | * @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number | 2620 | * @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number |
| 2616 | * | 2621 | * |
| 2617 | * @__NL80211_MESH_SETUP_ATTR_AFTER_LAST: Internal use | 2622 | * @__NL80211_MESH_SETUP_ATTR_AFTER_LAST: Internal use |
| @@ -2624,6 +2629,7 @@ enum nl80211_mesh_setup_params { | |||
| 2624 | NL80211_MESH_SETUP_USERSPACE_AUTH, | 2629 | NL80211_MESH_SETUP_USERSPACE_AUTH, |
| 2625 | NL80211_MESH_SETUP_USERSPACE_AMPE, | 2630 | NL80211_MESH_SETUP_USERSPACE_AMPE, |
| 2626 | NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC, | 2631 | NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC, |
| 2632 | NL80211_MESH_SETUP_USERSPACE_MPM, | ||
| 2627 | 2633 | ||
| 2628 | /* keep last */ | 2634 | /* keep last */ |
| 2629 | __NL80211_MESH_SETUP_ATTR_AFTER_LAST, | 2635 | __NL80211_MESH_SETUP_ATTR_AFTER_LAST, |
| @@ -3526,6 +3532,10 @@ enum nl80211_ap_sme_features { | |||
| 3526 | * stations the authenticated/associated bits have to be set in the mask. | 3532 | * stations the authenticated/associated bits have to be set in the mask. |
| 3527 | * @NL80211_FEATURE_ADVERTISE_CHAN_LIMITS: cfg80211 advertises channel limits | 3533 | * @NL80211_FEATURE_ADVERTISE_CHAN_LIMITS: cfg80211 advertises channel limits |
| 3528 | * (HT40, VHT 80/160 MHz) if this flag is set | 3534 | * (HT40, VHT 80/160 MHz) if this flag is set |
| 3535 | * @NL80211_FEATURE_USERSPACE_MPM: This driver supports a userspace Mesh | ||
| 3536 | * Peering Management entity which may be implemented by registering for | ||
| 3537 | * beacons or NL80211_CMD_NEW_PEER_CANDIDATE events. The mesh beacon is | ||
| 3538 | * still generated by the driver. | ||
| 3529 | */ | 3539 | */ |
| 3530 | enum nl80211_feature_flags { | 3540 | enum nl80211_feature_flags { |
| 3531 | NL80211_FEATURE_SK_TX_STATUS = 1 << 0, | 3541 | NL80211_FEATURE_SK_TX_STATUS = 1 << 0, |
| @@ -3544,6 +3554,7 @@ enum nl80211_feature_flags { | |||
| 3544 | /* bit 13 is reserved */ | 3554 | /* bit 13 is reserved */ |
| 3545 | NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1 << 14, | 3555 | NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1 << 14, |
| 3546 | NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1 << 15, | 3556 | NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1 << 15, |
| 3557 | NL80211_FEATURE_USERSPACE_MPM = 1 << 16, | ||
| 3547 | }; | 3558 | }; |
| 3548 | 3559 | ||
| 3549 | /** | 3560 | /** |
diff --git a/net/wireless/mesh.c b/net/wireless/mesh.c index 9688b249a805..0bb93f3061a4 100644 --- a/net/wireless/mesh.c +++ b/net/wireless/mesh.c | |||
| @@ -85,6 +85,7 @@ const struct mesh_setup default_mesh_setup = { | |||
| 85 | .ie = NULL, | 85 | .ie = NULL, |
| 86 | .ie_len = 0, | 86 | .ie_len = 0, |
| 87 | .is_secure = false, | 87 | .is_secure = false, |
| 88 | .user_mpm = false, | ||
| 88 | .beacon_interval = MESH_DEFAULT_BEACON_INTERVAL, | 89 | .beacon_interval = MESH_DEFAULT_BEACON_INTERVAL, |
| 89 | .dtim_period = MESH_DEFAULT_DTIM_PERIOD, | 90 | .dtim_period = MESH_DEFAULT_DTIM_PERIOD, |
| 90 | }; | 91 | }; |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 7469020175d5..bdf39836d9d8 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -4618,6 +4618,7 @@ static const struct nla_policy | |||
| 4618 | [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, | 4618 | [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, |
| 4619 | [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, | 4619 | [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, |
| 4620 | [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, | 4620 | [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, |
| 4621 | [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, | ||
| 4621 | [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY, | 4622 | [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY, |
| 4622 | .len = IEEE80211_MAX_DATA_LEN }, | 4623 | .len = IEEE80211_MAX_DATA_LEN }, |
| 4623 | [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, | 4624 | [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, |
| @@ -4756,6 +4757,7 @@ do { \ | |||
| 4756 | static int nl80211_parse_mesh_setup(struct genl_info *info, | 4757 | static int nl80211_parse_mesh_setup(struct genl_info *info, |
| 4757 | struct mesh_setup *setup) | 4758 | struct mesh_setup *setup) |
| 4758 | { | 4759 | { |
| 4760 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; | ||
| 4759 | struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; | 4761 | struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; |
| 4760 | 4762 | ||
| 4761 | if (!info->attrs[NL80211_ATTR_MESH_SETUP]) | 4763 | if (!info->attrs[NL80211_ATTR_MESH_SETUP]) |
| @@ -4792,8 +4794,14 @@ static int nl80211_parse_mesh_setup(struct genl_info *info, | |||
| 4792 | setup->ie = nla_data(ieattr); | 4794 | setup->ie = nla_data(ieattr); |
| 4793 | setup->ie_len = nla_len(ieattr); | 4795 | setup->ie_len = nla_len(ieattr); |
| 4794 | } | 4796 | } |
| 4797 | if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && | ||
| 4798 | !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) | ||
| 4799 | return -EINVAL; | ||
| 4800 | setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); | ||
| 4795 | setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); | 4801 | setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); |
| 4796 | setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); | 4802 | setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); |
| 4803 | if (setup->is_secure) | ||
| 4804 | setup->user_mpm = true; | ||
| 4797 | 4805 | ||
| 4798 | return 0; | 4806 | return 0; |
| 4799 | } | 4807 | } |
