Tag: netlink

与netlink的内核空间用户空间通信

我的目标是始终在内核内存中有一个数组或列表,以便始终可以从内核空间访问它。 为此,我在这里推荐使用netlink套接字。 我按照这个示例 ,它显示了如何发送字符串。 我不确定如何在套接字中发送结构数组或结构列表。 typedef struct { int fiveDollarBills; int denDollarBills; } Bills; 是否可以使用netlink发送列表或数组?

收听PF_NETLINK套接字时获取所有链接和地址信息

我编写了一个代码安静的通知我,只要相关(对我而言)网络信息发生变化(主要是收听RTM_NEWADDR,RTM_DELADDR,RTM_NEWLINK和RTM_DELLINK。这非常好,每次我拔掉电源,更改ip或我得到通知的任何内容。唯一的问题,是我第一次启动我的代码,我希望它能给我整个当前状态(RTM_GETLINK和RTM_GETADDR)。 我可以请求RTM_GETLINK或RTM_GETADDR: memset(&req, 0, sizeof(req)); req.nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)); req.nlmsghdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; /* request to dump all kernel subsystem */ req.nlmsghdr.nlmsg_type = RTM_GETLINK; /* link information */ req.nlmsghdr.nlmsg_seq = 1; req.nlmsghdr.nlmsg_pid = pid; req.rtgenmsg.rtgen_family = AF_UNSPEC; iovec.iov_base = &req; iovec.iov_len = req.nlmsghdr.nlmsg_len; memset(&msghdr, 0, sizeof(msghdr)); msghdr.msg_iov = &iovec; msghdr.msg_iovlen = 1; msghdr.msg_name = […]

如何从strace输出中解码此信息

我写了一个小的go脚本,并使用strace通过这个脚本跟踪它,我试图使用netlink协议从内核获取审计消息,就像auditd一样。 以下是我去的脚本输出 – http://paste.ubuntu.com/8272760/ 我试图找到auditd提供给sendto函数的参数。 当我在auditd上运行strace时,我得到以下输出 sendto(3, “\20\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0”, 16, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 16 当我扫描我的go文件时,我得到以下输出。 我想解码这个陈述的第二个参数 sendto(3, “\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t”, 17, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 17 再具体一点 “\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t” 现在我想将其转换为字符串或字节数组,有没有办法将其转换为字符串或字节数组? 在我的实际go代码中,这个参数是一个字节数组。 https://github.com/mozilla/Audit-Go/blob/testing/netlink_old.go#L58

Netlink多播内核组

我试图实现的任务实际上非常简单(将字符串“TEST”多播到userland守护程序),但内核模块不能编译。 它会因错误而停止: passing argument 4 of ‘genlmsg_multicast_allns’ makes integer from pointer without a cast [enabled by default] 但它不应该只是我定义的组播组吗? 以下是“澄清”的代码: #include #include #include #include #include #include #include struct sock *nl_sk = NULL; static void daemon(void){ struct sk_buff *skb; void* msg_head; unsigned char *msg; struct genl_family my_genl_family = { .id = GENL_ID_GENERATE, .hdrsize = 0, .name = […]

netlink_kernel_create无法使用最新的Linux内核

我在编译使用netlink函数的旧kernel模块时遇到编译器错误。 int init_module() { /* Initialize the Netlink kernel interface */ nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE); if(!nl_sk) { printk(KERN_INFO “failed to initialize system (error: 1001)\n”); return -ENOMEM; } …. 以前它工作正常,但现在我收到此错误。 error: too many arguments to function ‘netlink_kernel_create’ OS信息 uname -a Linux ibrar-ahmed 3.8.0-17-generic #27-Ubuntu SMP Sun Apr 7 19:39:35 UTC 2013 x86_64 […]

使用3.X linux内核的C中的Netlink套接字

嗨,我一直在努力让Netlink套接字适用于3.2 linux内核 ,但我似乎无法弄清楚如何做到这一点。 我查看了Netlink套接字基础知识的示例,但似乎我找到的所有示例都是针对2.6内核的。 我想要找到的是如何使用Netlink套接字将信息从内核模块发送到用户模式应用程序,反之亦然? 任何帮助将不胜感激。 谢谢!

以上内核中的Python Netlink多播通信

我试图在4(4.1)以上的内核上重现先前SOpost中的示例: #include #include #include #include #include /* Protocol family, consistent in both kernel prog and user prog. */ #define MYPROTO NETLINK_USERSOCK /* Multicast group, consistent in both kernel prog and user prog. */ #define MYGRP 31 static struct sock *nl_sk = NULL; static void send_to_user(void) { struct sk_buff *skb; struct nlmsghdr *nlh; char *msg = […]

从netlink消息中提取当前路由,附加代码

我正在尝试使用netlink套接字监视路由更改,但是如何获取更新的路由地址? 码: #include #include #include #include #include #include #define ERR_RET(x) do { perror(x); return EXIT_FAILURE; } while (0); void loop (int sock) { struct sockaddr_nl nladdr; struct msghdr msg; struct iovec iov[2]; struct nlmsghdr nlh; char buffer[65536]; iov[0].iov_base = (void *)&nlh; iov[0].iov_len = sizeof(nlh); iov[1].iov_base = (void *)buffer; iov[1].iov_len = sizeof(buffer); msg.msg_name = (void *)&(nladdr); […]

通过C中的Netlink从内核到用户空间的多播

我试图编写一个使用Netlink在内核和用户空间之间进行通信的简单程序。 基本上这就是我想要实现的目标: 用户空间程序开始绑定到用户定义的多播组。 插入内核模块 内核模块向此多播组发送消息 用户空间程序接收消息 这是我的代码: ======用户空间程序====== #include #include #include #include #include #include #include #define MYPROTO NETLINK_USERSOCK #define MYMGRP 0x21 //User defined group, consistent in both kernel prog and user prog int open_netlink() { int sock = socket(AF_NETLINK,SOCK_RAW,MYPROTO); struct sockaddr_nl addr; memset((void *)&addr, 0, sizeof(addr)); if (sock<0) return sock; addr.nl_family = AF_NETLINK; addr.nl_pid = […]