标签: netlink

如何使用netlink socket与内核模块通信?

我正在尝试编写一个使用netlink与用户进程通信的linux内核模块.我正在使用netlink,因为我想要通信的用户程序只使用套接字进行通信,我无法改变它来添加ioctl()或任何东西.

问题是我无法弄清楚如何做到这一点.我用Google搜索,但我发现所有的例子都是老喜欢这一个,不再适用于当前的内核版本.我也看了这个问题,但这里的示例使用libnl进行套接字操作,但我想坚持使用标准套接字函数(定义sys/socket.h).那么有些人可以在这里指导我一些教程或指南或一些可以帮助我理解netlink的界面和用法的东西.我非常感谢一个工作示例,没什么特别的,只是一个非常基本的例子,说明如何建立从用户程序中的套接字到内核中的套接字的连接,然后将数据从用户进程发送到内核并从内核接收回来.

另请不要告诉我查看内核代码.我已经在做了,但这需要花费很多时间,而且我没有留下很多东西.

更新: 经过大量的试验和错误后,我有以下代码将消息从用户程序发送到内核,但是从内核到用户程序的消息即使用netlink_unicast()不起作用.它不仅没有工作,呼叫挂起系统,然后我必须重新启动机器.有人可以看看,告诉我我在做什么错.该netlink_unicast()调用在以下代码中进行了注释.它应该是内核到用户程序消息的未注释.

用户程序

#include <sys/socket.h>  
#include <linux/netlink.h>  
#define NETLINK_USER 31  
#define MAX_PAYLOAD 1024  /* maximum payload size*/  

struct sockaddr_nl src_addr, dest_addr;  
struct nlmsghdr *nlh = NULL;  
struct iovec iov;  
int sock_fd;  
struct msghdr msg;  

