首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程
1. 接口定义实现wpa_drivers
wpa_drivers的定义如下:
struct wpa_driver_ops *wpa_drivers[] ={
#ifdef CONFIG_DRIVER_WEXT &wpa_driver_wext_ops, // 我的系统使用的这个老的接口#endif /* CONFIG_DRIVER_WEXT */#ifdef CONFIG_DRIVER_NL80211 // 现在流行的NL80211接口 &wpa_driver_nl80211_ops,#endif /* CONFIG_DRIVER_NL80211 */#ifdef CONFIG_DRIVER_HOSTAP &wpa_driver_hostap_ops,#endif /* CONFIG_DRIVER_HOSTAP */#ifdef CONFIG_DRIVER_MADWIFI &wpa_driver_madwifi_ops,#endif /* CONFIG_DRIVER_MADWIFI */#ifdef CONFIG_DRIVER_BROADCOM &wpa_driver_broadcom_ops,#endif /* CONFIG_DRIVER_BROADCOM */#ifdef CONFIG_DRIVER_BSD &wpa_driver_bsd_ops,#endif /* CONFIG_DRIVER_BSD */#ifdef CONFIG_DRIVER_NDIS &wpa_driver_ndis_ops,#endif /* CONFIG_DRIVER_NDIS */#ifdef CONFIG_DRIVER_WIRED &wpa_driver_wired_ops,#endif /* CONFIG_DRIVER_WIRED */#ifdef CONFIG_DRIVER_TEST &wpa_driver_test_ops,#endif /* CONFIG_DRIVER_TEST */#ifdef CONFIG_DRIVER_RALINK &wpa_driver_ralink_ops,#endif /* CONFIG_DRIVER_RALINK */#ifdef CONFIG_DRIVER_OSX &wpa_driver_osx_ops,#endif /* CONFIG_DRIVER_OSX */#ifdef CONFIG_DRIVER_IPHONE &wpa_driver_iphone_ops,#endif /* CONFIG_DRIVER_IPHONE */#ifdef CONFIG_DRIVER_ROBOSWITCH &wpa_driver_roboswitch_ops,#endif /* CONFIG_DRIVER_ROBOSWITCH */#ifdef CONFIG_DRIVER_ATHEROS &wpa_driver_atheros_ops,#endif /* CONFIG_DRIVER_ATHEROS */#ifdef CONFIG_DRIVER_NONE &wpa_driver_none_ops,#endif /* CONFIG_DRIVER_NONE */ NULL};
具体选择哪一个driver,由wpa_supplicant的命令参数决定,如我的如下:
在init.myboard.rc中定义:
service wpa_supplicant /system/bin/wpa_supplicant \ -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf #-Dnl80211 -iwlan0 -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin # we will start as root and wpa_supplicant will switch to user wifi # after setting up the capabilities required for WEXT # user wifi # group wifi inet keystore class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot
static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s, const char *name){ int i; size_t len; const char *pos, *driver = name; if (wpa_s == NULL) return -1; wpa_msg(wpa_s,MSG_ERROR,"***MY_WIFI:%s,name=%s\n",__FUNCTION__,name); if (wpa_drivers[0] == NULL) { wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into " "wpa_supplicant"); return -1; } if (name == NULL) { /* default to first driver in the list */ wpa_s->driver = wpa_drivers[0]; wpa_s->global_drv_priv = wpa_s->global->drv_priv[0]; return 0; } do { pos = os_strchr(driver, ','); if (pos) len = pos - driver; else len = os_strlen(driver); for (i = 0; wpa_drivers[i]; i++) { if (os_strlen(wpa_drivers[i]->name) == len && os_strncmp(driver, wpa_drivers[i]->name, len) == 0) { wpa_s->driver = wpa_drivers[i]; // 根据name进行匹配,并最后保存到wpa_supplicant->dirver中 wpa_s->global_drv_priv = wpa_s->global->drv_priv[i]; return 0; } } driver = pos + 1; } while (pos); wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name); return -1;}
2. 接口操作函数实现
2.1 用户态实现
用户态实现的操作函数如下:
实现代码见:/external/wpa_supplicant_8/wpa_supplicant/src/drivers/driver_wext.c
const struct wpa_driver_ops wpa_driver_wext_ops = {
.name = "wext", .desc =