diff mbox series

[1/2,iwinfo] iwinfo: add support for GCMP cipher

Message ID X/R7h2qE6g7qBqpy@makrotopia.org
State Accepted
Delegated to: Daniel Golle
Headers show
Series [1/2,iwinfo] iwinfo: add support for GCMP cipher | expand

Commit Message

Daniel Golle Jan. 5, 2021, 2:45 p.m. UTC
Extend support for WPA ciphers by GCMP which is required for 802.11ad.
Breaks ABI as ciphers now needs to be a field of 16 bits instead of 8.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
 include/iwinfo.h       | 7 ++++---
 include/iwinfo/utils.h | 2 +-
 iwinfo_cli.c           | 3 +++
 iwinfo_lua.c           | 3 +++
 iwinfo_nl80211.c       | 5 +++--
 iwinfo_utils.c         | 9 ++++++---
 6 files changed, 20 insertions(+), 9 deletions(-)

Comments

Christian Marangi Jan. 5, 2021, 2:52 p.m. UTC | #1
>
> Extend support for WPA ciphers by GCMP which is required for 802.11ad.
> Breaks ABI as ciphers now needs to be a field of 16 bits instead of 8.
>

If this gets accepted and we are changing the ABI, can we also add my
changes for the wifi channel analysis feature?
Daniel Golle Jan. 5, 2021, 4:35 p.m. UTC | #2
On Tue, Jan 05, 2021 at 03:52:40PM +0100, Ansuel Smith wrote:
> >
> > Extend support for WPA ciphers by GCMP which is required for 802.11ad.
> > Breaks ABI as ciphers now needs to be a field of 16 bits instead of 8.
> >
> 
> If this gets accepted and we are changing the ABI, can we also add my
> changes for the wifi channel analysis feature?

If you ask me, definitely yes, that's very good and useful work.
Jo-Philipp Wich Jan. 5, 2021, 10:10 p.m. UTC | #3
Hi,

before merging this, please extend the cmake rules in iwinfo.git to add a
SOVERSION property to the resulting libiwinfo library, this way we can adopt
ABI versio ntracking when we bump it the next time in OpenWrt.

~ Jo
diff mbox series

Patch

diff --git a/include/iwinfo.h b/include/iwinfo.h
index 5e64294..ac70997 100644
--- a/include/iwinfo.h
+++ b/include/iwinfo.h
@@ -38,7 +38,8 @@ 
 #define IWINFO_CIPHER_WEP104 (1 << 5)
 #define IWINFO_CIPHER_AESOCB (1 << 6)
 #define IWINFO_CIPHER_CKIP   (1 << 7)
-#define IWINFO_CIPHER_COUNT  8
+#define IWINFO_CIPHER_GCMP   (1 << 8)
+#define IWINFO_CIPHER_COUNT  9
 
 #define IWINFO_KMGMT_NONE    (1 << 0)
 #define IWINFO_KMGMT_8021x   (1 << 1)
@@ -164,8 +165,8 @@  struct iwinfo_freqlist_entry {
 struct iwinfo_crypto_entry {
 	uint8_t	enabled;
 	uint8_t wpa_version;
-	uint8_t group_ciphers;
-	uint8_t pair_ciphers;
+	uint16_t group_ciphers;
+	uint16_t pair_ciphers;
 	uint8_t auth_suites;
 	uint8_t auth_algs;
 };
diff --git a/include/iwinfo/utils.h b/include/iwinfo/utils.h
index 98b9c89..1fa4f52 100644
--- a/include/iwinfo/utils.h
+++ b/include/iwinfo/utils.h
@@ -54,7 +54,7 @@  struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id);
 int iwinfo_hardware_id_from_mtd(struct iwinfo_hardware_id *id);
 
 void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data, uint8_t len,
-					  uint8_t defcipher, uint8_t defauth);
+					  uint16_t defcipher, uint8_t defauth);
 
 struct uci_section *iwinfo_uci_get_radio(const char *name, const char *type);
 void iwinfo_uci_free(void);
