代码在这里。
struct netlink_data * netlink_init(struct netlink_config *cfg)
{
struct netlink_data *netlink;
struct sockaddr_nl local;
netlink = os_zalloc(sizeof(*netlink));
if (netlink == NULL)
return NULL;
netlink->sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (netlink->sock < 0) {
wpa_printf(MSG_ERROR, "netlink: Failed to open netlink "
"socket: %s", strerror(errno));
netlink_deinit(netlink);
return NULL;
}
os_memset(&local, 0, sizeof(local));
local.nl_family = AF_NETLINK;
local.nl_groups = RTMGRP_LINK;
if (bind(netlink->sock, (struct sockaddr *) &local, sizeof(local)) < 0)
{
wpa_printf(MSG_ERROR, "netlink: Failed to bind netlink "
"socket: %s", strerror(errno));
netlink_deinit(netlink);
return NULL;
}
eloop_register_read_sock(netlink->sock, netlink_receive, netlink,
NULL);
netlink->cfg = cfg;
return netlink;
}
回调函数是 netlink_receive 。
这段代码初始化了一个netlink_data结构体,创建了一个PF_NETLINK类型的RAW套接字,用于NETLINK_ROUTE协议。它设置套接字监听RTMGRP_LINK组的消息,并使用eloop注册读事件回调netlink_receive。在遇到错误时,会进行资源清理并返回错误。
1736

被折叠的 条评论
为什么被折叠?



