首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >侦听内核模块中的netlink广播

侦听内核模块中的netlink广播
EN

Stack Overflow用户
提问于 2014-12-05 18:54:13
回答 1查看 1.7K关注 0票数 3

SELinux模块向任何侦听套接字发送一个netlink广播。我想知道是否可以从另一个内核模块中收听netlink广播?

来自SELinux netlink代码:

代码语言:javascript
复制
netlink_broadcast(selnl, skb, 0, SELNLGRP_AVC, GFP_USER);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-10 16:30:51

我发现您可以通过使用常规套接字侦听netlink数据。而且,是的,这在内核空间是可能的。

基本上,您需要创建并绑定到套接字:

代码语言:javascript
复制
struct sock *sock = NULL;
struct sockaddr_nl addr = { 0 };

/* Create a netlink socket for SELinux traffic */
int rc = sock_create_kern(AF_NETLINK, SOCK_RAW, NETLINK_SELINUX,
              &ctx.sock);

if (rc)
    return rc;

addr.nl_family  = AF_NETLINK;
addr.nl_pid     = 0;
addr.nl_groups  = SELNLGRP_AVC;

rc = kernel_bind(ctx.sock, (struct sockaddr *) &addr, sizeof(addr));
if (rc)
    return rc;

/* Setup socket callback */
sock = ctx.sock->sk;
sock->sk_data_ready = netlink_data_ready;
sock->sk_allocation = GFP_KERNEL;

若要接收数据:

代码语言:javascript
复制
static void netlink_data_ready(struct sock *sk, int bytes)
{
    struct sk_buff *skb = NULL;
    struct nlmsghdr *nlh = NULL;
    int rc = 0;

    /* Receive the data packet (blocking) */
    skb = skb_recv_datagram(sk, 0, 0, &rc);
    if (rc) {
        printk(KERN_ERROR "Failed on skb_recv_datagram(). rc=%d.", -rc);
        return;
    }

    nlh = (struct nlmsghdr *) skb->data;
    if (!nlh || !NLMSG_OK(nlh, bytes)) {
        printk(KERN_ERROR "Invalid netlink header data.");
        return;
    }

    if (nlh->nlmsg_type == SELNL_MSG_POLICYLOAD ||
        nlh->nlmsg_type == SELNL_MSG_SETENFORCE) {

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

https://stackoverflow.com/questions/27322786

复制
相关文章

相似问题

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