[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",
+				    &params->cip_capab,
+				    sizeof(params->cip_capab));
+			if (nla_put(msg, NL80211_ATTR_CIP_CAPABILITIES,
+				    sizeof(params->cip_capab),
+				    &params->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