Loading include/net/cfg80211.h +27 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,9 @@ /* Indicate backport support for DH IE creation/update*/ #define CFG80211_EXTERNAL_DH_UPDATE_SUPPORT 1 /* Indicate backport support for supported AKM advertisement per interface*/ #define CFG80211_IFTYPE_AKM_SUITES_SUPPORT 1 /** * DOC: Introduction * Loading Loading @@ -3351,6 +3354,21 @@ struct wiphy_iftype_ext_capab { u8 extended_capabilities_len; }; /** * struct wiphy_iftype_akm_suites - This structure encapsulates supported akm * suites for interface types defined in @iftypes_mask. Each type in the * @iftypes_mask must be unique across all instances of iftype_akm_suites. * * @iftypes_mask: bitmask of interfaces types * @akm_suites: points to an array of supported akm suites * @n_akm_suites: number of supported AKM suites */ struct wiphy_iftype_akm_suites { u16 iftypes_mask; const u32 *akm_suites; int n_akm_suites; }; /** * struct wiphy - wireless hardware description * @reg_notifier: the driver's regulatory notification callback, Loading @@ -3363,6 +3381,12 @@ struct wiphy_iftype_ext_capab { * @signal_type: signal type reported in &struct cfg80211_bss. * @cipher_suites: supported cipher suites * @n_cipher_suites: number of supported cipher suites * @iftype_akm_suites: array of supported akm suites info per interface type. * Note that the bits in @iftypes_mask inside this structure cannot * overlap (i.e. only one occurrence of each type is allowed across all * instances of iftype_akm_suites). * @num_iftype_akm_suites: number of interface types for which supported akm * suites are specified separately. * @retry_short: Retry limit for short frames (dot11ShortRetryLimit) * @retry_long: Retry limit for long frames (dot11LongRetryLimit) * @frag_threshold: Fragmentation threshold (dot11FragmentationThreshold); Loading Loading @@ -3547,6 +3571,9 @@ struct wiphy { int n_cipher_suites; const u32 *cipher_suites; const struct wiphy_iftype_akm_suites *iftype_akm_suites; unsigned int num_iftype_akm_suites; u8 retry_short; u8 retry_long; u32 frag_threshold; Loading include/uapi/linux/nl80211.h +34 −0 Original line number Diff line number Diff line Loading @@ -2162,6 +2162,13 @@ enum nl80211_commands { * may offload authentication processing to user space if this capability * is indicated in the respective requests from the user space. * * @NL80211_ATTR_IFTYPE_AKM_SUITES: nested array attribute, with each entry * using attributes from &enum nl80211_iftype_akm_attributes. This * attribute is sent in a response to %NL80211_CMD_GET_WIPHY indicating * supported AKM suites capability per interface. AKMs advertised in * %NL80211_ATTR_AKM_SUITES are default capabilities if AKM suites not * advertised for a specific interface type. * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use Loading Loading @@ -2591,6 +2598,9 @@ enum nl80211_attrs { NL80211_ATTR_EXTERNAL_AUTH_ACTION, NL80211_ATTR_EXTERNAL_AUTH_SUPPORT, NL80211_ATTR_IFTYPE_AKM_SUITES = NL80211_ATTR_EXTERNAL_AUTH_SUPPORT + 23, /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, Loading Loading @@ -5312,4 +5322,28 @@ enum nl80211_external_auth_action { NL80211_EXTERNAL_AUTH_ABORT, }; /** * enum nl80211_iftype_akm_attributes - interface type AKM attributes * @__NL80211_IFTYPE_AKM_ATTR_INVALID: Invalid * * @NL80211_IFTYPE_AKM_ATTR_IFTYPES: nested attribute containing a flag * attribute for each interface type that supports AKM suites specified in * %NL80211_IFTYPE_AKM_ATTR_SUITES * @NL80211_IFTYPE_AKM_ATTR_SUITES: an array of u32. Used to indicate supported * AKM suites for the specified interface types. * * @__NL80211_IFTYPE_AKM_ATTR_LAST: Internal * @NL80211_IFTYPE_AKM_ATTR_MAX: highest interface type AKM attribute. */ enum nl80211_iftype_akm_attributes { __NL80211_IFTYPE_AKM_ATTR_INVALID, NL80211_IFTYPE_AKM_ATTR_IFTYPES, NL80211_IFTYPE_AKM_ATTR_SUITES, /* keep last */ __NL80211_IFTYPE_AKM_ATTR_LAST, NL80211_IFTYPE_AKM_ATTR_MAX = __NL80211_IFTYPE_AKM_ATTR_LAST - 1, }; #endif /* __LINUX_NL80211_H */ net/wireless/nl80211.c +47 −0 Original line number Diff line number Diff line Loading @@ -1308,6 +1308,46 @@ nl80211_send_mgmt_stypes(struct sk_buff *msg, return 0; } static int nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev, struct sk_buff *msg) { int i; struct nlattr *nested, *nested_akms; const struct wiphy_iftype_akm_suites *iftype_akms; if (!rdev->wiphy.num_iftype_akm_suites || !rdev->wiphy.iftype_akm_suites) return 0; nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES); if (!nested) return -ENOBUFS; for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { nested_akms = nla_nest_start(msg, i + 1); if (!nested_akms) return -ENOBUFS; iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES, iftype_akms->iftypes_mask)) return -ENOBUFS; if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES, sizeof(u32) * iftype_akms->n_akm_suites, iftype_akms->akm_suites)) { return -ENOBUFS; } nla_nest_end(msg, nested_akms); } nla_nest_end(msg, nested); return 0; } struct nl80211_dump_wiphy_state { s64 filter_wiphy; long start; Loading Loading @@ -1851,6 +1891,13 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, nla_nest_end(msg, nested); } state->split_start++; break; case 14: if (nl80211_put_iftype_akm_suites(rdev, msg)) goto nla_put_failure; /* done */ state->split_start = 0; break; Loading Loading
include/net/cfg80211.h +27 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,9 @@ /* Indicate backport support for DH IE creation/update*/ #define CFG80211_EXTERNAL_DH_UPDATE_SUPPORT 1 /* Indicate backport support for supported AKM advertisement per interface*/ #define CFG80211_IFTYPE_AKM_SUITES_SUPPORT 1 /** * DOC: Introduction * Loading Loading @@ -3351,6 +3354,21 @@ struct wiphy_iftype_ext_capab { u8 extended_capabilities_len; }; /** * struct wiphy_iftype_akm_suites - This structure encapsulates supported akm * suites for interface types defined in @iftypes_mask. Each type in the * @iftypes_mask must be unique across all instances of iftype_akm_suites. * * @iftypes_mask: bitmask of interfaces types * @akm_suites: points to an array of supported akm suites * @n_akm_suites: number of supported AKM suites */ struct wiphy_iftype_akm_suites { u16 iftypes_mask; const u32 *akm_suites; int n_akm_suites; }; /** * struct wiphy - wireless hardware description * @reg_notifier: the driver's regulatory notification callback, Loading @@ -3363,6 +3381,12 @@ struct wiphy_iftype_ext_capab { * @signal_type: signal type reported in &struct cfg80211_bss. * @cipher_suites: supported cipher suites * @n_cipher_suites: number of supported cipher suites * @iftype_akm_suites: array of supported akm suites info per interface type. * Note that the bits in @iftypes_mask inside this structure cannot * overlap (i.e. only one occurrence of each type is allowed across all * instances of iftype_akm_suites). * @num_iftype_akm_suites: number of interface types for which supported akm * suites are specified separately. * @retry_short: Retry limit for short frames (dot11ShortRetryLimit) * @retry_long: Retry limit for long frames (dot11LongRetryLimit) * @frag_threshold: Fragmentation threshold (dot11FragmentationThreshold); Loading Loading @@ -3547,6 +3571,9 @@ struct wiphy { int n_cipher_suites; const u32 *cipher_suites; const struct wiphy_iftype_akm_suites *iftype_akm_suites; unsigned int num_iftype_akm_suites; u8 retry_short; u8 retry_long; u32 frag_threshold; Loading
include/uapi/linux/nl80211.h +34 −0 Original line number Diff line number Diff line Loading @@ -2162,6 +2162,13 @@ enum nl80211_commands { * may offload authentication processing to user space if this capability * is indicated in the respective requests from the user space. * * @NL80211_ATTR_IFTYPE_AKM_SUITES: nested array attribute, with each entry * using attributes from &enum nl80211_iftype_akm_attributes. This * attribute is sent in a response to %NL80211_CMD_GET_WIPHY indicating * supported AKM suites capability per interface. AKMs advertised in * %NL80211_ATTR_AKM_SUITES are default capabilities if AKM suites not * advertised for a specific interface type. * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use Loading Loading @@ -2591,6 +2598,9 @@ enum nl80211_attrs { NL80211_ATTR_EXTERNAL_AUTH_ACTION, NL80211_ATTR_EXTERNAL_AUTH_SUPPORT, NL80211_ATTR_IFTYPE_AKM_SUITES = NL80211_ATTR_EXTERNAL_AUTH_SUPPORT + 23, /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, Loading Loading @@ -5312,4 +5322,28 @@ enum nl80211_external_auth_action { NL80211_EXTERNAL_AUTH_ABORT, }; /** * enum nl80211_iftype_akm_attributes - interface type AKM attributes * @__NL80211_IFTYPE_AKM_ATTR_INVALID: Invalid * * @NL80211_IFTYPE_AKM_ATTR_IFTYPES: nested attribute containing a flag * attribute for each interface type that supports AKM suites specified in * %NL80211_IFTYPE_AKM_ATTR_SUITES * @NL80211_IFTYPE_AKM_ATTR_SUITES: an array of u32. Used to indicate supported * AKM suites for the specified interface types. * * @__NL80211_IFTYPE_AKM_ATTR_LAST: Internal * @NL80211_IFTYPE_AKM_ATTR_MAX: highest interface type AKM attribute. */ enum nl80211_iftype_akm_attributes { __NL80211_IFTYPE_AKM_ATTR_INVALID, NL80211_IFTYPE_AKM_ATTR_IFTYPES, NL80211_IFTYPE_AKM_ATTR_SUITES, /* keep last */ __NL80211_IFTYPE_AKM_ATTR_LAST, NL80211_IFTYPE_AKM_ATTR_MAX = __NL80211_IFTYPE_AKM_ATTR_LAST - 1, }; #endif /* __LINUX_NL80211_H */
net/wireless/nl80211.c +47 −0 Original line number Diff line number Diff line Loading @@ -1308,6 +1308,46 @@ nl80211_send_mgmt_stypes(struct sk_buff *msg, return 0; } static int nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev, struct sk_buff *msg) { int i; struct nlattr *nested, *nested_akms; const struct wiphy_iftype_akm_suites *iftype_akms; if (!rdev->wiphy.num_iftype_akm_suites || !rdev->wiphy.iftype_akm_suites) return 0; nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES); if (!nested) return -ENOBUFS; for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { nested_akms = nla_nest_start(msg, i + 1); if (!nested_akms) return -ENOBUFS; iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES, iftype_akms->iftypes_mask)) return -ENOBUFS; if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES, sizeof(u32) * iftype_akms->n_akm_suites, iftype_akms->akm_suites)) { return -ENOBUFS; } nla_nest_end(msg, nested_akms); } nla_nest_end(msg, nested); return 0; } struct nl80211_dump_wiphy_state { s64 filter_wiphy; long start; Loading Loading @@ -1851,6 +1891,13 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, nla_nest_end(msg, nested); } state->split_start++; break; case 14: if (nl80211_put_iftype_akm_suites(rdev, msg)) goto nla_put_failure; /* done */ state->split_start = 0; break; Loading