WPA Supplicant not able to listen to events from driver

Naveen Singh naveen at nestlabs.com
Thu Feb 5 22:22:45 EST 2015


Hi All
For my system we have cfg80211 built as loadable module. When we unload our
WLAN driver cfg80211 gets unloaded as well. After reloading the driver I
found that none of the events from driver never makes to supplicant. I see
that connect command from supplicant makes to driver but the NL_CONNECT_CMD
netlink message from the driver is dropped. On further debugging I found
that the messages are dropped in the following function sd it does not call
*do_one_broadcast*. Looks like all the previous bindings were lost. After
killing the supplicant and restarting the supplicant I can see that the
subscriptions are updated and connection succeeded.

int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32
portid,
    u32 group, gfp_t allocation,
    int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data),
    void *filter_data)
{
    struct net *net = sock_net(ssk);
    struct netlink_broadcast_data info;
    struct sock *sk;

    skb = netlink_trim(skb, allocation);

    info.exclude_sk = ssk;
    info.net = net;
    info.portid = portid;
    info.group = group;
    info.failure = 0;
    info.delivery_failure = 0;
    info.congested = 0;
    info.delivered = 0;
    info.allocation = allocation;
    info.skb = skb;
    info.skb2 = NULL;
    info.tx_filter = filter;
    info.tx_data = filter_data;

    /* While we sleep in clone, do not allow to change socket list */

    netlink_lock_table();

    sk_for_each_bound(sk, &nl_table[ssk->sk_protocol].mc_list)
        d*o_one_broadcast(sk, &info); ==> This function is not called at
all as it does not find any subscription at all. *

    consume_skb(skb);

    netlink_unlock_table();

    if (info.delivery_failure) {
        kfree_skb(info.skb2);
        return -ENOBUFS;
    }
    consume_skb(info.skb2);

    if (info.delivered) {
        if (info.congested && (allocation & __GFP_WAIT))
            yield();

My feeling is that as cfg80211 gets unloaded as well when driver is
unloaded, it loses all the subscription and hence none of the message from
driver gets ever delivered to supplicant. But what surprises me is that
although we cannot send messages from driver to supplicant it is not true
in reverse direction. Connect command from supplicant lands in driver. Has
anyone seen something similar? I have a workaround right now where i
restart the supplicant whenever i unload and load the driver. But I would
like to have a cleaner solution.


Regards
Naveen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.shmoo.com/pipermail/hostap/attachments/20150205/10a1d4aa/attachment.htm>


More information about the HostAP mailing list