[PATCH 06/21] nl80211: Handle CIGTK and CIP for stations and association
Benjamin Berg
benjamin at sipsolutions.net
Tue Oct 27 06:16:52 PDT 2026
From: Benjamin Berg <benjamin.berg at intel.com>
Add a new CIGTK key flag and handle CIGTK key installation as well as
Control Integrity Protocol (CIP) handling when associating and adding
stations.
Signed-off-by: Benjamin Berg <benjamin.berg at intel.com>
Reviewed-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
src/common/defs.h | 6 +++++-
src/drivers/driver_nl80211.c | 31 ++++++++++++++++++++++++++++++-
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/src/common/defs.h b/src/common/defs.h
index 03e83c8699..8a7e2ecfa2 100644
--- a/src/common/defs.h
+++ b/src/common/defs.h
@@ -535,6 +535,7 @@ enum key_flag {
KEY_FLAG_PAIRWISE = BIT(5),
KEY_FLAG_PMK = BIT(6),
KEY_FLAG_NEXT = BIT(7),
+ KEY_FLAG_CIGTK = BIT(8),
/* Used flag combinations */
KEY_FLAG_RX_TX = KEY_FLAG_RX | KEY_FLAG_TX,
KEY_FLAG_GROUP_RX_TX = KEY_FLAG_GROUP | KEY_FLAG_RX_TX,
@@ -553,6 +554,7 @@ enum key_flag {
KEY_FLAG_NEXT,
KEY_FLAG_GROUP_MASK = KEY_FLAG_GROUP_RX_TX_DEFAULT,
KEY_FLAG_PMK_MASK = KEY_FLAG_PMK,
+ KEY_FLAG_CIGTK_MASK = KEY_FLAG_CIGTK | KEY_FLAG_RX_TX,
};
static inline int check_key_flag(enum key_flag key_flag)
@@ -563,7 +565,9 @@ static inline int check_key_flag(enum key_flag key_flag)
((key_flag & KEY_FLAG_GROUP) &&
(key_flag & ~KEY_FLAG_GROUP_MASK)) ||
((key_flag & KEY_FLAG_PMK) &&
- (key_flag & ~KEY_FLAG_PMK_MASK)));
+ (key_flag & ~KEY_FLAG_PMK_MASK)) ||
+ ((key_flag & KEY_FLAG_CIGTK) &&
+ (key_flag & ~KEY_FLAG_CIGTK_MASK)));
}
enum ptk0_rekey_handling {
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 01a65ca0fb..0c0c8f5f81 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -4183,6 +4183,12 @@ static int wpa_driver_nl80211_set_key(struct i802_bss *bss,
if (nla_put_u32(key_msg, NL80211_KEY_TYPE,
NL80211_KEYTYPE_GROUP))
goto fail;
+ } else if ((key_flag & KEY_FLAG_CIGTK) &&
+ (key_flag & KEY_FLAG_RX || key_len == 0)) {
+ wpa_printf(MSG_DEBUG, " CIGTK RX (with addr)");
+ if (nla_put_u32(key_msg, NL80211_KEY_TYPE,
+ NL80211_KEYTYPE_CIGTK))
+ goto fail;
} else if (alg == WPA_ALG_NONE &&
(key_flag & KEY_FLAG_GROUP_MASK) == KEY_FLAG_GROUP) {
if (nla_put_u32(key_msg, NL80211_KEY_TYPE,
@@ -4201,11 +4207,16 @@ static int wpa_driver_nl80211_set_key(struct i802_bss *bss,
wpa_printf(MSG_DEBUG, " pairwise key");
}
} else if ((key_flag & KEY_FLAG_PAIRWISE) ||
- !(key_flag & KEY_FLAG_GROUP)) {
+ !(key_flag & (KEY_FLAG_GROUP | KEY_FLAG_CIGTK))) {
wpa_printf(MSG_DEBUG,
" invalid key_flag for a broadcast key");
ret = -EINVAL;
goto fail;
+ } else if (key_flag & KEY_FLAG_CIGTK) {
+ wpa_printf(MSG_DEBUG, " CIGTK");
+ if (nla_put_u32(key_msg, NL80211_KEY_TYPE,
+ NL80211_KEYTYPE_CIGTK))
+ goto fail;
} else {
wpa_printf(MSG_DEBUG, " broadcast key");
if (key_flag & KEY_FLAG_DEFAULT)
@@ -6253,6 +6264,8 @@ static u32 sta_flags_nl80211(int flags)
f |= BIT(NL80211_STA_FLAG_ASSOCIATED);
if (flags & WPA_STA_SPP_AMSDU)
f |= BIT(NL80211_STA_FLAG_SPP_AMSDU);
+ if (flags & WPA_STA_CIP)
+ f |= BIT(NL80211_STA_FLAG_CIP);
return f;
}
@@ -6413,6 +6426,16 @@ static int wpa_driver_nl80211_sta_add(void *priv,
goto fail;
}
+ if (params->flags & WPA_STA_CIP) {
+ wpa_hexdump(MSG_DEBUG, " * cip_capab",
+ ¶ms->cip_capab,
+ sizeof(params->cip_capab));
+ if (nla_put(msg, NL80211_ATTR_CIP_CAPABILITIES,
+ sizeof(params->cip_capab),
+ ¶ms->cip_capab))
+ goto fail;
+ }
+
if (is_ap_interface(drv->nlmode) &&
nla_put_u8(msg, NL80211_ATTR_STA_SUPPORT_P2P_PS,
params->support_p2p_ps ?
@@ -7880,6 +7903,12 @@ static int nl80211_connect_common(struct wpa_driver_nl80211_data *drv,
return -1;
}
+ if (params->cip) {
+ wpa_printf(MSG_DEBUG, " * CIP");
+ if (nla_put_flag(msg, NL80211_ATTR_ASSOC_CIP))
+ return -1;
+ }
+
return 0;
}
--
2.56.0
More information about the Hostap
mailing list