diff options
| author | Jonathan Doron <jond@wizery.com> | 2014-12-15 12:26:00 -0500 |
|---|---|---|
| committer | Johannes Berg <johannes.berg@intel.com> | 2014-12-17 05:49:55 -0500 |
| commit | b0d7aa59592b4270531de5ce65dcf18338a2d98c (patch) | |
| tree | 85d54dba5117fedd4d5b605be70ddbf8451d7838 /include | |
| parent | ad30ca2c03cecfb1b0749874bdceead269542de6 (diff) | |
cfg80211: allow wiphy specific regdomain management
Add a new regulatory flag that allows a driver to manage regdomain
changes/updates for its own wiphy.
A self-managed wiphys only employs regulatory information obtained from
the FW and driver and does not use other cfg80211 sources like
beacon-hints, country-code IEs and hints from other devices on the same
system. Conversely, a self-managed wiphy does not share its regulatory
hints with other devices in the system. If a system contains several
devices, one or more of which are self-managed, there might be
contradictory regulatory settings between them. Usage of flag is
generally discouraged. Only use it if the FW/driver is incompatible
with non-locally originated hints.
A new API lets the driver send a complete regdomain, to be applied on
its wiphy only.
After a wiphy-specific regdomain change takes place, usermode will get
a new type of change notification. The regulatory core also takes care
enforce regulatory restrictions, in case some interfaces are on
forbidden channels.
Signed-off-by: Jonathan Doron <jonathanx.doron@intel.com>
Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
Reviewed-by: Luis R. Rodriguez <mcgrof@suse.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/cfg80211.h | 14 | ||||
| -rw-r--r-- | include/net/regulatory.h | 19 | ||||
| -rw-r--r-- | include/uapi/linux/nl80211.h | 6 |
3 files changed, 39 insertions, 0 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 4ebb816241fa..4bc1fc9971a5 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -3808,6 +3808,20 @@ const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type, | |||
| 3808 | int regulatory_hint(struct wiphy *wiphy, const char *alpha2); | 3808 | int regulatory_hint(struct wiphy *wiphy, const char *alpha2); |
| 3809 | 3809 | ||
| 3810 | /** | 3810 | /** |
| 3811 | * regulatory_set_wiphy_regd - set regdom info for self managed drivers | ||
| 3812 | * @wiphy: the wireless device we want to process the regulatory domain on | ||
| 3813 | * @rd: the regulatory domain informatoin to use for this wiphy | ||
| 3814 | * | ||
| 3815 | * Set the regulatory domain information for self-managed wiphys, only they | ||
| 3816 | * may use this function. See %REGULATORY_WIPHY_SELF_MANAGED for more | ||
| 3817 | * information. | ||
| 3818 | * | ||
| 3819 | * Return: 0 on success. -EINVAL, -EPERM | ||
| 3820 | */ | ||
| 3821 | int regulatory_set_wiphy_regd(struct wiphy *wiphy, | ||
| 3822 | struct ieee80211_regdomain *rd); | ||
| 3823 | |||
| 3824 | /** | ||
| 3811 | * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain | 3825 | * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain |
| 3812 | * @wiphy: the wireless device we want to process the regulatory domain on | 3826 | * @wiphy: the wireless device we want to process the regulatory domain on |
| 3813 | * @regd: the custom regulatory domain to use for this wiphy | 3827 | * @regd: the custom regulatory domain to use for this wiphy |
diff --git a/include/net/regulatory.h b/include/net/regulatory.h index b776d72d84be..ebc5a2ed8631 100644 --- a/include/net/regulatory.h +++ b/include/net/regulatory.h | |||
| @@ -147,6 +147,24 @@ struct regulatory_request { | |||
| 147 | * NL80211_IFTYPE_P2P_CLIENT, NL80211_IFTYPE_P2P_GO, | 147 | * NL80211_IFTYPE_P2P_CLIENT, NL80211_IFTYPE_P2P_GO, |
| 148 | * NL80211_IFTYPE_P2P_DEVICE. The flag will be set by default if a device | 148 | * NL80211_IFTYPE_P2P_DEVICE. The flag will be set by default if a device |
| 149 | * includes any modes unsupported for enforcement checking. | 149 | * includes any modes unsupported for enforcement checking. |
| 150 | * @REGULATORY_WIPHY_SELF_MANAGED: for devices that employ wiphy-specific | ||
| 151 | * regdom management. These devices will ignore all regdom changes not | ||
| 152 | * originating from their own wiphy. | ||
| 153 | * A self-managed wiphys only employs regulatory information obtained from | ||
| 154 | * the FW and driver and does not use other cfg80211 sources like | ||
| 155 | * beacon-hints, country-code IEs and hints from other devices on the same | ||
| 156 | * system. Conversely, a self-managed wiphy does not share its regulatory | ||
| 157 | * hints with other devices in the system. If a system contains several | ||
| 158 | * devices, one or more of which are self-managed, there might be | ||
| 159 | * contradictory regulatory settings between them. Usage of flag is | ||
| 160 | * generally discouraged. Only use it if the FW/driver is incompatible | ||
| 161 | * with non-locally originated hints. | ||
| 162 | * This flag is incompatible with the flags: %REGULATORY_CUSTOM_REG, | ||
| 163 | * %REGULATORY_STRICT_REG, %REGULATORY_COUNTRY_IE_FOLLOW_POWER, | ||
| 164 | * %REGULATORY_COUNTRY_IE_IGNORE and %REGULATORY_DISABLE_BEACON_HINTS. | ||
| 165 | * Mixing any of the above flags with this flag will result in a failure | ||
| 166 | * to register the wiphy. This flag implies | ||
| 167 | * %REGULATORY_DISABLE_BEACON_HINTS and %REGULATORY_COUNTRY_IE_IGNORE. | ||
| 150 | */ | 168 | */ |
| 151 | enum ieee80211_regulatory_flags { | 169 | enum ieee80211_regulatory_flags { |
| 152 | REGULATORY_CUSTOM_REG = BIT(0), | 170 | REGULATORY_CUSTOM_REG = BIT(0), |
| @@ -156,6 +174,7 @@ enum ieee80211_regulatory_flags { | |||
| 156 | REGULATORY_COUNTRY_IE_IGNORE = BIT(4), | 174 | REGULATORY_COUNTRY_IE_IGNORE = BIT(4), |
| 157 | REGULATORY_ENABLE_RELAX_NO_IR = BIT(5), | 175 | REGULATORY_ENABLE_RELAX_NO_IR = BIT(5), |
| 158 | REGULATORY_IGNORE_STALE_KICKOFF = BIT(6), | 176 | REGULATORY_IGNORE_STALE_KICKOFF = BIT(6), |
| 177 | REGULATORY_WIPHY_SELF_MANAGED = BIT(7), | ||
| 159 | }; | 178 | }; |
| 160 | 179 | ||
| 161 | struct ieee80211_freq_range { | 180 | struct ieee80211_freq_range { |
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 2d384d041224..fb58e654f523 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h | |||
| @@ -782,6 +782,10 @@ | |||
| 782 | * peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel | 782 | * peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel |
| 783 | * when this command completes. | 783 | * when this command completes. |
| 784 | * | 784 | * |
| 785 | * @NL80211_CMD_WIPHY_REG_CHANGE: Similar to %NL80211_CMD_REG_CHANGE, but used | ||
| 786 | * as an event to indicate changes for devices with wiphy-specific regdom | ||
| 787 | * management. | ||
| 788 | * | ||
| 785 | * @NL80211_CMD_MAX: highest used command number | 789 | * @NL80211_CMD_MAX: highest used command number |
| 786 | * @__NL80211_CMD_AFTER_LAST: internal use | 790 | * @__NL80211_CMD_AFTER_LAST: internal use |
| 787 | */ | 791 | */ |
| @@ -966,6 +970,8 @@ enum nl80211_commands { | |||
| 966 | NL80211_CMD_TDLS_CHANNEL_SWITCH, | 970 | NL80211_CMD_TDLS_CHANNEL_SWITCH, |
| 967 | NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, | 971 | NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, |
| 968 | 972 | ||
| 973 | NL80211_CMD_WIPHY_REG_CHANGE, | ||
| 974 | |||
| 969 | /* add new commands above here */ | 975 | /* add new commands above here */ |
| 970 | 976 | ||
| 971 | /* used to define NL80211_CMD_MAX below */ | 977 | /* used to define NL80211_CMD_MAX below */ |
