一、netlink机制简介

  netlink是一种基于网络的机制,允许在内核内部以及内核与用户之间进行通信。正式定义见RFC3549。手册见netlink(3)和netlink(7)。netlink(3)描述了内核中用于操作、访问、创建netlink数据报的宏。netlink(7)包含了netlink套接字的一般性信息,并给出了这里使用的数据结构的文档。

  该机制不仅仅用于网络通信,更重要的用户是通用对象类型。

  netlink机制比procfs或sysfs中文件想必有下列优势:

    1. 任何一方都不需要轮询,如果使用文件传递状态消息,那么用户层需要不断的检查是否有新消息到达。

    2. 系统调用和ioctl也能够从用户态向内核传递信息,但比简单的netlink连接更难与实现

    3. 内核可以直接向用户层发送消息,无需用户层事先请求。使用文件也可以做到,但系统调用和ioctl是不可能的。

    4. 除了简单的套接字,用户空间应用程序不需要使用其他东西来与内核交互。

二、数据结构

  指定地址

  类似于其他网络协议,每个netlink套接字都需要分配一个地址。struct sockaddr:

  

<netlink.h>

struct sockaddr_nl
{
sa_family_t nl_family; /* AF_NETLINK *//*区分内核不同部分使用各个不同的netlink通道*/
unsigned short nl_pad; /* 0 *//**/
__u32 nl_pid; /* 端口ID *//*nl_pid此类套接字唯一标示符,对内核自身来讲,该字段始终是0,用户应用程序通常使用其线程组ID,不强求,可以是任何唯一值*/
__u32 nl_groups; /* 多播组掩码 *//*nl_groups是一个位图,属于该套接字所属的多播地址,如果不允许多播,该字段为0*/
};

  消息格式

每个消息由两部分组成:首部和净荷。首部表示为struct nlmsghdr,而净荷可以是任意的。netlink消息的各部分,对齐到NLMSG_ALIGNTO(通常是4)字节边界。查询netlink(3)正确计算边界。一个消息的长度不应该超过一页,这样对内存分配的压力较小。

 <netlink.h>
struct nlmsghdr
{
__u32 nlmsg_len; /*消息长度,包含首部在内*/
__u32 nlmsg_type; /*消息内容的类型*/
__u32 nlmsg_flags; /*附加的标志*/
__u32 nlmsg_seq; /*序列号*/
__u32 nlmsg_pid; /*发送进程的端口ID*/
};

  各种标志可以保存在nlmsg_flags,所有可能的值都在netlink.h中。主要关注两个标志:如果消息包含一个请求,要求执行某个特定的操作(而不是传输一些状态信息),那么NLM_F_REQUEST将置位,而NLM_F_ACK要求在接收到上述消息并成功处理请求后发送一个确认消息。

  nlmsg_seq包含一个序列号,表示一系列消息之间在时间上的前后关系。

二、编程接口

  netlink套接字既可以从内核打开,也可以从用户层打开。前一种使用了netlink_kernel_create,在后一种情况下,将通过标准的网络编程接口出发netlink_ops的bind方法。

 net/netlink/af_netlink.c
struct sock *
netlink_kernel_create(struct net *net, int unit, unsigned int groups,
void (*input)(struct sk_buff *skb),
struct mutex *cb_mutex, struct module *module);

net表示网络命名空间,unit制定所属协议族成员,而input是一个回调函数,在数据到达该套接字将调用input。如果对input指定了NULL指针,那么套接字将只能从内核向用户层传输数据,发过来就不行了。

 kernel/audit.c

 static void audit_receive_skb(struct sk_buff *skb)
{
int err;
u32 rlen;
struct nlmsghdr *nlh; while(skb->len >= NLMSG_SPACE())
{
nlh = nlmsg_hdr(skb);
……
rlen = NLMSG_ALIGN(nlh->nlmsg_len);
……
if((err = audit_receive_msg(skb, nlh)))
{
netlink_ack(skb, nlh, err);
}
else if (nlh->nlmsg_flags & NLM_F_ACK)
netlink_ack(skb, nlh, );
skb_pull(skb, rlen);
}
}

