首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libnl/ of 80211等效于iw_set_ext

libnl/ of 80211等效于iw_set_ext
EN

Stack Overflow用户
提问于 2016-10-12 18:40:19
回答 1查看 805关注 0票数 3

我开始用iwconfig/ioctl编写一段代码来处理wifi卡,因为我意识到它被压缩了,大多数应用程序都使用nl80211。我开始阅读它的源代码,但是没有文档,代码也有点复杂。我如何做简单的事情,如扫描,关闭/打开,设置卡模式使用nl80211或libnl?这就是我从iw开始的:

代码语言:javascript
复制
void set_card_mode(MODE mode, std::string ifname)
{
    int skfd = iw_sockets_open();
    struct iwreq wrq;
    wrq.u.mode = static_cast<unsigned int>(mode);
    power_interface(ifname, false);
    if(iw_set_ext(skfd, ifname.c_str(), SIOCSIWMODE, &wrq) < 0)
        throw std::runtime_error("Can set card mode");
}


MODE get_card_mode(std::string ifname)
{
    int skfd = iw_sockets_open();
    struct iwreq wrq;
    if (iw_get_ext (skfd, ifname.c_str(), SIOCGIWMODE, &wrq) >= 0)
    {
        return static_cast<MODE>(wrq.u.mode);
    }
}

是否有任何类似于iw_get_ext来设置/获取wifi接口,或者任何具有"set_mode“或"power_off”等简单函数的api?

EN

回答 1

Stack Overflow用户

发布于 2017-04-05 11:01:17

我使用netlink进行扫描,使用以下步骤

  1. 准备并执行NL80211_CMD_TRIGGER_SCAN
  2. 准备并执行NL80211_CMD_GET_SCAN 与NL80211_CMD_GET_SCAN一起注册回调。在回调中,原始数据被解析为BSS。IE被解析为。参见来自See 80211.h的NL80211_BSS_MAX,NL80211_ATTR_MAX的枚举。

在处理下一步之前,检查每个netlink调用的返回值。

代码片段:

代码语言:javascript
复制
nl_sock* socket = nl_socket_alloc();
genl_connect(socket);
struct nl_msg* msg = nlmsg_alloc();
int driverId = genl_ctrl_resolve(socket, "nl80211"); 
genlmsg_put(msg, 0, 0, driverId, 0, 0, NL80211_CMD_TRIGGER_SCAN, 0);

用以下方法取货:

代码语言:javascript
复制
genlmsg_put(msg, 0, 0, driverId, 0, NLM_F_DUMP, NL80211_CMD_GET_SCAN, 0);
nl_socket_modify_cb(socket, NL_CB_VALID, NL_CB_CUSTOM, onScanResult, null);

我的回调开始于:

代码语言:javascript
复制
struct genlmsghdr* msgHeader = (genlmsghdr*)nlmsg_data(nlmsg_hdr(msg));
struct nlattr* attributes[NL80211_ATTR_MAX + 1];
struct nlattr* bss[NL80211_BSS_MAX + 1];
if(nla_parse(attributes, NL80211_ATTR_MAX, genlmsg_attrdata(msgHeader, 0), genlmsg_attrlen(msgHeader, 0), NULL) == 0)
{
    // Read the attributes
    // and check for NL80211_ATTR_BSS != 0
}

大多数扫描结果都是我在NL80211_BSS_INFORMATION_ELEMENTS中发现的。

代码语言:javascript
复制
if (nla_parse_nested(bss, NL80211_BSS_MAX, attributes[NL80211_ATTR_BSS], bss_policy) == 0)
{ /* read the bss attributes */ }

NL80211_BSS_INFORMATION_ELEMENTSnl80211.h

但我没有检查WEP的隐私。检查WPA或WPA2很容易,因为有一个ID为48的额外IE元素(Śee IEEE 802.11,2012年,第8.4.2章,免费下载ieee侧)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40006063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档