没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Netlink 是一种特殊的 socket,它是 Linux 所特有的,类似于 BSD 中的
AF_ROUTE 但又远比它的功能强大,目前在最新的 Linux 内核(2.6.14)中使
用 netlink 进行应用与内核通信的应用很多,包括:路由 daemon
(NETLINK_ROUTE),1-wire 子系统(NETLINK_W1),用户态 socket 协议
(NETLINK_USERSOCK),防火墙(NETLINK_FIREWALL),socket 监视
(NETLINK_INET_DIAG),netfilter 日志(NETLINK_NFLOG),ipsec 安全
策略(NETLINK_XFRM),SELinux 事件通知(NETLINK_SELINUX),iSCSI
子系统(NETLINK_ISCSI),进程审计(NETLINK_AUDIT),转发信息表查
询(NETLINK_FIB_LOOKUP),netlink
connector(NETLINK_CONNECTOR),netfilter 子系统(NETLINK_NETFILTER),
IPv6 防火墙(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),
内核事件向用户态通知(NETLINK_KOBJECT_UEVENT),通用 netlink
(NETLINK_GENERIC)。
Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态
应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要
使用专门的内核 API 来使用 netlink。
Netlink 相对于系统调用,ioctl 以及 /proc 文件系统而言具有以下优点:
1,为了使用 netlink,用户仅需要在 include/linux/netlink.h 中增加一个新类型的
netlink 协议定义即可, 如 #define NETLINK_MYTEST 17 然后,内核和用户态
应用就可以立即通过 socket API 使用该 netlink 协议类型进行数据交换。但系
统调用需要增加新的系统调用,ioctl 则需要增加设备或文件, 那需要不少代码,
proc 文件系统则需要在 /proc 下添加新的文件或目录,那将使本来就混乱的
/proc 更加混乱。
2. netlink 是一种异步通信机制,在内核与用户态应用之间传递的消息保存在
socket 缓存队列中,发送消息只是把消息保存在接收者的 socket 的接收队列,而
不需要等待接收者收到消息,但系统调用与 ioctl 则是同步通信机制,如果传递
的数据太长,将影响调度粒度。
3.使用 netlink 的内核部分可以采用模块的方式实现,使用 netlink 的应用部分
和内核部分没有编译时依赖,但系统调用就有依赖,而且新的系统调用的实现必
须静态地连接到内核中,它无法在模块中实现,使用新系统调用的应用在编译时
需要依赖内核。
4.netlink 支持多播,内核模块或应用可以把消息多播给一个 netlink 组,属于该
neilink 组的任何内核模块或应用都能接收到该消息,内核事件向用户态的通知
机制就使用了这一特性,任何对内核事件感兴趣的应用都能收到该子系统发送的
内核事件,在后面的文章中将介绍这一机制的使用。
5.内核可以使用 netlink 首先发起会话,但系统调用和 ioctl 只能由用户应用发
起调用。
6.netlink 使用标准的 socket API,因此很容易使用,但系统调用和 ioctl 则需
要专门的培训才能使用。
用户态使用 netlink
用户态应用使用标准的 socket APIs, socket(), bind(), sendmsg(), recvmsg() 和
close() 就能很容易地使用 netlink socket,查询手册页可以了解这些函数的使用
细节,本文只是讲解使用 netlink 的用户应该如何使用这些函数。注意,使用
netlink 的应用必须包含头文件 linux/netlink.h。当然 socket 需要的头文件也必
不可少,sys/socket.h。
为了创建一个 netlink socket,用户需要使用如下参数调用 socket():
socket(AF_NETLINK, SOCK_RAW, netlink_type)
第一个参数必须是 AF_NETLINK 或 PF_NETLINK,在 Linux 中,它们俩实际
为一个东西,它表示要使用 netlink,第二个参数必须是 SOCK_RAW 或
SOCK_DGRAM, 第三个参数指定 netlink 协议类型,如前面讲的用户自定义协
议类型 NETLINK_MYTEST, NETLINK_GENERIC 是一个通用的协议类型,它
是专门为用户使用的,因此,用户可以直接使用它,而不必再添加新的协议类型。
内核预定义的协议类型有:
#define NETLINK_ROUTE 0 /* Routing/device hook */
#define NETLINK_W1 1 /* 1-wire subsystem */
#define NETLINK_USERSOCK 2 /* Reserved for user mode
socket protocols */
#define NETLINK_FIREWALL 3 /* Firewalling hook */
#define NETLINK_INET_DIAG 4 /* INET socket monitoring */
#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */
#define NETLINK_XFRM 6 /* ipsec */
#define NETLINK_SELINUX 7 /* SELinux event notifications */
#define NETLINK_ISCSI 8 /* Open-iSCSI */
#define NETLINK_AUDIT 9 /* auditing */
#define NETLINK_FIB_LOOKUP 10
#define NETLINK_CONNECTOR 11
剩余14页未读,继续阅读
资源评论
G11176593
- 粉丝: 6646
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功