netlink机制的更多相关文章

  1. 第十四章 netlink机制--基于Linux3.10【转】

    本文转载自:http://blog.csdn.net/shichaog/article/details/44682613 Netlink基于网络的消息机制,能够让用户和内核空间进行通信,12.3节提到 ...

  2. Linux netlink机制

    netlink 是一种特殊的 socket,它是 Linux 所特有的,类似于 BSD 中的AF_ROUTE 但又远比它的功能强大,目前在最新的 Linux 内核(2.6.14)中使用netlink ...

  3. linux用户态和内核态通信之netlink机制【转】

    本文转载自:http://blog.csdn.net/zcabcd123/article/details/8272360 这是一篇学习笔记,主要是对<Linux 系统内核空间与用户空间通信的实现 ...

  4. linux 内核与用户空间通信机制netlink初探

      1.Linux进程概述 Linux中的进程间通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上各有所不同,前者形成了运行 ...

  5. linux 内核与用户空间通信之netlink使用方法

    转自:http://blog.csdn.net/haomcu/article/details/7371835 Linux中的进程间通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&a ...

  6. Android总结的基本机制监控事件

    研究上午Android底层机制事件监视器,例如下面的摘要: 内核驱动监控硬件状态和行为,由uevent机制将事件发送到用户空间: 通过用户空间UeventObserver从内核监控uevent,处理. ...

  7. quagga源码分析--内核通信netlink

    Linux操作系统中当CPU处于内核状态时,可以分为有用户上下文的状态和执行硬件.软件中断两种.其中当处于有用户上下文时,由于内核态和用户态的内 存映射机制不同,不可直接将本地变量传给用户态的内存区: ...

  8. netlink组播的使用

    Linux的netlink机制是非常好的Linux内核与应用层进行双向交互数据的方式.其常用的单播方式可以实现内核为服务端,应用层为客户端的通信方式.如果需要实现应用层为服务端,内核为客户端的通信方式 ...

  9. 在linux系统中实现各项监控的关键技术(2)--内核态与用户态进程之间的通信netlink

    Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 ...

随机推荐

  1. CF 369C . Valera and Elections tree dfs 好题

    C. Valera and Elections   The city Valera lives in is going to hold elections to the city Parliament ...

  2. Git Step by Step

    原文地址:http://www.cnblogs.com/wilber2013/category/643754.html 1.Git简介 2.Git本地仓库 3.Git对象模型 4.探索.git目录 5 ...

  3. wcf Svcutil用法

    [转] WCF中可以使用SVCUtil.exe生成客户端代理类和配置文件 1.找到如下地址“C:\Windows\System32\cmd.exe”  命令行工具,右键以管理员身份运行(视系统是否为w ...

  4. 转载__UI之Frgment

    http://www.cnblogs.com/plokmju/p/3239265.html 前言 开门见山开篇名义,本篇博客将讲解一下Android中Fragment的内容,必要的地方会提供相应的演示 ...

  5. Axis2/c 知识点

    官网文档:  http://axis.apache.org/axis2/c/core/docs/axis2c_manual.html 从文档中可以总结出: 1. Axis2/C是一个用C语言实现的We ...

  6. mac eclipse 下安装subclipse

    参考 http://www.cnblogs.com/yinxiangpei/articles/3859057.html 推荐安装homebrew 在安装javahl时注意版本对应 http://sub ...

  7. 手动编码运行java程序

    javac Server.java 编译java文件成class java Server 运行程序

  8. 总结Ajax跨域调用问题

    原文:http://blog.csdn.net/wangxiaohu__/article/details/7294842 (一):动态脚本注入的方法.即在页面中动态生成<script>脚本 ...

  9. 表空间、Schema和用户

    源地址:http://www.cnblogs.com/kevinanni/p/3688921.html

  10. sikuli运行出现问题:Win32Util.dll: Can't load 32-bit .dll on a AMD 64 bit platform

    Win32Util.dll: Can't load 32-bit .dll on a AMD 64 bit platform 解决办法:将该工程设置成JDK为32位的 ,我设成1.6的32位不能用,因 ...