void main()  
{  
    sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_USER);  
    if(sock_fd<0)  
        return -1;  

    memset(&src_addr, 0, sizeof(src_addr));  
    src_addr.nl_family = AF_NETLINK;  
    src_addr.nl_pid = getpid();  /* self pid */  
    /* interested in group 1<<0 */  
    bind(sock_fd, …
Run Code Online (Sandbox Code Playgroud)

c linux-device-driver linux-kernel netlink

45
推荐指数
3
解决办法
6万
查看次数

使用NETLINK的VLAN信息

如何使用C中的NETLINK套接字从内核到用户空间添加和删除VLAN子接口等VLAN信息?

我在评论中提到的NETLINK man中没有做过什么研究.我添加并删除了一个VLAN子接口,并使用netlink socket程序进行监控.添加和删​​除每个接收3条消息.添加发送3个NEWLINK消息,删除发送2个NEWLINK和1个DELLINK消息.为什么会这样?

添加新的VLAN接口eth1.75:

RTM_NEWLINK Link eth2.75 Down
RTM_NEWLINK Link eth2 Up
RTM_NEWLINK Link eth2.75 Up
Run Code Online (Sandbox Code Playgroud)

删除VLAN接口eth2.75:

RTM_NEWLINK Link eth2 Up
RTM_NEWLINK Link eth2.75 Down
RTM_DELLINK eth2.75
Run Code Online (Sandbox Code Playgroud)

c linux kernel netlink vlan

13
推荐指数
1
解决办法
1071
查看次数

Docker镜像无法创建netlink句柄

任何人都可以帮助我理解下面的错误和其他喜欢它吗?我用Google搜索过,但对我的背景没有任何意义.我下载了我的Docker Image,但是容器拒绝启动.引用的名称空间并不总是26,但可以是20-29之间的任何名称.我将我的Docker容器启动到EC2实例并从AWS ECR中提取图像.无论我是重新启动实例还是重新启动docker,错误都是持久的.

docker: Error response from daemon: oci runtime error: 
container_linux.go:247: starting container process caused 
"process_linux.go:334: running prestart hook 0 caused \"error running 
hook: exit status 1, stdout: , stderr: time=\\\"2017-05-
11T21:00:18Z\\\" level=fatal msg=\\\"failed to create a netlink handle: 
failed to set into network namespace 26 while creating netlink socket: 
invalid argument\\\" \\n\"".
Run Code Online (Sandbox Code Playgroud)

netlink docker

13
推荐指数
1
解决办法
1059
查看次数

无法使用NETLINK_ROUTE通道接收从内核模块发送到用户应用程序的自定义消息

我正在使用Netlink套接字通过NETLINK_ROUTE通道从内核模块向用户空间应用程序发送有关以太网接口状态的自定义通知.我已经阅读了几篇文章和论文,但所有这些都展示了一种方法,你需要定义自己的家庭,例如标题中的NETLINK_TEST netlink.h或使用NETLINK_GENERIC.我知道使用NETLINK_ROUTE的套接字已经由内核拥有,因此无法在内核模块中创建它.我无法在用户空间中收到消息.任何指导将受到高度赞赏.所以这是两个代码:

内核模块:

#include <linux/notifier.h>
#include <asm/kdebug.h> 
#include <linux/netdevice.h>
#include <linux/inetdevice.h>
#include <linux/module.h>
#include <net/sock.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <asm/types.h>
#include <linux/skbuff.h>

MODULE_LICENSE("GPL");

int my_dev_event_handler(struct notifier_block *this, unsigned long event, void *ptr)
{
struct sk_buff *skb = NULL;
struct nlmsghdr *nlh;
int size = 0;
char buf[512];

switch (event) {
    case NETDEV_REGISTER:
            sprintf (buf, "Interface:: %s is Registered with the Notifier...", ((struct net_device *) ptr)->name);
            break;

    case NETDEV_UP:
            sprintf (buf, "Interface:: %s is Up …
Run Code Online (Sandbox Code Playgroud)

sockets linux-kernel netlink

12
推荐指数
1
解决办法
867
查看次数

netlink_kernel_create无法使用最新的Linux内核

我在编译kernel使用netlink函数的旧模块时遇到编译器错误.

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;
    }
 ....
Run Code Online (Sandbox Code Playgroud)

以前它工作正常,但现在我收到此错误.

error: too many arguments to function 'netlink_kernel_create'
Run Code Online (Sandbox Code Playgroud)

OS信息

uname -a

Linux ibrar-ahmed 3.8.0-17-generic #27-Ubuntu SMP Sun Apr 7 19:39:35 UTC 2013 x86_64  x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

c kernel netlink

11
推荐指数
2
解决办法
7492
查看次数

这个宏_IOR(MY_MACIG,0,int)是什么意思?

我正在通过ioctl示例程序来检查它与内核空间的通信方式.在程序WRITE_IOCTL中用作命令

#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)
ioctl(fd, WRITE_IOCTL, "hello world")
Run Code Online (Sandbox Code Playgroud)

我无法理解它是什么_IOW(MY_MACIG, 1, int).这是我下载程序的链接.请帮我. http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-4.html

unix linux kernel ioctl netlink

11
推荐指数
2
解决办法
2万
查看次数

用于MPLS配置的iproute2命令

试图找出如何使用iproute2来管理Linux内核4.1中的静态标签交换MPLS路由.

我知道iproute2对MPLS的支持现在可能不完整[2].

任何人都可以了解iproute2-4.1.1目前能够做些什么?

这是我到目前为止所发现的:

文档/网络/ MPLS-sysctl.txt中

/ proc/sys/net/mpls/platform_labels/proc/sys/net/mpls/conf //输入

加载mpls模块

sudo modprobe mpls_router 
Run Code Online (Sandbox Code Playgroud)

查找sysctl支持

sysctl -a --pattern mpls 
net.mpls.conf.eth0.input = 0 
net.mpls.conf.eth1.input = 0 
net.mpls.conf.lo.input = 0 
net.mpls.platform_labels = 0 
Run Code Online (Sandbox Code Playgroud)

启用mpls支持

sudo sysctl -w net.mpls.conf.eth0.input=1 
sudo sysctl -w net.mpls.conf.eth1.input=1 
sudo sysctl -w net.mpls.platform_labels=1000 
Run Code Online (Sandbox Code Playgroud)

推???(如何添加前缀到推送动作?)

sudo ip route add 1.1.1.1/32 via mpls 100/200/300 dev eth0 
Run Code Online (Sandbox Code Playgroud)

交换???(如何添加标签交换动作?)

sudo ip -f mpls route add 10 via mpls 100/200/300 dev eth0 
Run Code Online (Sandbox Code Playgroud)

弹出??? (如何添加label-pop动作?)

???

节目???(如何显示标签交换路由?)

???

有人可以帮我吗 .提前致谢.

linux routing linux-kernel netlink iproute

11
推荐指数
1
解决办法
9437
查看次数

RTNETLINK答案:没有这样的文件或目录

当我运行这个cmd时:

tc qdisc add dev eth0 root red limit 51200000 min 128000 max 512000 avpkt 1024 burst 200 ecn probability 0.5
Run Code Online (Sandbox Code Playgroud)

我明白了

RTNETLINK answers: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我已经配置了内核netfilters,以及所有的网络选项menuconfig.

我不明白为什么会出现这种错误.我正在使用iproute2-2.6.23和Fedora 8.

这在我的笔记本电脑上工作正常,但不在我的台式电脑上?

linux netlink

10
推荐指数
1
解决办法
9300
查看次数

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

我正在尝试使用netlink套接字监视路由更改,但是如何获取更新的路由地址?

码:

#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#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);
    msg.msg_namelen = sizeof(nladdr);
    msg.msg_iov = iov;
    msg.msg_iovlen = sizeof(iov)/sizeof(struct iovec);

    if ( recvmsg (sock, &msg, 0) )
    {
        if …
Run Code Online (Sandbox Code Playgroud)

c netlink

9
推荐指数
1
解决办法
9175
查看次数

是否有人使用netlink进行IPC?

我打算使用netlink进行两个用户进程之间的通信.关于netlink如此挑剔的部分原因是 - 其中一个进程的大多数处理最终将进入内核空间,并且可以按原样使用基于网络链接的通信(希望如此).

我正在采取的方法是 - 定义一个新的Generic Netlink系列(我将不得不编写一个内核模块来支持该系列 - 目前看来是这样).这很好,我正在看一些示例代码,其中内核基本上只在不同进程之间路由消息而不是真正做任何工作 - 这些消息的实际数量由进程处理.

我的问题是 - 是否有人在任何项目中以类似的方式使用netlink?此外 - 上述方法是否有意义?

我读到了有关基于netlink的DBUS的提案.但是还没有找到任何实现.这最接近我的要求.

谢谢.

linux ipc netlink

9
推荐指数
1
解决办法
1709
查看次数

标签 统计

netlink ×10

linux ×5

c ×4

kernel ×3

linux-kernel ×3

docker ×1

ioctl ×1

ipc ×1

iproute ×1

linux-device-driver ×1

routing ×1

sockets ×1

unix ×1

vlan ×1