wpa supplicant与kernel的接口

本文详细介绍了wpa_supplicant如何通过接口与kernel进行交互,包括driver_cmd的处理、ioctl与netlink的使用,以及SCAN流程的步骤。在用户态,driver_cmd通过driver_wext_driver_cmd在wpa_supplicant中执行;在kernel态,通过ioctl和cfg80211_wext_setpriv进行操作。SCAN流程涉及wpa_supplicant、driver_wext_scan以及kernel中的mac80211_config_ops->scan等步骤。
摘要由CSDN通过智能技术生成

首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

               

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


     由上可见,我的选择是wext, 即选择了:wpa_driver_wext_ops。具体选择在以下函数中实现,并最后保存在wpa_supplicant->driver中,以供在wpa_drv_scan中使用。
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 == NULLreturn -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 = 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值