2024-05-11 16:34:12

by Christophe JAILLET

[permalink] [raw]
Subject: [PATCH 0/3] lib80211: Constify struct lib80211_crypto_ops

This serie constify struct lib80211_crypto_ops. This sutructure is
mostly some function pointers, so having it in a read-only section
when possible is safer.


The 1st patch, update some function prototypes and data structures in
lib80211.

The 2nd patch constifies some struct lib80211_crypto_ops in lib80211.
This moves some data to a read-only section, so increase overall
security.

The 3rd patch does the same for staging/rtl8192e.

Note that the functions have looked in staging/rtl8192e look really
similar to the ones in lib80211. Maybe it could be removed in favor of
the latter.


Each patch in the serie has been compile tested ony.

Christophe JAILLET (3):
lib80211: Handle const struct lib80211_crypto_ops in lib80211
lib80211: Constify struct lib80211_crypto_ops
staging: rtl8192e: Constify struct lib80211_crypto_ops

drivers/staging/rtl8192e/rtllib_crypt_ccmp.c | 2 +-
drivers/staging/rtl8192e/rtllib_crypt_tkip.c | 2 +-
drivers/staging/rtl8192e/rtllib_crypt_wep.c | 2 +-
drivers/staging/rtl8192e/rtllib_wx.c | 2 +-
include/net/lib80211.h | 8 ++++----
net/wireless/lib80211.c | 10 +++++-----
net/wireless/lib80211_crypt_ccmp.c | 2 +-
net/wireless/lib80211_crypt_tkip.c | 2 +-
net/wireless/lib80211_crypt_wep.c | 2 +-
9 files changed, 16 insertions(+), 16 deletions(-)

--
2.45.0



2024-05-11 16:34:35

by Christophe JAILLET

[permalink] [raw]
Subject: [PATCH 1/3] lib80211: Handle const struct lib80211_crypto_ops in lib80211

lib80211_register_crypto_ops() and lib80211_unregister_crypto_ops() don't
modify their "struct lib80211_crypto_ops *ops" argument. So, it can be
declared as const.

Doing so, some adjustments are needed to also constify some date in
"struct lib80211_crypt_data", "struct lib80211_crypto_alg" and the
return value of lib80211_get_crypto_ops().

