Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1743277
  • 博文数量: 143
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(143)

文章存档

2022年(3)

2021年(13)

2020年(21)

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: LINUX

2018-11-11 20:52:06

简介:本文是在上文的基础上,介绍下无线扩展socekt控制ioctl的实例。
文章基础:WIFI设备管理工具iwconfig/iwpriv及对应内核态的实现机制
一、ioctl的cmd(注意理解其中的地址大小包含关系

点击(此处)折叠或打开

  1. #define SIOCDEVPRIVATE 0x89F0//①老的无线私有ioctl:最初的iwpriv实现使用的ioctl号范围由SIOCDEVPRIVATE确定[#define SIOCDEVPRIVATE 0x89F0 /* to 89FF */];但这些ioctl被其它功能占用,支持功能有限。

  2. #define SIOCIWFIRST 0x8B00//④新的无线标准ioctl。

  3. #define SIOCGIWPRIV 0x8B0D//③用户可以使用SIOCGIWPRIV(#define SIOCGIWPRIV 0x8B0D)来获取私有ioctl的描述信息。


  4. #define SIOCIWFIRSTPRIV 0x8BE0//②新的无线私有ioctl:新ioctl范围由SIOCIWFIRSTPRIV确定;这些ioctl是特定为无线扩展使用,不用担心与其它功能冲突;SIOCIWFIRSTPRIV支持私有ioctl号为32个。

  5. #define SIOCIWLASTPRIV 0x8BFF


  6. #define SIOCIWLAST SIOCIWLASTPRIV 0x8BFF
注释:无线扩展(Wireless Extensions)就是新的无线标准ioctl+新的无线私有ioctl。
二、ioctl的cmd调用实例(有空在排版,我直接上传我排版好的txt)

点击(此处)折叠或打开

  1. //Old driver API
  2. wlanconfig ath4 list sta    IEEE80211_IOCTL_STA_INFO                                            ->    case IEEE80211_IOCTL_STA_INFO    ->    ieee80211_ioctl()                                                                    ->    ndo_do_ioctl = ieee80211_ioctl()            ->    dev->netdev_ops->ndo_do_ioctl
  3. //无线标准ioctl用户态工具对应iwconfig
  4. iwconfig ath16 txpower 15    SIOCSIWTXPOW(注意区别于SIOCSIWPOWER)()                                    ->    无                ->    static const iw_handler ieee80211_handlers[] = {...(iw_handler) ieee80211_ioctl_siwtxpow, /* SIOCSIWTXPOW */...}                    ->    dev->wireless_handlers = &ieee80211_iw_handler_def    ->    dev->wireless_handlers
  5. //无线私有ioctl用户态工具对应iwpriv
  6. iwpriv wifi0 get_country    ATH_IOCTL_GETCOUNTRY(static const struct iw_priv_args ol_ath_iw_priv_args[] = {...ATH_IOCTL_GETCOUNTRY...})    ->    case ATH_IOCTL_GETCOUNTRY    ->    static const iw_handler ol_ath_iw_priv_handlers[] = {...(iw_handler) ol_ath_iw_setcountry, /* SIOCWFIRSTPRIV+2 */...}                ->    dev->wireless_handlers = &ol_ath_iw_handler_def        ->    dev->wireless_handlers
  7. iwpriv wifi0 sync_sta        OL_ATH_PARAM_SYNC_STA(static const struct iw_priv_args ol_ath_iw_priv_args[] = {...OL_ATH_PARAM_SYNC_STA...})    ->    case OL_ATH_PARAM_SYNC_STA    ->    static const iw_handler ol_ath_iw_priv_handlers[] = {...(iw_handler) ol_ath_iw_getparam, /* SIOCWFIRSTPRIV+1 */...}    ->在其case中处理    ->    dev->wireless_handlers = &ol_ath_iw_handler_def        ->    dev->wireless_handlers
  8. iwpriv ath0 get_mode        IEEE80211_IOCTL_GETMODE(static const struct ieee80211_priv_args[] = {...IEEE80211_IOCTL_GETMODE...})        ->    case IEEE80211_IOCTL_GETMODE    ->    static const iw_handler ieee80211_priv_handlers[] = {...(iw_handler) ieee80211_ioctl_getmode, /* SIOCWFIRSTPRIV+17 */...}                ->    dev->wireless_handlers = &ieee80211_iw_handler_def    ->    dev->wireless_handlers
  9. iwpriv ath0 get_sta_count    IEEE80211_PARAM_STA_COUNT(static const struct ieee80211_priv_args[] = {...IEEE80211_PARAM_STA_COUNT...})    ->    case IEEE80211_PARAM_STA_COUNT    ->    static const iw_handler ieee80211_priv_handlers[] = {...(iw_handler) ieee80211_ioctl_getparam, /* SIOCWFIRSTPRIV+1 */...}    ->在其case中处理    ->    dev->wireless_handlers = &ieee80211_iw_handler_def    ->    dev->wireless_handlers

  10. 另外,我们研究下iwpriv工具。在iwpriv中,就巧妙利用了SIOCGIWPRIV来玩转所有私有cmd:
  11. iwpriv/iwpriv ath0        ->    print_priv_info ->    iw_get_priv_info
  12. iwpriv -a/iwpriv ath0 -a    ->    print_priv_all    ->    iw_get_priv_info
  13. iwpriv ath0 getmode        ->    set_private    ->    iw_get_priv_info//即调用iwlib.c中的iw_get_priv_info中通过ioctl(SIOCGIWPRIV)获取到私有信息,其次调用set_private_cmd中匹配到私有cmd并ioctl(私有cmd)。    ->    if (cmd == SIOCGIWPRIV && dev->wireless_handlers)//获取私有ioctl的描述信息
example.txt
阅读(4387) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~