On 02/06/15 22:24, Naveen Singh wrote:
Thanks it worked. But looks like every time we load the driver, phy index kept on incrementing.
That is expected. If I recall correctly it is a static counter in cfg80211 that is used for assigning phy index upon wiphy_register call.
Regards, Arend
Regards Naveen On Fri, Feb 6, 2015 at 12:47 AM, Arend van Spriel <arend@xxxxxxxxxxxx <mailto:arend@xxxxxxxxxxxx>> wrote: 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> <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@xxxxxxxxxxxxxxx <mailto:HostAP@xxxxxxxxxxxxxxx> http://lists.shmoo.com/__mailman/listinfo/hostap <http://lists.shmoo.com/mailman/listinfo/hostap> _________________________________________________ HostAP mailing list HostAP@xxxxxxxxxxxxxxx <mailto:HostAP@xxxxxxxxxxxxxxx> http://lists.shmoo.com/__mailman/listinfo/hostap <http://lists.shmoo.com/mailman/listinfo/hostap>
-- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html