[PATCH 1/8] wifi: wilc1000: fix incorrect type assignment sparse warning

Johannes Berg johannes at sipsolutions.net
Thu Oct 13 00:39:56 PDT 2022


On Wed, 2022-07-27 at 17:32 +0000, Ajay.Kathat at microchip.com wrote:
> 
> I think, there is an another way to handle this issue. 'key_mgmt_suite' 
> element in 'cfg80211_external_auth_params' struct should be converted to 
> '__be32' type(like below code snippet) because wpa_s expects the value 
> in big-endian format . After this change, the type case can be avoided. 
> Though I am not sure if these changes can have impact on other driver.
> 

Ugh. I think maybe it would be better to fix wpa_supplicant?

Thing is, we use the NL80211_ATTR_AKM_SUITES attribute here for it, and
even wpa_supplicant mostly uses that in host endian:

        num_suites = wpa_key_mgmt_to_suites(params->key_mgmt_suites,
                                            suites, ARRAY_SIZE(suites));
...
                 nla_put(msg, NL80211_ATTR_AKM_SUITES, num_suites * sizeof(u32),
                         suites))

with

static int wpa_key_mgmt_to_suites(unsigned int key_mgmt_suites, u32 suites[],
                                  int max_suites)
{
        int num_suites = 0;

#define __AKM(a, b) \
        if (num_suites < max_suites && \
            (key_mgmt_suites & (WPA_KEY_MGMT_ ## a))) \
                suites[num_suites++] = (RSN_AUTH_KEY_MGMT_ ## b)
        __AKM(IEEE8021X, UNSPEC_802_1X);




and also

                case WPA_KEY_MGMT_FT_FILS_SHA384:
                        mgmt = RSN_AUTH_KEY_MGMT_FT_FILS_SHA384;
                        break;
                case WPA_KEY_MGMT_PSK:
                default:
                        mgmt = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X;
                        break;
                }
                wpa_printf(MSG_DEBUG, "  * akm=0x%x", mgmt);
                if (nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, mgmt))
                        return -1;


Now those are all userspace->kernel direction, but also:


        wiphy_info_akm_suites(info, tb[NL80211_ATTR_AKM_SUITES]);

which eventually uses

static unsigned int get_akm_suites_info(struct nlattr *tb)
{
        int i, num;
        unsigned int key_mgmt = 0;
        u32 *akms;

        if (!tb)
                return 0;

        num = nla_len(tb) / sizeof(u32);
        akms = nla_data(tb);
        for (i = 0; i < num; i++) {
                switch (akms[i]) {
                case RSN_AUTH_KEY_MGMT_UNSPEC_802_1X:


so again it's in native endianness.


So IMHO

commit 5ff39c1380d9dea794c5102c0b6d11d1b1e23ad0
Author: Sunil Dutt <usdutt at codeaurora.org>
Date:   Thu Feb 1 17:01:28 2018 +0530

    SAE: Support external authentication offload for driver-SME cases


is the problem there in that it assumed big endian for a value that's
clearly not meant to be big endian. And what garbage out-of-tree drivers
do we don't know ...

Even in the kernel, we have


static int
qtnf_event_handle_external_auth(struct qtnf_vif *vif,
                                const struct qlink_event_external_auth *ev,
                                u16 len)
{
        struct cfg80211_external_auth_params auth = {0};
[...]
        auth.key_mgmt_suite = le32_to_cpu(ev->akm_suite);
[...]
        ret = cfg80211_external_auth_request(vif->netdev, &auth, GFP_KERNEL);


but maybe that was never tested?

johannes



More information about the Hostap mailing list