SYNOPSIS 总揽

#include <asm/types.h>

#include <sys/socket.h>

#include <linux/netlink.h>
netlink_socket = socket(PF_NETLINK, socket_type, netlink_family);

DESCRIPTION 描述

Netlink 用于在内核模块与在用户地址空间中的进程之间传递消息的。它包含了用于用户进程的基于标准套接字的接口和用于内核模块的一个内部核心 API。有关这个内部核心接口的资料没有包含在此手册页中。同样还有一个过时的通过 netlink 字符设备的接口也没有包含在此,它只是提供向下兼容特性。

Netlink 是一个面向数据包的服务。 SOCK_RAWSOCK_DGRAM 都是 socket_type 的有效值。然而 netlink 协议对数据包 datagram 和原套接字(raw sockets)并不作区分。

netlink_family 选择核心模块或 netlink 组进行通讯。现有可指定的 netlink 的种类有:

NETLINK_ROUTE
接收路由更新信息,可以用来修改 IPv4 的路由表。(参见 rtnetlink(7))。
NETLINK_FIREWALL
接收 IPv4 防火墙编码发送的数据包。
NETLINK_ARPD
用以维护用户地址空间里的 arp 表
NETLINK_ROUTE6
接收和发送 IPv6 路由表更新消息。
NETLINK_IP6_FW
接收未通过 IPv6 防火墙检查的数据包(尚未实现)
NETLINK_TAPBASE...NETLINK_TAPBASE+15
ethertap 设备实例。Ethertap 是从用户程序空间对以太网驱动程序进行仿真的“伪”网络通道设备。
NETLINK_SKIP
Enskip 的保留选项。
NETLINK_USERSOCK
为今后用户程序空间协议用保留选项。

Netlink 数据信息由具有一个或多个 nlmsghdr 数据报头及其有效数据的字节流组成。对于分成多个数据包的 Netlink 信息,数据报头中的 NLM_F_MULTI 标志位将被设置,除了最后一个包的报头具有标志 NLMSG_DONE外。 字节流应只能用标准的 NLMSG_* 宏来访问,参阅 netlink(3).

Netlink 不是可靠的协议。它只是尽可能地将信息传输到目的地,但在内存耗尽或发生其他错误时,它会丢失信息。为保证信息可靠传输,可以设置标志 NLM_F_ACK 来要求接收方确认。数据接收确认是一个 NLMSG_ERROR 数据包,包中的出错字段设置为 0。应用程序必须自己创建收到信息确认消息。在信息传送过程中,内核一直(尝试)对每个出错的数据包发送 NLMSG_ERROR 消息。用户进程也应当遵循这一个惯例。

每一个 netlink 数据类都有一个32位广播分组,当对套接字调用 bind(2) 时, sockaddr_nl 中的 nl_groups 字段设置成所要侦听的广播组的位掩码。其默认值为 0,表示不接收任何广播。

一个套接字可以对任意一个多址广播组广播消息,只要在调用 sendmsg(2) 或调用 connect(2) 时,将位掩码 nl_groups 设置成要发送消息的广播组的值就可以了。只有具有有效 uid 为 0 的用户或具有

CAP_NET_ADMIN 权限的用户才可能发送或侦听针对 netlink 多址广播组的消息。任何一个对多址广播组消息的响应需发回进程标识 pid 和广播组地址。

struct nlmsghdr
{
__u32 nlmsg_len; /* 包括报头在内的消息长度*/
__u16 nlmsg_type; /* 消息正文 */
__u16 nlmsg_flags; /* 附加标志*/
__u32 nlmsg_seq; /* 序列号*/
__u32 nlmsg_pid; /* 发送进程号 PID */
}; struct nlmsgerr
{
int error; /* 负数表示的出错号 errno 或为 0 要求确认 acks*/
struct nlmsghdr msg; /* 造成出错的消息报头*/
};

在每个 nlmsghdr 后跟随着有效数据。 nlmsg_type 可以成为标准消息的类型: NLMSG_NOOP 可以忽略的消息, NLMSG_ERROR 发出错误发生的消息,有关数据中包含一个 nlmsgerr 结构, NLMSG_DONE 一个多数据包消息结束的信息。

一个 netlink 类通常指定更多的消息类型,请参阅有关手册页,如 NETLINK_ROUTE. 中的 rtnetlink(7)

nlmsg_flags 的标准标志位
NLM_F_REQUEST: 设置全部请求消息
NLM_F_MULTI:T{  
此消息是多数据包消息之一,通过标志  
结束。  
T}  
NLM_F_ACK: 数据成功接收返回确认消息  
NLM_F_ECHO: 要求响应请求信息  
为 GET 请求设立的附加标志位
NLM_F_ROOT 返回对象表而不是单个数据项
NLM_F_MATCH 尚未实现
NLM_F_ATOMIC 返回对象表的原子快照(atomic snapshot)
NLM_F_DUMP 尚未列入文档
对新建 NEW 请求设立的附加标志位
NLM_F_REPLACE 替换现有的对象
NLM_F_EXCL 如对象已存在,不作替换
NLM_F_CREATE 创建对象,如果对象不存在
NLM_F_APPEND 对象表添加对象项