diff --git a/iwinfo_cli.c b/iwinfo_cli.c
index 0332bc2..ed62da8 100644
--- a/iwinfo_cli.c
+++ b/iwinfo_cli.c
@@ -158,6 +158,9 @@  static char * format_enc_ciphers(int ciphers)
 	if (ciphers & IWINFO_CIPHER_CCMP)
 		pos += sprintf(pos, "CCMP, ");
 
+	if (ciphers & IWINFO_CIPHER_GCMP)
+		pos += sprintf(pos, "GCMP, ");
+
 	if (ciphers & IWINFO_CIPHER_WRAP)
 		pos += sprintf(pos, "WRAP, ");
 
diff --git a/iwinfo_lua.c b/iwinfo_lua.c
index 58a5537..abe848b 100644
--- a/iwinfo_lua.c
+++ b/iwinfo_lua.c
@@ -61,6 +61,9 @@  static char * iwinfo_crypto_print_ciphers(int ciphers)
 	if (ciphers & IWINFO_CIPHER_CCMP)
 		pos += sprintf(pos, "CCMP, ");
 
+	if (ciphers & IWINFO_CIPHER_GCMP)
+		pos += sprintf(pos, "GCMP, ");
+
 	if (ciphers & IWINFO_CIPHER_WRAP)
 		pos += sprintf(pos, "WRAP, ");
 
diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
index 2b2a043..07cd916 100644
--- a/iwinfo_nl80211.c
+++ b/iwinfo_nl80211.c
@@ -1582,10 +1582,11 @@  static struct {
 	{ "WEP-40",  IWINFO_CIPHER_WEP40 },
 	{ "NONE",    IWINFO_CIPHER_NONE },
 	{ "TKIP",    IWINFO_CIPHER_TKIP },
-	{ "CCMP",    IWINFO_CIPHER_CCMP }
+	{ "CCMP",    IWINFO_CIPHER_CCMP },
+	{ "GCMP",    IWINFO_CIPHER_GCMP }
 };
 
-static void parse_wpa_ciphers(const char *str, uint8_t *ciphers)
+static void parse_wpa_ciphers(const char *str, uint16_t *ciphers)
 {
 	int i;
 	size_t l;
diff --git a/iwinfo_utils.c b/iwinfo_utils.c
index b4f98a9..d071997 100644
--- a/iwinfo_utils.c
+++ b/iwinfo_utils.c
@@ -285,7 +285,7 @@  int iwinfo_hardware_id_from_mtd(struct iwinfo_hardware_id *id)
 	return (id->vendor_id && id->device_id) ? 0 : -1;
 }
 
-static void iwinfo_parse_rsn_cipher(uint8_t idx, uint8_t *ciphers)
+static void iwinfo_parse_rsn_cipher(uint8_t idx, uint16_t *ciphers)
 {
 	switch (idx)
 	{
@@ -312,9 +312,12 @@  static void iwinfo_parse_rsn_cipher(uint8_t idx, uint8_t *ciphers)
 			*ciphers |= IWINFO_CIPHER_WEP104;
 			break;
 
+		case 8:
+			*ciphers |= IWINFO_CIPHER_GCMP;
+			break;
+
 		case 6:  /* AES-128-CMAC */
 		case 7:  /* No group addressed */
-		case 8:  /* GCMP */
 		case 9:  /* GCMP-256 */
 		case 10: /* CCMP-256 */
 		case 11: /* BIP-GMAC-128 */
@@ -325,7 +328,7 @@  static void iwinfo_parse_rsn_cipher(uint8_t idx, uint8_t *ciphers)
 }
 
 void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data, uint8_t len,
-					  uint8_t defcipher, uint8_t defauth)
+					  uint16_t defcipher, uint8_t defauth)
 {
 	uint16_t i, count;
 	uint8_t wpa_version = 0;