【问题标题】:how to use the libnl library to trigger nl80211 commands?如何使用libnl库触发nl80211命令?
【发布时间】:2014-02-06 11:22:41
【问题描述】:

请有人给出一个简单的例子来说明如何使用 libnl 来使用 nl80211。 我试图通过 iw 源代码,但它非常混乱。 谁能给出一个简单的程序,说明如何使用libnl触发nl80211命令,例如NL80211_CMD_GET_WIPHY。

【问题讨论】:

  • 我同意,iw 很难进入。宏很多,cmets 不多!

标签: network-programming wifi embedded-linux netlink


【解决方案1】:

这是一个非常基本的程序,发送NL80211_CMD_GET_INTERFACE,并解析出NL80211_CMD_GET_INTERFACE属性中返回的接口类型。

注意,这里几乎没有错误检查,你不应该按原样使用这个程序!几乎所有这些功能都可能失败。

#include "netlink/netlink.h"
#include "netlink/genl/genl.h"
#include "netlink/genl/ctrl.h"
#include <net/if.h>

//copy this from iw
#include "nl80211.h"

static int expectedId;

static int nlCallback(struct nl_msg* msg, void* arg)
{
    struct nlmsghdr* ret_hdr = nlmsg_hdr(msg);
    struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];

    if (ret_hdr->nlmsg_type != expectedId)
    {
        // what is this??
        return NL_STOP;
    }

    struct genlmsghdr *gnlh = (struct genlmsghdr*) nlmsg_data(ret_hdr);

    nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
              genlmsg_attrlen(gnlh, 0), NULL);

    if (tb_msg[NL80211_ATTR_IFTYPE]) {
        int type = nla_get_u32(tb_msg[NL80211_ATTR_IFTYPE]);

        printf("Type: %d", type);
    }
}

int main(int argc, char** argv)
{
    int ret;
    //allocate socket
    nl_sock* sk = nl_socket_alloc();

    //connect to generic netlink
    genl_connect(sk);

    //find the nl80211 driver ID
    expectedId = genl_ctrl_resolve(sk, "nl80211");

    //attach a callback
    nl_socket_modify_cb(sk, NL_CB_VALID, NL_CB_CUSTOM,
            nlCallback, NULL);

    //allocate a message
    nl_msg* msg = nlmsg_alloc();

    nl80211_commands cmd = NL80211_CMD_GET_INTERFACE;
    int ifIndex = if_nametoindex("wlan0");
    int flags = 0;

    // setup the message
    genlmsg_put(msg, 0, 0, expectedId, 0, flags, cmd, 0);

    //add message attributes
    NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifIndex);

    //send the messge (this frees it)
    ret = nl_send_auto_complete(sk, msg);

    //block for message to return
    nl_recvmsgs_default(sk);

    return 0;

nla_put_failure:
    nlmsg_free(msg);
    return 1;
}

【讨论】:

  • 非常感谢该程序为我提供了有关如何将 netlink 套接字用于 nl80211 命令的概述。但是如何使用 netlinks 获得扫描结果,以及我们将如何知道扫描何时结束。
  • 嗯,这是一个不同的问题,但基本上,您发送NL80211_CMD_TRIGGER_SCAN 开始扫描。如果您在一个正在运行时尝试启动另一个,这将失败。发送此信息后,当您收到NL80211_CMD_NEW_SCAN_RESULTS 时,您将等待扫描完成。然后您可以发送NL80211_CMD_GET_SCAN 命令来询问结果。每找到一个电台,您都会收到一条消息,因此请准备好处理多条消息。
  • 感谢您的帮助。我终于得到它并找到了如何扫描。我的代码现在可以正常工作并扫描所有周围的 AP。
  • 如何用g++编译? linux上需要链接什么?
  • gcc -Wall -I/usr/include/libnl3/main.c -o main -lnl-3 -lnl-genl-3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多