问题描述
请有人可以举一个简单的示例说明如何使用libnl来使用nl80211.我试图浏览iw源代码,但这非常令人困惑.谁能给出一个简单的程序来说明如何使用libnl触发nl80211命令,例如NL80211_CMD_GET_WIPHY.
Please can someone give an simple example on how to use libnl to use nl80211.I tried to go through iw source code but it is very confusing.Can any one give a simple program on how to trigger nl80211 commands such as NL80211_CMD_GET_WIPHY using the libnl.
推荐答案
这是一个非常基本的程序,它发送NL80211_CMD_GET_INTERFACE
,并解析出NL80211_CMD_GET_INTERFACE
属性中返回的接口类型.
Here is a very basic program sending a NL80211_CMD_GET_INTERFACE
, and parsing out the interface type returned in the NL80211_CMD_GET_INTERFACE
attribute.
当心,这里几乎没有错误检查,您不应原样使用任何此程序!几乎所有这些功能都会失败.
Beware, there is very little error checking here, you should not use any of this program as is! Almost all these functions can fail.
#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;
}
这篇关于如何使用libnl库触发nl80211命令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!