注 NLM_F_ATOMIC 要求用户有 CAP_NET_ADMIN 或超级用户权。

地址格式

sockaddr_nl 描述了在用户空间或在核心空间里一个 netlink 客户对象的数据结构。一个 sockaddr_nl 对象可以是单址广播或对一个 netlink 多址组 (nl_groups 不为 0).

struct sockaddr_nl
{
sa_family_t nl_family; /* AF_NETLINK */
unsigned short nl_pad; /* 零 */
pid_t nl_pid; /* 进程标识号pid */
__u32 nl_groups; /* 多址广播组掩码*/
};

nl_pid 是用户空间中 netlink 的进程标识号 pid,如果是在内核时此值为 0。 nl_groups 是一个代表 neltlink 组号的位掩码。

netlink, PF_NETLINK - 内核与用户之间的通讯的更多相关文章

  1. 内核通信之Netlink源码分析-用户内核通信原理

    2017-07-05 本节从一个小案例入手,结合源码分析下通过netlink进行内核和用户通信的流程. 内核端 按照传统CS模式,其实内核端可以作为是服务器端,用以接收用户的请求并作出处理,但是从ne ...

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

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

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

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

  4. Linux内核和用户空间通信之netlink

    1. netlink Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口. Netlink 是一种特殊的 socket,它 ...

  5. 内核通信之Netlink源码分析-用户内核通信原理3

    2017-07-06 上节主讲了用户层通过netlink和内核交互的详细过程,本节分析下用户层接收数据的过程…… 有了之前基础知识的介绍,用户层接收数据只涉及到一个核心调用readmsg(), 其他的 ...

  6. Linux内核态用户态相关知识 & 相互通信

    http://www.cnblogs.com/bakari/p/5520860.html 内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境. 系统调用是操作系统的最小功能 ...

  7. 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 百篇博客分析OpenHarmony源码 | v28.03

    百篇博客系列篇.本篇为: v28.xx 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当 ...

  8. Prism的IEventAggregator事件聚合器, 事件订阅发布, ViewModel之间的通讯

    WPF中时常会遇到ViewModel之间的通讯,ViewModel并不知道自己的View,但是一个View发生的更改需要通知另外一个View. 举一个例子,软件界面上有个人信息,打开一个界面更改用户的 ...

  9. Linux启动时间优化-内核和用户空间启动优化实践

    关键词:initcall.bootgraph.py.bootchartd.pybootchart等. 启动时间的优化,分为两大部分,分别是内核部分和用户空间两大部分. 从内核timestamp 0.0 ...

随机推荐

  1. logstash之OutPut插件

    output插件是经过了input,然后过滤结构化数据之后,接下来我们需要借助output传到我们想传到的地方.output相当于一个输出管道. 2.3.1: 将采集数据标准输出到控制台 配置示例: ...

  2. [Codeforce526F]:Pudding Monsters(分治)

    题目传送门 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵.唯一一个神一般存在的Administrator被消灭了,靠原本的 ...

  3. 火狐firefox进行post提交测试

    1,打开火狐浏览器,将测试url复制到地址栏.按F12,进行连接. 2,点击连接:再点击“编辑与重发” 3,请求头中加入如下一行: Content-Type: application/json; ch ...

  4. html初体验#2

    碎碎念 关于布局 css布局:横向.纵向 2019年新进展:css grid git bash 上安装 http server 目的在于不使用 file:// 打开自己写的文件,使用 http:// ...

  5. HBuilder使用逍遥Android模拟器

    Microvirt HBuilder使用逍遥Android模拟器 1.逍遥模拟器安装 地址: 点我下载 2.连接注意事项 a. 复制adb等文件 HBuilder安装目录中tools文件夹下的三个文件 ...

  6. jieba(结巴)常用方法

    python jieba库的基本使用   第一步:先安装jieba库 输入命令:pip install jieba jieba库常用函数: jieba库分词的三种模式: 1.精准模式:把文本精准地分开 ...

  7. leetcode-mid-math-371. Sum of Two Integers-NO-???

    mycode: 没思路啊...二级制四则运算不熟悉... 参考: 既然不能使用加法和减法,那么就用位操作.下面以计算5+4的例子说明如何用位操作实现加法: 1. 用二进制表示两个加数,a=5=0101 ...

  8. sklearn—支持向量机

    SVC介绍: 拟合出来的模型为一个超平面 解决与样本维数无关,适合做文本分类 解决小样本.非线性.高维 是用于分类.回归.孤立点检测的监督学习方法的集合. 优点: 有效的高维空间 维数大于样本数的时候 ...

  9. Lombok 注解简介

    Lombok @AllArgsConstructor /** * 生成一个包含所有属性的构造函数 */ @Target(ElementType.TYPE) @Retention(RetentionPo ...

  10. windows下 文件资源管理器 的操作

    alt + d 可以直接把光标移动到地址栏 shift + f10 可以触发右键, 后面就可以用键盘操作右键中的内容了 ( 如打开vscode alt + 空格 可以弹出窗口的菜单栏 ( 控制最大化 ...