Signed-off-by: Christophe JAILLET <[email protected]>
---
Compile tested only.
---
drivers/staging/rtl8192e/rtllib_wx.c | 2 +-
include/net/lib80211.h | 8 ++++----
net/wireless/lib80211.c | 8 ++++----
3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/rtl8192e/rtllib_wx.c b/drivers/staging/rtl8192e/rtllib_wx.c
index fbd4ec824084..c730d921463d 100644
--- a/drivers/staging/rtl8192e/rtllib_wx.c
+++ b/drivers/staging/rtl8192e/rtllib_wx.c
@@ -474,7 +474,7 @@ int rtllib_wx_set_encode_ext(struct rtllib_device *ieee,
int i, idx;
int group_key = 0;
const char *alg, *module;
- struct lib80211_crypto_ops *ops;
+ const struct lib80211_crypto_ops *ops;
struct lib80211_crypt_data **crypt;

struct rtllib_security sec = {
diff --git a/include/net/lib80211.h b/include/net/lib80211.h
index 8b47d3a51cf8..fd0f15d87d80 100644
--- a/include/net/lib80211.h
+++ b/include/net/lib80211.h
@@ -92,7 +92,7 @@ struct lib80211_crypto_ops {

struct lib80211_crypt_data {
struct list_head list; /* delayed deletion list */
- struct lib80211_crypto_ops *ops;
+ const struct lib80211_crypto_ops *ops;
void *priv;
atomic_t refcnt;
};
@@ -113,9 +113,9 @@ struct lib80211_crypt_info {
int lib80211_crypt_info_init(struct lib80211_crypt_info *info, char *name,
spinlock_t *lock);
void lib80211_crypt_info_free(struct lib80211_crypt_info *info);
-int lib80211_register_crypto_ops(struct lib80211_crypto_ops *ops);
-int lib80211_unregister_crypto_ops(struct lib80211_crypto_ops *ops);
-struct lib80211_crypto_ops *lib80211_get_crypto_ops(const char *name);
+int lib80211_register_crypto_ops(const struct lib80211_crypto_ops *ops);
+int lib80211_unregister_crypto_ops(const struct lib80211_crypto_ops *ops);
+const struct lib80211_crypto_ops *lib80211_get_crypto_ops(const char *name);
void lib80211_crypt_delayed_deinit(struct lib80211_crypt_info *info,
struct lib80211_crypt_data **crypt);

diff --git a/net/wireless/lib80211.c b/net/wireless/lib80211.c
index d66a913027e0..51e31316bcb8 100644
--- a/net/wireless/lib80211.c
+++ b/net/wireless/lib80211.c
@@ -34,7 +34,7 @@ MODULE_LICENSE("GPL");

struct lib80211_crypto_alg {
struct list_head list;
- struct lib80211_crypto_ops *ops;
+ const struct lib80211_crypto_ops *ops;
};

static LIST_HEAD(lib80211_crypto_algs);
@@ -161,7 +161,7 @@ void lib80211_crypt_delayed_deinit(struct lib80211_crypt_info *info,
}
EXPORT_SYMBOL(lib80211_crypt_delayed_deinit);

-int lib80211_register_crypto_ops(struct lib80211_crypto_ops *ops)
+int lib80211_register_crypto_ops(const struct lib80211_crypto_ops *ops)
{
unsigned long flags;
struct lib80211_crypto_alg *alg;
@@ -183,7 +183,7 @@ int lib80211_register_crypto_ops(struct lib80211_crypto_ops *ops)
}
EXPORT_SYMBOL(lib80211_register_crypto_ops);

-int lib80211_unregister_crypto_ops(struct lib80211_crypto_ops *ops)
+int lib80211_unregister_crypto_ops(const struct lib80211_crypto_ops *ops)
{
struct lib80211_crypto_alg *alg;
unsigned long flags;
@@ -206,7 +206,7 @@ int lib80211_unregister_crypto_ops(struct lib80211_crypto_ops *ops)
}
EXPORT_SYMBOL(lib80211_unregister_crypto_ops);

-struct lib80211_crypto_ops *lib80211_get_crypto_ops(const char *name)
+const struct lib80211_crypto_ops *lib80211_get_crypto_ops(const char *name)
{
struct lib80211_crypto_alg *alg;
unsigned long flags;
--
2.45.0


2024-05-11 16:35:00

by Christophe JAILLET

[permalink] [raw]
Subject: [PATCH 2/3] lib80211: Constify struct lib80211_crypto_ops

Now that functions in lib80211 handle "const struct lib80211_crypto_ops",
some structure can be constify as well.

Constifying these structures moves some data to a read-only section, so
increase overall security.

Before:
text data bss dec hex filename
7273 604 16 7893 1ed5 net/wireless/lib80211.o

After:
text data bss dec hex filename
7429 444 16 7889 1ed1 net/wireless/lib80211.o

Signed-off-by: Christophe JAILLET <[email protected]>
---
Compile tested only.
---
net/wireless/lib80211.c | 2 +-
net/wireless/lib80211_crypt_ccmp.c | 2 +-
net/wireless/lib80211_crypt_tkip.c | 2 +-
net/wireless/lib80211_crypt_wep.c | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/wireless/lib80211.c b/net/wireless/lib80211.c
index 51e31316bcb8..64c447040786 100644
--- a/net/wireless/lib80211.c
+++ b/net/wireless/lib80211.c
@@ -234,7 +234,7 @@ static void lib80211_crypt_null_deinit(void *priv)
{
}

-static struct lib80211_crypto_ops lib80211_crypt_null = {
+static const struct lib80211_crypto_ops lib80211_crypt_null = {
.name = "NULL",
.init = lib80211_crypt_null_init,
.deinit = lib80211_crypt_null_deinit,
diff --git a/net/wireless/lib80211_crypt_ccmp.c b/net/wireless/lib80211_crypt_ccmp.c
index cca5e1cf089e..5aad139130e1 100644
--- a/net/wireless/lib80211_crypt_ccmp.c
+++ b/net/wireless/lib80211_crypt_ccmp.c
@@ -418,7 +418,7 @@ static void lib80211_ccmp_print_stats(struct seq_file *m, void *priv)
ccmp->dot11RSNAStatsCCMPDecryptErrors);
}

-static struct lib80211_crypto_ops lib80211_crypt_ccmp = {
+static const struct lib80211_crypto_ops lib80211_crypt_ccmp = {
.name = "CCMP",
.init = lib80211_ccmp_init,
.deinit = lib80211_ccmp_deinit,
diff --git a/net/wireless/lib80211_crypt_tkip.c b/net/wireless/lib80211_crypt_tkip.c
index 5c8cdf7681e3..63e68e5e121e 100644
--- a/net/wireless/lib80211_crypt_tkip.c
+++ b/net/wireless/lib80211_crypt_tkip.c
@@ -705,7 +705,7 @@ static void lib80211_tkip_print_stats(struct seq_file *m, void *priv)
tkip->dot11RSNAStatsTKIPLocalMICFailures);
}

-static struct lib80211_crypto_ops lib80211_crypt_tkip = {
+static const struct lib80211_crypto_ops lib80211_crypt_tkip = {
.name = "TKIP",
.init = lib80211_tkip_init,
.deinit = lib80211_tkip_deinit,
diff --git a/net/wireless/lib80211_crypt_wep.c b/net/wireless/lib80211_crypt_wep.c
index 6ab9957b8f96..3b148c7bef85 100644
--- a/net/wireless/lib80211_crypt_wep.c
+++ b/net/wireless/lib80211_crypt_wep.c
@@ -226,7 +226,7 @@ static void lib80211_wep_print_stats(struct seq_file *m, void *priv)
seq_printf(m, "key[%d] alg=WEP len=%d\n", wep->key_idx, wep->key_len);
}

-static struct lib80211_crypto_ops lib80211_crypt_wep = {
+static const struct lib80211_crypto_ops lib80211_crypt_wep = {
.name = "WEP",
.init = lib80211_wep_init,
.deinit = lib80211_wep_deinit,
--
2.45.0


2024-05-11 16:35:16

by Christophe JAILLET

[permalink] [raw]
Subject: [PATCH 3/3] staging: rtl8192e: Constify struct lib80211_crypto_ops

Now that functions in lib80211 handle "const struct lib80211_crypto_ops",
some structure can be constify as well.

Constifying these structures moves some data to a read-only section, so
increase overall security.

Signed-off-by: Christophe JAILLET <[email protected]>
---
Compile tested only.
---
drivers/staging/rtl8192e/rtllib_crypt_ccmp.c | 2 +-
drivers/staging/rtl8192e/rtllib_crypt_tkip.c | 2 +-
drivers/staging/rtl8192e/rtllib_crypt_wep.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c b/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c
index cbb8c8dbe9b0..ce02204ac1ba 100644
--- a/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c
+++ b/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c
@@ -378,7 +378,7 @@ static void rtllib_ccmp_print_stats(struct seq_file *m, void *priv)
ccmp->dot11rsna_stats_ccmp_decrypt_errors);
}

-static struct lib80211_crypto_ops rtllib_crypt_ccmp = {
+static const struct lib80211_crypto_ops rtllib_crypt_ccmp = {
.name = "R-CCMP",
.init = rtllib_ccmp_init,
.deinit = rtllib_ccmp_deinit,
diff --git a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
index 0244b524a7d4..be8060ecaecd 100644
--- a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
+++ b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
@@ -678,7 +678,7 @@ static void rtllib_tkip_print_stats(struct seq_file *m, void *priv)
tkip->dot11RSNAStatsTKIPLocalMICFailures);
}

-static struct lib80211_crypto_ops rtllib_crypt_tkip = {
+static const struct lib80211_crypto_ops rtllib_crypt_tkip = {
.name = "R-TKIP",
.init = rtllib_tkip_init,
.deinit = rtllib_tkip_deinit,
diff --git a/drivers/staging/rtl8192e/rtllib_crypt_wep.c b/drivers/staging/rtl8192e/rtllib_crypt_wep.c
index 21c2b7666d6f..55c5199a25ea 100644
--- a/drivers/staging/rtl8192e/rtllib_crypt_wep.c
+++ b/drivers/staging/rtl8192e/rtllib_crypt_wep.c
@@ -209,7 +209,7 @@ static void prism2_wep_print_stats(struct seq_file *m, void *priv)
seq_printf(m, "key[%d] alg=WEP len=%d\n", wep->key_idx, wep->key_len);
}

-static struct lib80211_crypto_ops rtllib_crypt_wep = {
+static const struct lib80211_crypto_ops rtllib_crypt_wep = {
.name = "R-WEP",
.init = prism2_wep_init,
.deinit = prism2_wep_deinit,
--
2.45.0


2024-05-11 21:47:28

by Christophe JAILLET

[permalink] [raw]
Subject: Re: [PATCH 1/3] lib80211: Handle const struct lib80211_crypto_ops in lib80211

Le 11/05/2024 à 22:31, Simon Horman a écrit :
> On Sat, May 11, 2024 at 06:32:38PM +0200, Christophe JAILLET wrote:
>> lib80211_register_crypto_ops() and lib80211_unregister_crypto_ops() don't
>> modify their "struct lib80211_crypto_ops *ops" argument. So, it can be
>> declared as const.
>>
>> Doing so, some adjustments are needed to also constify some date in
>> "struct lib80211_crypt_data", "struct lib80211_crypto_alg" and the
>> return value of lib80211_get_crypto_ops().
>>
>> Signed-off-by: Christophe JAILLET <[email protected]>
>> ---
>> Compile tested only.
>
> Hi Christophe,
>
> Unfortunately allmodconfig W=1 build on x86_64 with Clang says:
>
> .../libipw_wx.c:587:6: error: assigning to 'struct lib80211_crypto_ops *' from 'const struct lib80211_crypto_ops *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
> 587 | ops = lib80211_get_crypto_ops(alg);
> | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> .../libipw_wx.c:590:7: error: assigning to 'struct lib80211_crypto_ops *' from 'const struct lib80211_crypto_ops *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
> 590 | ops = lib80211_get_crypto_ops(alg);
> | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>

Hi,

I'll dig more tomorrow, but I don't see this error (with gcc), even with
W=1.

The following part of the patch is here to avoid the exact compilation
error that you see.

Strange.

CJ


diff --git a/drivers/staging/rtl8192e/rtllib_wx.c
b/drivers/staging/rtl8192e/rtllib_wx.c
index fbd4ec824084..c730d921463d 100644
--- a/drivers/staging/rtl8192e/rtllib_wx.c
+++ b/drivers/staging/rtl8192e/rtllib_wx.c
@@ -474,7 +474,7 @@ int rtllib_wx_set_encode_ext(struct rtllib_device *ieee,
int i, idx;
int group_key = 0;
const char *alg, *module;
- struct lib80211_crypto_ops *ops;
+ const struct lib80211_crypto_ops *ops;
struct lib80211_crypt_data **crypt;

struct rtllib_security sec = {

2024-05-12 07:25:55

by Christophe JAILLET

[permalink] [raw]
Subject: Re: [PATCH 1/3] lib80211: Handle const struct lib80211_crypto_ops in lib80211



Le 11/05/2024 à 23:47, Christophe JAILLET a écrit :
> Le 11/05/2024 à 22:31, Simon Horman a écrit :
>> On Sat, May 11, 2024 at 06:32:38PM +0200, Christophe JAILLET wrote:
>>> lib80211_register_crypto_ops() and lib80211_unregister_crypto_ops()
>>> don't
>>> modify their "struct lib80211_crypto_ops *ops" argument. So, it can be
>>> declared as const.
>>>
>>> Doing so, some adjustments are needed to also constify some date in
>>> "struct lib80211_crypt_data", "struct lib80211_crypto_alg" and the
>>> return value of lib80211_get_crypto_ops().
>>>
>>> Signed-off-by: Christophe JAILLET <[email protected]>
>>> ---
>>> Compile tested only.
>>
>> Hi Christophe,
>>
>> Unfortunately allmodconfig W=1 build on x86_64 with Clang says:
>>
>> .../libipw_wx.c:587:6: error: assigning to 'struct lib80211_crypto_ops
>> *' from 'const struct lib80211_crypto_ops *' discards qualifiers
>> [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
>>   587 |         ops = lib80211_get_crypto_ops(alg);
>>       |             ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> .../libipw_wx.c:590:7: error: assigning to 'struct lib80211_crypto_ops
>> *' from 'const struct lib80211_crypto_ops *' discards qualifiers
>> [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
>>   590 |                 ops = lib80211_get_crypto_ops(alg);
>>       |                     ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>
> Hi,
>
> I'll dig more tomorrow, but I don't see this error (with gcc), even with
> W=1.
>
> The following part of the patch is here to avoid the exact compilation
> error that you see.
>
> Strange.
>
> CJ
>

Ok, got it.
Thanks for the pointer.

I don't know how I missed this one. :(

I'll send a v2.

CJ

2024-05-12 09:26:02

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 1/3] lib80211: Handle const struct lib80211_crypto_ops in lib80211

Hi Christophe,

kernel test robot noticed the following build warnings:

[auto build test WARNING on staging/staging-testing]
[also build test WARNING on staging/staging-next staging/staging-linus wireless-next/main wireless/main linus/master v6.9-rc7 next-20240510]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Christophe-JAILLET/lib80211-Handle-const-struct-lib80211_crypto_ops-in-lib80211/20240512-003642
base: staging/staging-testing
patch link: https://lore.kernel.org/r/d6306f7c76015653e9539ddbcd1ed74d1681a98f.1715443223.git.christophe.jaillet%40wanadoo.fr
patch subject: [PATCH 1/3] lib80211: Handle const struct lib80211_crypto_ops in lib80211
config: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20240512/[email protected]/config)
compiler: alpha-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240512/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

drivers/net/wireless/intel/ipw2x00/libipw_wx.c: In function 'libipw_wx_set_encodeext':
>> drivers/net/wireless/intel/ipw2x00/libipw_wx.c:587:13: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
587 | ops = lib80211_get_crypto_ops(alg);
| ^
drivers/net/wireless/intel/ipw2x00/libipw_wx.c:590:21: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
590 | ops = lib80211_get_crypto_ops(alg);
| ^


vim +/const +587 drivers/net/wireless/intel/ipw2x00/libipw_wx.c

b453872c35cfcb net/ieee80211/ieee80211_wx.c Jeff Garzik 2005-05-12 501
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 502 int libipw_wx_set_encodeext(struct libipw_device *ieee,
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 503 struct iw_request_info *info,
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 504 union iwreq_data *wrqu, char *extra)
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 505 {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 506 struct net_device *dev = ieee->dev;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 507 struct iw_point *encoding = &wrqu->encoding;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 508 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 509 int i, idx, ret = 0;
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 510 int group_key = 0;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 511 const char *alg, *module;
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 512 struct lib80211_crypto_ops *ops;
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 513 struct lib80211_crypt_data **crypt;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 514
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 515 struct libipw_security sec = {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 516 .flags = 0,
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 517 };
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 518
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 519 idx = encoding->flags & IW_ENCODE_INDEX;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 520 if (idx) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 521 if (idx < 1 || idx > WEP_KEYS)
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 522 return -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 523 idx--;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 524 } else
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 525 idx = ieee->crypt_info.tx_keyidx;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 526
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 527 if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 528 crypt = &ieee->crypt_info.crypt[idx];
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 529 group_key = 1;
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 530 } else {
e189277a3f1cbb net/ieee80211/ieee80211_wx.c Volker Braun 2005-10-24 531 /* some Cisco APs use idx>0 for unicast in dynamic WEP */
e189277a3f1cbb net/ieee80211/ieee80211_wx.c Volker Braun 2005-10-24 532 if (idx != 0 && ext->alg != IW_ENCODE_ALG_WEP)
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 533 return -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 534 if (ieee->iw_mode == IW_MODE_INFRA)
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 535 crypt = &ieee->crypt_info.crypt[idx];
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 536 else
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 537 return -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 538 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 539
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 540 sec.flags |= SEC_ENABLED | SEC_ENCRYPT;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 541 if ((encoding->flags & IW_ENCODE_DISABLED) ||
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 542 ext->alg == IW_ENCODE_ALG_NONE) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 543 if (*crypt)
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 544 lib80211_crypt_delayed_deinit(&ieee->crypt_info, crypt);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 545
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 546 for (i = 0; i < WEP_KEYS; i++)
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 547 if (ieee->crypt_info.crypt[i] != NULL)
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 548 break;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 549
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 550 if (i == WEP_KEYS) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 551 sec.enabled = 0;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 552 sec.encrypt = 0;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 553 sec.level = SEC_LEVEL_0;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 554 sec.flags |= SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 555 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 556 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 557 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 558
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 559 sec.enabled = 1;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 560 sec.encrypt = 1;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 561
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 562 if (group_key ? !ieee->host_mc_decrypt :
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 563 !(ieee->host_encrypt || ieee->host_decrypt ||
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 564 ieee->host_encrypt_msdu))
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 565 goto skip_host_crypt;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 566
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 567 switch (ext->alg) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 568 case IW_ENCODE_ALG_WEP:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 569 alg = "WEP";
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 570 module = "lib80211_crypt_wep";
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 571 break;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 572 case IW_ENCODE_ALG_TKIP:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 573 alg = "TKIP";
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 574 module = "lib80211_crypt_tkip";
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 575 break;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 576 case IW_ENCODE_ALG_CCMP:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 577 alg = "CCMP";
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 578 module = "lib80211_crypt_ccmp";
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 579 break;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 580 default:
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 581 LIBIPW_DEBUG_WX("%s: unknown crypto alg %d\n",
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 582 dev->name, ext->alg);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 583 ret = -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 584 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 585 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 586
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 @587 ops = lib80211_get_crypto_ops(alg);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 588 if (ops == NULL) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 589 request_module(module);
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 590 ops = lib80211_get_crypto_ops(alg);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 591 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 592 if (ops == NULL) {
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 593 LIBIPW_DEBUG_WX("%s: unknown crypto alg %d\n",
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 594 dev->name, ext->alg);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 595 ret = -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 596 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 597 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 598
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 599 if (*crypt == NULL || (*crypt)->ops != ops) {
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 600 struct lib80211_crypt_data *new_crypt;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 601
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 602 lib80211_crypt_delayed_deinit(&ieee->crypt_info, crypt);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 603
0da974f4f303a6 net/ieee80211/ieee80211_wx.c Panagiotis Issaris 2006-07-21 604 new_crypt = kzalloc(sizeof(*new_crypt), GFP_KERNEL);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 605 if (new_crypt == NULL) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 606 ret = -ENOMEM;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 607 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 608 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 609 new_crypt->ops = ops;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 610 if (new_crypt->ops && try_module_get(new_crypt->ops->owner))
6eb6edf04acd09 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-22 611 new_crypt->priv = new_crypt->ops->init(idx);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 612 if (new_crypt->priv == NULL) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 613 kfree(new_crypt);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 614 ret = -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 615 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 616 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 617 *crypt = new_crypt;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 618 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 619
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 620 if (ext->key_len > 0 && (*crypt)->ops->set_key &&
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 621 (*crypt)->ops->set_key(ext->key, ext->key_len, ext->rx_seq,
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 622 (*crypt)->priv) < 0) {
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 623 LIBIPW_DEBUG_WX("%s: key setting failed\n", dev->name);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 624 ret = -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 625 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 626 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 627
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 628 skip_host_crypt:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 629 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 630 ieee->crypt_info.tx_keyidx = idx;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 631 sec.active_key = idx;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 632 sec.flags |= SEC_ACTIVE_KEY;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 633 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 634
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 635 if (ext->alg != IW_ENCODE_ALG_NONE) {
260a9ad9446723 drivers/net/wireless/intel/ipw2x00/libipw_wx.c Dan Carpenter 2021-04-14 636 int key_len = clamp_val(ext->key_len, 0, SCM_KEY_LEN);
260a9ad9446723 drivers/net/wireless/intel/ipw2x00/libipw_wx.c Dan Carpenter 2021-04-14 637
260a9ad9446723 drivers/net/wireless/intel/ipw2x00/libipw_wx.c Dan Carpenter 2021-04-14 638 memcpy(sec.keys[idx], ext->key, key_len);
260a9ad9446723 drivers/net/wireless/intel/ipw2x00/libipw_wx.c Dan Carpenter 2021-04-14 639 sec.key_sizes[idx] = key_len;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 640 sec.flags |= (1 << idx);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 641 if (ext->alg == IW_ENCODE_ALG_WEP) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 642 sec.encode_alg[idx] = SEC_ALG_WEP;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 643 sec.flags |= SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 644 sec.level = SEC_LEVEL_1;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 645 } else if (ext->alg == IW_ENCODE_ALG_TKIP) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 646 sec.encode_alg[idx] = SEC_ALG_TKIP;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 647 sec.flags |= SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 648 sec.level = SEC_LEVEL_2;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 649 } else if (ext->alg == IW_ENCODE_ALG_CCMP) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 650 sec.encode_alg[idx] = SEC_ALG_CCMP;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 651 sec.flags |= SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 652 sec.level = SEC_LEVEL_3;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 653 }
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 654 /* Don't set sec level for group keys. */
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 655 if (group_key)
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 656 sec.flags &= ~SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 657 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 658 done:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 659 if (ieee->set_security)
3fc7bc8ea792b4 drivers/net/wireless/ipw2x00/libipw_wx.c Paul Bolle 2012-09-21 660 ieee->set_security(dev, &sec);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 661
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 662 return ret;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 663 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 664

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2024-05-13 02:15:17

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 1/3] lib80211: Handle const struct lib80211_crypto_ops in lib80211

Hi Christophe,

kernel test robot noticed the following build warnings:

[auto build test WARNING on staging/staging-testing]
[also build test WARNING on staging/staging-next staging/staging-linus wireless-next/main wireless/main linus/master v6.9 next-20240510]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Christophe-JAILLET/lib80211-Handle-const-struct-lib80211_crypto_ops-in-lib80211/20240512-003642
base: staging/staging-testing
patch link: https://lore.kernel.org/r/d6306f7c76015653e9539ddbcd1ed74d1681a98f.1715443223.git.christophe.jaillet%40wanadoo.fr
patch subject: [PATCH 1/3] lib80211: Handle const struct lib80211_crypto_ops in lib80211
config: csky-randconfig-r132-20240513 (https://download.01.org/0day-ci/archive/20240513/[email protected]/config)
compiler: csky-linux-gcc (GCC) 13.2.0
reproduce: (https://download.01.org/0day-ci/archive/20240513/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

sparse warnings: (new ones prefixed by >>)
>> drivers/net/wireless/intel/ipw2x00/libipw_wx.c:587:13: sparse: sparse: incorrect type in assignment (different modifiers) @@ expected struct lib80211_crypto_ops *ops @@ got struct lib80211_crypto_ops const * @@
drivers/net/wireless/intel/ipw2x00/libipw_wx.c:587:13: sparse: expected struct lib80211_crypto_ops *ops
drivers/net/wireless/intel/ipw2x00/libipw_wx.c:587:13: sparse: got struct lib80211_crypto_ops const *
drivers/net/wireless/intel/ipw2x00/libipw_wx.c:590:21: sparse: sparse: incorrect type in assignment (different modifiers) @@ expected struct lib80211_crypto_ops *ops @@ got struct lib80211_crypto_ops const * @@
drivers/net/wireless/intel/ipw2x00/libipw_wx.c:590:21: sparse: expected struct lib80211_crypto_ops *ops
drivers/net/wireless/intel/ipw2x00/libipw_wx.c:590:21: sparse: got struct lib80211_crypto_ops const *

vim +587 drivers/net/wireless/intel/ipw2x00/libipw_wx.c

b453872c35cfcb net/ieee80211/ieee80211_wx.c Jeff Garzik 2005-05-12 501
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 502 int libipw_wx_set_encodeext(struct libipw_device *ieee,
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 503 struct iw_request_info *info,
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 504 union iwreq_data *wrqu, char *extra)
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 505 {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 506 struct net_device *dev = ieee->dev;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 507 struct iw_point *encoding = &wrqu->encoding;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 508 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 509 int i, idx, ret = 0;
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 510 int group_key = 0;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 511 const char *alg, *module;
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 512 struct lib80211_crypto_ops *ops;
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 513 struct lib80211_crypt_data **crypt;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 514
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 515 struct libipw_security sec = {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 516 .flags = 0,
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 517 };
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 518
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 519 idx = encoding->flags & IW_ENCODE_INDEX;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 520 if (idx) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 521 if (idx < 1 || idx > WEP_KEYS)
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 522 return -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 523 idx--;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 524 } else
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 525 idx = ieee->crypt_info.tx_keyidx;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 526
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 527 if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 528 crypt = &ieee->crypt_info.crypt[idx];
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 529 group_key = 1;
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 530 } else {
e189277a3f1cbb net/ieee80211/ieee80211_wx.c Volker Braun 2005-10-24 531 /* some Cisco APs use idx>0 for unicast in dynamic WEP */
e189277a3f1cbb net/ieee80211/ieee80211_wx.c Volker Braun 2005-10-24 532 if (idx != 0 && ext->alg != IW_ENCODE_ALG_WEP)
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 533 return -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 534 if (ieee->iw_mode == IW_MODE_INFRA)
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 535 crypt = &ieee->crypt_info.crypt[idx];
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 536 else
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 537 return -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 538 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 539
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 540 sec.flags |= SEC_ENABLED | SEC_ENCRYPT;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 541 if ((encoding->flags & IW_ENCODE_DISABLED) ||
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 542 ext->alg == IW_ENCODE_ALG_NONE) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 543 if (*crypt)
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 544 lib80211_crypt_delayed_deinit(&ieee->crypt_info, crypt);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 545
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 546 for (i = 0; i < WEP_KEYS; i++)
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 547 if (ieee->crypt_info.crypt[i] != NULL)
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 548 break;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 549
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 550 if (i == WEP_KEYS) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 551 sec.enabled = 0;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 552 sec.encrypt = 0;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 553 sec.level = SEC_LEVEL_0;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 554 sec.flags |= SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 555 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 556 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 557 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 558
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 559 sec.enabled = 1;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 560 sec.encrypt = 1;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 561
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 562 if (group_key ? !ieee->host_mc_decrypt :
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 563 !(ieee->host_encrypt || ieee->host_decrypt ||
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 564 ieee->host_encrypt_msdu))
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 565 goto skip_host_crypt;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 566
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 567 switch (ext->alg) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 568 case IW_ENCODE_ALG_WEP:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 569 alg = "WEP";
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 570 module = "lib80211_crypt_wep";
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 571 break;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 572 case IW_ENCODE_ALG_TKIP:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 573 alg = "TKIP";
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 574 module = "lib80211_crypt_tkip";
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 575 break;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 576 case IW_ENCODE_ALG_CCMP:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 577 alg = "CCMP";
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 578 module = "lib80211_crypt_ccmp";
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 579 break;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 580 default:
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 581 LIBIPW_DEBUG_WX("%s: unknown crypto alg %d\n",
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 582 dev->name, ext->alg);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 583 ret = -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 584 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 585 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 586
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 @587 ops = lib80211_get_crypto_ops(alg);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 588 if (ops == NULL) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 589 request_module(module);
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 590 ops = lib80211_get_crypto_ops(alg);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 591 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 592 if (ops == NULL) {
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 593 LIBIPW_DEBUG_WX("%s: unknown crypto alg %d\n",
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 594 dev->name, ext->alg);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 595 ret = -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 596 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 597 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 598
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 599 if (*crypt == NULL || (*crypt)->ops != ops) {
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 600 struct lib80211_crypt_data *new_crypt;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 601
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 602 lib80211_crypt_delayed_deinit(&ieee->crypt_info, crypt);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 603
0da974f4f303a6 net/ieee80211/ieee80211_wx.c Panagiotis Issaris 2006-07-21 604 new_crypt = kzalloc(sizeof(*new_crypt), GFP_KERNEL);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 605 if (new_crypt == NULL) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 606 ret = -ENOMEM;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 607 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 608 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 609 new_crypt->ops = ops;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 610 if (new_crypt->ops && try_module_get(new_crypt->ops->owner))
6eb6edf04acd09 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-22 611 new_crypt->priv = new_crypt->ops->init(idx);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 612 if (new_crypt->priv == NULL) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 613 kfree(new_crypt);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 614 ret = -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 615 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 616 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 617 *crypt = new_crypt;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 618 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 619
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 620 if (ext->key_len > 0 && (*crypt)->ops->set_key &&
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 621 (*crypt)->ops->set_key(ext->key, ext->key_len, ext->rx_seq,
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 622 (*crypt)->priv) < 0) {
b0a4e7d8a291de drivers/net/wireless/ipw2x00/libipw_wx.c John W. Linville 2009-08-20 623 LIBIPW_DEBUG_WX("%s: key setting failed\n", dev->name);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 624 ret = -EINVAL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 625 goto done;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 626 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 627
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 628 skip_host_crypt:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 629 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
274bfb8dc5ffa1 net/ieee80211/ieee80211_wx.c John W. Linville 2008-10-29 630 ieee->crypt_info.tx_keyidx = idx;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 631 sec.active_key = idx;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 632 sec.flags |= SEC_ACTIVE_KEY;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 633 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 634
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 635 if (ext->alg != IW_ENCODE_ALG_NONE) {
260a9ad9446723 drivers/net/wireless/intel/ipw2x00/libipw_wx.c Dan Carpenter 2021-04-14 636 int key_len = clamp_val(ext->key_len, 0, SCM_KEY_LEN);
260a9ad9446723 drivers/net/wireless/intel/ipw2x00/libipw_wx.c Dan Carpenter 2021-04-14 637
260a9ad9446723 drivers/net/wireless/intel/ipw2x00/libipw_wx.c Dan Carpenter 2021-04-14 638 memcpy(sec.keys[idx], ext->key, key_len);
260a9ad9446723 drivers/net/wireless/intel/ipw2x00/libipw_wx.c Dan Carpenter 2021-04-14 639 sec.key_sizes[idx] = key_len;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 640 sec.flags |= (1 << idx);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 641 if (ext->alg == IW_ENCODE_ALG_WEP) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 642 sec.encode_alg[idx] = SEC_ALG_WEP;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 643 sec.flags |= SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 644 sec.level = SEC_LEVEL_1;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 645 } else if (ext->alg == IW_ENCODE_ALG_TKIP) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 646 sec.encode_alg[idx] = SEC_ALG_TKIP;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 647 sec.flags |= SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 648 sec.level = SEC_LEVEL_2;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 649 } else if (ext->alg == IW_ENCODE_ALG_CCMP) {
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 650 sec.encode_alg[idx] = SEC_ALG_CCMP;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 651 sec.flags |= SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 652 sec.level = SEC_LEVEL_3;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 653 }
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 654 /* Don't set sec level for group keys. */
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 655 if (group_key)
ccd0fda3a6d918 net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 656 sec.flags &= ~SEC_LEVEL;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 657 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 658 done:
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 659 if (ieee->set_security)
3fc7bc8ea792b4 drivers/net/wireless/ipw2x00/libipw_wx.c Paul Bolle 2012-09-21 660 ieee->set_security(dev, &sec);
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 661
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 662 return ret;
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 663 }
e0d369d1d969fc net/ieee80211/ieee80211_wx.c James Ketrenos 2005-09-21 664

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki