aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/linux/nl80211.h122
-rw-r--r--include/net/cfg80211.h88
2 files changed, 209 insertions, 1 deletions
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 281a2bb6a6ec..0ea497cb607c 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -77,6 +77,39 @@
77 */ 77 */
78 78
79/** 79/**
80 * DOC: Virtual interface / concurrency capabilities
81 *
82 * Some devices are able to operate with virtual MACs, they can have
83 * more than one virtual interface. The capability handling for this
84 * is a bit complex though, as there may be a number of restrictions
85 * on the types of concurrency that are supported.
86 *
87 * To start with, each device supports the interface types listed in
88 * the %NL80211_ATTR_SUPPORTED_IFTYPES attribute, but by listing the
89 * types there no concurrency is implied.
90 *
91 * Once concurrency is desired, more attributes must be observed:
92 * To start with, since some interface types are purely managed in
93 * software, like the AP-VLAN type in mac80211 for example, there's
94 * an additional list of these, they can be added at any time and
95 * are only restricted by some semantic restrictions (e.g. AP-VLAN
96 * cannot be added without a corresponding AP interface). This list
97 * is exported in the %NL80211_ATTR_SOFTWARE_IFTYPES attribute.
98 *
99 * Further, the list of supported combinations is exported. This is
100 * in the %NL80211_ATTR_INTERFACE_COMBINATIONS attribute. Basically,
101 * it exports a list of "groups", and at any point in time the
102 * interfaces that are currently active must fall into any one of
103 * the advertised groups. Within each group, there are restrictions
104 * on the number of interfaces of different types that are supported
105 * and also the number of different channels, along with potentially
106 * some other restrictions. See &enum nl80211_if_combination_attrs.
107 *
108 * All together, these attributes define the concurrency of virtual
109 * interfaces that a given device supports.
110 */
111
112/**
80 * enum nl80211_commands - supported nl80211 commands 113 * enum nl80211_commands - supported nl80211 commands
81 * 114 *
82 * @NL80211_CMD_UNSPEC: unspecified command to catch errors 115 * @NL80211_CMD_UNSPEC: unspecified command to catch errors
@@ -954,6 +987,14 @@ enum nl80211_commands {
954 * @NL80211_ATTR_SCHED_SCAN_INTERVAL: Interval between scheduled scan 987 * @NL80211_ATTR_SCHED_SCAN_INTERVAL: Interval between scheduled scan
955 * cycles, in msecs. 988 * cycles, in msecs.
956 * 989 *
990 * @NL80211_ATTR_INTERFACE_COMBINATIONS: Nested attribute listing the supported
991 * interface combinations. In each nested item, it contains attributes
992 * defined in &enum nl80211_if_combination_attrs.
993 * @NL80211_ATTR_SOFTWARE_IFTYPES: Nested attribute (just like
994 * %NL80211_ATTR_SUPPORTED_IFTYPES) containing the interface types that
995 * are managed in software: interfaces of these types aren't subject to
996 * any restrictions in their number or combinations.
997 *
957 * @NL80211_ATTR_MAX: highest attribute number currently defined 998 * @NL80211_ATTR_MAX: highest attribute number currently defined
958 * @__NL80211_ATTR_AFTER_LAST: internal use 999 * @__NL80211_ATTR_AFTER_LAST: internal use
959 */ 1000 */
@@ -1149,6 +1190,9 @@ enum nl80211_attrs {
1149 1190
1150 NL80211_ATTR_SCHED_SCAN_INTERVAL, 1191 NL80211_ATTR_SCHED_SCAN_INTERVAL,
1151 1192
1193 NL80211_ATTR_INTERFACE_COMBINATIONS,
1194 NL80211_ATTR_SOFTWARE_IFTYPES,
1195
1152 /* add attributes here, update the policy in nl80211.c */ 1196 /* add attributes here, update the policy in nl80211.c */
1153 1197
1154 __NL80211_ATTR_AFTER_LAST, 1198 __NL80211_ATTR_AFTER_LAST,
@@ -1201,7 +1245,9 @@ enum nl80211_attrs {
1201 * @NL80211_IFTYPE_ADHOC: independent BSS member 1245 * @NL80211_IFTYPE_ADHOC: independent BSS member
1202 * @NL80211_IFTYPE_STATION: managed BSS member 1246 * @NL80211_IFTYPE_STATION: managed BSS member
1203 * @NL80211_IFTYPE_AP: access point 1247 * @NL80211_IFTYPE_AP: access point
1204 * @NL80211_IFTYPE_AP_VLAN: VLAN interface for access points 1248 * @NL80211_IFTYPE_AP_VLAN: VLAN interface for access points; VLAN interfaces
1249 * are a bit special in that they must always be tied to a pre-existing
1250 * AP type interface.
1205 * @NL80211_IFTYPE_WDS: wireless distribution interface 1251 * @NL80211_IFTYPE_WDS: wireless distribution interface
1206 * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames 1252 * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames
1207 * @NL80211_IFTYPE_MESH_POINT: mesh point 1253 * @NL80211_IFTYPE_MESH_POINT: mesh point
@@ -2206,4 +2252,78 @@ enum nl80211_wowlan_triggers {
2206 MAX_NL80211_WOWLAN_TRIG = NUM_NL80211_WOWLAN_TRIG - 1 2252 MAX_NL80211_WOWLAN_TRIG = NUM_NL80211_WOWLAN_TRIG - 1
2207}; 2253};
2208 2254
2255/**
2256 * enum nl80211_iface_limit_attrs - limit attributes
2257 * @NL80211_IFACE_LIMIT_UNSPEC: (reserved)
2258 * @NL80211_IFACE_LIMIT_MAX: maximum number of interfaces that
2259 * can be chosen from this set of interface types (u32)
2260 * @NL80211_IFACE_LIMIT_TYPES: nested attribute containing a
2261 * flag attribute for each interface type in this set
2262 * @NUM_NL80211_IFACE_LIMIT: number of attributes
2263 * @MAX_NL80211_IFACE_LIMIT: highest attribute number
2264 */
2265enum nl80211_iface_limit_attrs {
2266 NL80211_IFACE_LIMIT_UNSPEC,
2267 NL80211_IFACE_LIMIT_MAX,
2268 NL80211_IFACE_LIMIT_TYPES,
2269
2270 /* keep last */
2271 NUM_NL80211_IFACE_LIMIT,
2272 MAX_NL80211_IFACE_LIMIT = NUM_NL80211_IFACE_LIMIT - 1
2273};
2274
2275/**
2276 * enum nl80211_if_combination_attrs -- interface combination attributes
2277 *
2278 * @NL80211_IFACE_COMB_UNSPEC: (reserved)
2279 * @NL80211_IFACE_COMB_LIMITS: Nested attributes containing the limits
2280 * for given interface types, see &enum nl80211_iface_limit_attrs.
2281 * @NL80211_IFACE_COMB_MAXNUM: u32 attribute giving the total number of
2282 * interfaces that can be created in this group. This number doesn't
2283 * apply to interfaces purely managed in software, which are listed
2284 * in a separate attribute %NL80211_ATTR_INTERFACES_SOFTWARE.
2285 * @NL80211_IFACE_COMB_STA_AP_BI_MATCH: flag attribute specifying that
2286 * beacon intervals within this group must be all the same even for
2287 * infrastructure and AP/GO combinations, i.e. the GO(s) must adopt
2288 * the infrastructure network's beacon interval.
2289 * @NL80211_IFACE_COMB_NUM_CHANNELS: u32 attribute specifying how many
2290 * different channels may be used within this group.
2291 * @NUM_NL80211_IFACE_COMB: number of attributes
2292 * @MAX_NL80211_IFACE_COMB: highest attribute number
2293 *
2294 * Examples:
2295 * limits = [ #{STA} <= 1, #{AP} <= 1 ], matching BI, channels = 1, max = 2
2296 * => allows an AP and a STA that must match BIs
2297 *
2298 * numbers = [ #{AP, P2P-GO} <= 8 ], channels = 1, max = 8
2299 * => allows 8 of AP/GO
2300 *
2301 * numbers = [ #{STA} <= 2 ], channels = 2, max = 2
2302 * => allows two STAs on different channels
2303 *
2304 * numbers = [ #{STA} <= 1, #{P2P-client,P2P-GO} <= 3 ], max = 4
2305 * => allows a STA plus three P2P interfaces
2306 *
2307 * The list of these four possiblities could completely be contained
2308 * within the %NL80211_ATTR_INTERFACE_COMBINATIONS attribute to indicate
2309 * that any of these groups must match.
2310 *
2311 * "Combinations" of just a single interface will not be listed here,
2312 * a single interface of any valid interface type is assumed to always
2313 * be possible by itself. This means that implicitly, for each valid
2314 * interface type, the following group always exists:
2315 * numbers = [ #{<type>} <= 1 ], channels = 1, max = 1
2316 */
2317enum nl80211_if_combination_attrs {
2318 NL80211_IFACE_COMB_UNSPEC,
2319 NL80211_IFACE_COMB_LIMITS,
2320 NL80211_IFACE_COMB_MAXNUM,
2321 NL80211_IFACE_COMB_STA_AP_BI_MATCH,
2322 NL80211_IFACE_COMB_NUM_CHANNELS,
2323
2324 /* keep last */
2325 NUM_NL80211_IFACE_COMB,
2326 MAX_NL80211_IFACE_COMB = NUM_NL80211_IFACE_COMB - 1
2327};
2328
2209#endif /* __LINUX_NL80211_H */ 2329#endif /* __LINUX_NL80211_H */
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index e1f1b41f7b13..04afcfb9eaf4 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1547,6 +1547,10 @@ struct cfg80211_ops {
1547 * hints read the documenation for regulatory_hint_found_beacon() 1547 * hints read the documenation for regulatory_hint_found_beacon()
1548 * @WIPHY_FLAG_NETNS_OK: if not set, do not allow changing the netns of this 1548 * @WIPHY_FLAG_NETNS_OK: if not set, do not allow changing the netns of this
1549 * wiphy at all 1549 * wiphy at all
1550 * @WIPHY_FLAG_ENFORCE_COMBINATIONS: Set this flag to enforce interface
1551 * combinations for this device. This flag is used for backward
1552 * compatibility only until all drivers advertise combinations and
1553 * they will always be enforced.
1550 * @WIPHY_FLAG_PS_ON_BY_DEFAULT: if set to true, powersave will be enabled 1554 * @WIPHY_FLAG_PS_ON_BY_DEFAULT: if set to true, powersave will be enabled
1551 * by default -- this flag will be set depending on the kernel's default 1555 * by default -- this flag will be set depending on the kernel's default
1552 * on wiphy_new(), but can be changed by the driver if it has a good 1556 * on wiphy_new(), but can be changed by the driver if it has a good
@@ -1574,6 +1578,81 @@ enum wiphy_flags {
1574 WIPHY_FLAG_IBSS_RSN = BIT(8), 1578 WIPHY_FLAG_IBSS_RSN = BIT(8),
1575 WIPHY_FLAG_MESH_AUTH = BIT(10), 1579 WIPHY_FLAG_MESH_AUTH = BIT(10),
1576 WIPHY_FLAG_SUPPORTS_SCHED_SCAN = BIT(11), 1580 WIPHY_FLAG_SUPPORTS_SCHED_SCAN = BIT(11),
1581 WIPHY_FLAG_ENFORCE_COMBINATIONS = BIT(12),
1582};
1583
1584/**
1585 * struct ieee80211_iface_limit - limit on certain interface types
1586 * @max: maximum number of interfaces of these types
1587 * @types: interface types (bits)
1588 */
1589struct ieee80211_iface_limit {
1590 u16 max;
1591 u16 types;
1592};
1593
1594/**
1595 * struct ieee80211_iface_combination - possible interface combination
1596 * @limits: limits for the given interface types
1597 * @n_limits: number of limitations
1598 * @num_different_channels: can use up to this many different channels
1599 * @max_interfaces: maximum number of interfaces in total allowed in this
1600 * group
1601 * @beacon_int_infra_match: In this combination, the beacon intervals
1602 * between infrastructure and AP types must match. This is required
1603 * only in special cases.
1604 *
1605 * These examples can be expressed as follows:
1606 *
1607 * Allow #STA <= 1, #AP <= 1, matching BI, channels = 1, 2 total:
1608 *
1609 * struct ieee80211_iface_limit limits1[] = {
1610 * { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), },
1611 * { .max = 1, .types = BIT(NL80211_IFTYPE_AP}, },
1612 * };
1613 * struct ieee80211_iface_combination combination1 = {
1614 * .limits = limits1,
1615 * .n_limits = ARRAY_SIZE(limits1),
1616 * .max_interfaces = 2,
1617 * .beacon_int_infra_match = true,
1618 * };
1619 *
1620 *
1621 * Allow #{AP, P2P-GO} <= 8, channels = 1, 8 total:
1622 *
1623 * struct ieee80211_iface_limit limits2[] = {
1624 * { .max = 8, .types = BIT(NL80211_IFTYPE_AP) |
1625 * BIT(NL80211_IFTYPE_P2P_GO), },
1626 * };
1627 * struct ieee80211_iface_combination combination2 = {
1628 * .limits = limits2,
1629 * .n_limits = ARRAY_SIZE(limits2),
1630 * .max_interfaces = 8,
1631 * .num_different_channels = 1,
1632 * };
1633 *
1634 *
1635 * Allow #STA <= 1, #{P2P-client,P2P-GO} <= 3 on two channels, 4 total.
1636 * This allows for an infrastructure connection and three P2P connections.
1637 *
1638 * struct ieee80211_iface_limit limits3[] = {
1639 * { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), },
1640 * { .max = 3, .types = BIT(NL80211_IFTYPE_P2P_GO) |
1641 * BIT(NL80211_IFTYPE_P2P_CLIENT), },
1642 * };
1643 * struct ieee80211_iface_combination combination3 = {
1644 * .limits = limits3,
1645 * .n_limits = ARRAY_SIZE(limits3),
1646 * .max_interfaces = 4,
1647 * .num_different_channels = 2,
1648 * };
1649 */
1650struct ieee80211_iface_combination {
1651 const struct ieee80211_iface_limit *limits;
1652 u32 num_different_channels;
1653 u16 max_interfaces;
1654 u8 n_limits;
1655 bool beacon_int_infra_match;
1577}; 1656};
1578 1657
1579struct mac_address { 1658struct mac_address {
@@ -1653,6 +1732,11 @@ struct wiphy_wowlan_support {
1653 * @priv: driver private data (sized according to wiphy_new() parameter) 1732 * @priv: driver private data (sized according to wiphy_new() parameter)
1654 * @interface_modes: bitmask of interfaces types valid for this wiphy, 1733 * @interface_modes: bitmask of interfaces types valid for this wiphy,
1655 * must be set by driver 1734 * must be set by driver
1735 * @iface_combinations: Valid interface combinations array, should not
1736 * list single interface types.
1737 * @n_iface_combinations: number of entries in @iface_combinations array.
1738 * @software_iftypes: bitmask of software interface types, these are not
1739 * subject to any restrictions since they are purely managed in SW.
1656 * @flags: wiphy flags, see &enum wiphy_flags 1740 * @flags: wiphy flags, see &enum wiphy_flags
1657 * @bss_priv_size: each BSS struct has private data allocated with it, 1741 * @bss_priv_size: each BSS struct has private data allocated with it,
1658 * this variable determines its size 1742 * this variable determines its size
@@ -1697,6 +1781,10 @@ struct wiphy {
1697 1781
1698 const struct ieee80211_txrx_stypes *mgmt_stypes; 1782 const struct ieee80211_txrx_stypes *mgmt_stypes;
1699 1783
1784 const struct ieee80211_iface_combination *iface_combinations;
1785 int n_iface_combinations;
1786 u16 software_iftypes;
1787
1700 u16 n_addresses; 1788 u16 n_addresses;
1701 1789
1702 /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */ 1790 /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */