WPA Supplicant not able to listen to events from driver

Arend van Spriel arend
Fri Feb 6 00:47:49 PST 2015


On 02/06/15 04:22, Naveen Singh wrote:
> Hi All
> For my system we have cfg80211 built as loadable module. When we unload
> our WLAN driver cfg80211 gets unloaded as well.

So how is your WLAN driver unloaded. When unloading cfg80211 the nl80211 
netlink family is unregistered from the kernel probably closing all 
user-space netlink sockets.

If you only 'rmmod' your WLAN driver than supplicant should be fine 
handling it as cfg80211 is not unloaded. If you use 'modprobe -r' it 
will unload dependent modules if their refcount is zero.

Regards,
Arend

> 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 <http://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
>
>
>
> _______________________________________________
> HostAP mailing list
> HostAP at lists.shmoo.com
> http://lists.shmoo.com/mailman/listinfo/hostap




More information about the Hostap mailing list