Commit 7fc82af8 authored by Veerendranath Jakkam's avatar Veerendranath Jakkam Committed by Johannes Berg

cfg80211: Configure PMK lifetime and reauth threshold for PMKSA entries

Drivers that trigger roaming need to know the lifetime of the configured
PMKSA for deciding whether to trigger the full or PMKSA cache based
authentication. The configured PMKSA is invalid after the PMK lifetime
has expired and must not be used after that and the STA needs to
disassociate if the PMK expires. Hence the STA is expected to refresh
the PMK with a full authentication before this happens (e.g., when
reassociating to a new BSS the next time or by performing EAPOL
reauthentication depending on the AKM) to avoid unnecessary
disconnection.

The PMK reauthentication threshold is the percentage of the PMK lifetime
value and indicates to the driver to trigger a full authentication roam
(without PMKSA caching) after the reauthentication threshold time, but
before the PMK timer has expired. Authentication methods like SAE need
to be able to generate a new PMKSA entry without having to force a
disconnection after this threshold timeout. If no roaming occurs between
the reauthentication threshold time and PMK lifetime expiration,
disassociation is still forced.

The new attributes for providing these values correspond to the dot11
MIB variables dot11RSNAConfigPMKLifetime and
dot11RSNAConfigPMKReauthThreshold.

This type of functionality is already available in cases where user
space component is in control of roaming. This commit extends that same
capability into cases where parts or all of this functionality is
offloaded to the driver.
Signed-off-by: default avatarVeerendranath Jakkam <vjakkam@codeaurora.org>
Signed-off-by: default avatarJouni Malinen <jouni@codeaurora.org>
Link: https://lore.kernel.org/r/20200312235903.18462-1-jouni@codeaurora.orgSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent b255b72b
...@@ -2699,6 +2699,17 @@ enum wiphy_params_flags { ...@@ -2699,6 +2699,17 @@ enum wiphy_params_flags {
* @cache_id: 2-octet cache identifier advertized by a FILS AP identifying the * @cache_id: 2-octet cache identifier advertized by a FILS AP identifying the
* scope of PMKSA. This is valid only if @ssid_len is non-zero (may be * scope of PMKSA. This is valid only if @ssid_len is non-zero (may be
* %NULL). * %NULL).
* @pmk_lifetime: Maximum lifetime for PMKSA in seconds
* (dot11RSNAConfigPMKLifetime) or 0 if not specified.
* The configured PMKSA must not be used for PMKSA caching after
* expiration and any keys derived from this PMK become invalid on
* expiration, i.e., the current association must be dropped if the PMK
* used for it expires.
* @pmk_reauth_threshold: Threshold time for reauthentication (percentage of
* PMK lifetime, dot11RSNAConfigPMKReauthThreshold) or 0 if not specified.
* Drivers are expected to trigger a full authentication instead of using
* this PMKSA for caching when reassociating to a new BSS after this
* threshold to generate a new PMK before the current one expires.
*/ */
struct cfg80211_pmksa { struct cfg80211_pmksa {
const u8 *bssid; const u8 *bssid;
...@@ -2708,6 +2719,8 @@ struct cfg80211_pmksa { ...@@ -2708,6 +2719,8 @@ struct cfg80211_pmksa {
const u8 *ssid; const u8 *ssid;
size_t ssid_len; size_t ssid_len;
const u8 *cache_id; const u8 *cache_id;
u32 pmk_lifetime;
u8 pmk_reauth_threshold;
}; };
/** /**
......
...@@ -2446,6 +2446,30 @@ enum nl80211_commands { ...@@ -2446,6 +2446,30 @@ enum nl80211_commands {
* @NL80211_ATTR_CONTROL_PORT_NO_PREAUTH: disable preauth frame rx on control * @NL80211_ATTR_CONTROL_PORT_NO_PREAUTH: disable preauth frame rx on control
* port in order to forward/receive them as ordinary data frames. * port in order to forward/receive them as ordinary data frames.
* *
* @NL80211_ATTR_PMK_LIFETIME: Maximum lifetime for PMKSA in seconds (u32,
* dot11RSNAConfigPMKReauthThreshold; 0 is not a valid value).
* An optional parameter configured through %NL80211_CMD_SET_PMKSA.
* Drivers that trigger roaming need to know the lifetime of the
* configured PMKSA for triggering the full vs. PMKSA caching based
* authentication. This timeout helps authentication methods like SAE,
* where PMK gets updated only by going through a full (new SAE)
* authentication instead of getting updated during an association for EAP
* authentication. No new full authentication within the PMK expiry shall
* result in a disassociation at the end of the lifetime.
*
* @NL80211_ATTR_PMK_REAUTH_THRESHOLD: Reauthentication threshold time, in
* terms of percentage of %NL80211_ATTR_PMK_LIFETIME
* (u8, dot11RSNAConfigPMKReauthThreshold, 1..100). This is an optional
* parameter configured through %NL80211_CMD_SET_PMKSA. Requests the
* driver to trigger a full authentication roam (without PMKSA caching)
* after the reauthentication threshold time, but before the PMK lifetime
* has expired.
*
* Authentication methods like SAE need to be able to generate a new PMKSA
* entry without having to force a disconnection after the PMK timeout. If
* no roaming occurs between the reauth threshold and PMK expiration,
* disassociation is still forced.
*
* @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NUM_NL80211_ATTR: total number of nl80211_attrs available
* @NL80211_ATTR_MAX: highest attribute number currently defined * @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use * @__NL80211_ATTR_AFTER_LAST: internal use
...@@ -2918,6 +2942,9 @@ enum nl80211_attrs { ...@@ -2918,6 +2942,9 @@ enum nl80211_attrs {
NL80211_ATTR_CONTROL_PORT_NO_PREAUTH, NL80211_ATTR_CONTROL_PORT_NO_PREAUTH,
NL80211_ATTR_PMK_LIFETIME,
NL80211_ATTR_PMK_REAUTH_THRESHOLD,
/* add attributes here, update the policy in nl80211.c */ /* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST, __NL80211_ATTR_AFTER_LAST,
......
...@@ -661,6 +661,8 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { ...@@ -661,6 +661,8 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
[NL80211_ATTR_TID_CONFIG] = [NL80211_ATTR_TID_CONFIG] =
NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy), NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy),
[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG }, [NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG },
[NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1),
[NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100),
}; };
/* policy for the key attributes */ /* policy for the key attributes */
...@@ -10514,6 +10516,15 @@ static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info) ...@@ -10514,6 +10516,15 @@ static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
} }
if (info->attrs[NL80211_ATTR_PMK_LIFETIME])
pmksa.pmk_lifetime =
nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]);
if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD])
pmksa.pmk_reauth_threshold =
nla_get_u8(
info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]);
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
!(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP && !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP &&
......
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