- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、Netlink 介绍
前面有一篇文章其实已经介绍过 Netlink 方面的知识,还有一个内核和用户空间之间的一个交互例子,这篇文章主要是更细节和基础的知识介绍!
Netlink 是一种特殊的 socket,它是 Linux 所特有的,由于传送的消息是暂存在 socket 接收缓存中,并不被接收者立即处理,所以 netlink 是一种异步通信机制。 系统调用和 ioctl 则是同步通信机制。
用户空间进程可以通过标准 socket API 来实现消息的发送、接收,在 Linux 中,有很多用户空间和内核空间的交互都是通过 Netlink 机制完成的,在Linux3.0 的内核版本中定义了下面的 21 个用于 Netlink 通信的宏,其中默认的最大值为 32.我这里重点关注的是 IPv6 路由部分的通信过程。
在 include/linux/`netlink.h 文件中定义了下面的用于通信的宏!
#define NETLINK_ROUTE 0 /* Routing/device hook */ #define NETLINK_UNUSED 1 /* Unused number */
#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
#define
NETLINK_NETFILTER
12
/*
netfilter subsystem */
#define
NETLINK_IP6_FW
13
#define
NETLINK_DNRTMSG
14
/*
DECnet routing messages */
#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ #define NETLINK_GENERIC 16 /* leave room for NETLINK_DM (DM Events) */
#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ #define NETLINK_ECRYPTFS 19
#define NETLINK_RDMA 20
#define MAX_LINKS 32
二、Socket API
用户态可以使用标准的 socket APIs, socket(), bind(), sendmsg(), recvmsg() 和 close() 等函数就能很容易地使用 netlink socket,我们在用户空间可以直接通过socket 函数来使用Netlink 通信,例如可以通过下面的方式:
1、socket
sock = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
说明:第一个参数必须是 AF_NETLINK 或 PF_NETLINK,在 Linux 中,它们俩实际为一个东西,它表示要使用 netlink,第二个参数必须是 SOCK_RAW 或SOCK_DGRAM, 第三个参数指定 netlink 协议类型,可以是自己在 netlink.h 中定义的,也可以是内核中已经定义好的。上面的例子使用主要是路由的Netlink 协议。也可以是上面 21 中协议类型的其中之一。
NETLINK_GENERIC 是一个通用的协议类型,它是专门为用户使用的,因此, 用户可以直接使用它,而不必再添加新的协议类型。
对于每一个 netlink 协议类型,可以使用多播的概念,最多可以有 32 个多播组,每一个多播组用一个位表示,netlink 的多播特性使得发送消息给同一个组仅需要一次系统调用,因而对于需要多播消息的应用而言,大大地降低了系统调用的次数。
下面介绍一下主要的数
您可能关注的文档
最近下载
- TSZEIA 014-2023 二手手机出口质量要求.pdf VIP
- 2025年高考湖南卷物理真题 含答案.pdf VIP
- 个股动量效应的识别及“球队硬币”因子构建.pdf VIP
- 微机型母线保护分析与应用.pdf VIP
- (人教版)一年级上册科学 观察物体教案.doc VIP
- 学校EPC工程项目实施的重难点分析及对策.pdf VIP
- 典型事故五:内蒙古泰和煤焦化集团有限公司“4.8”爆炸事故.pdf VIP
- 2020款上汽通用别克君越_汽车使用手册用户操作图解驾驶车主车辆说明书电子版.pdf
- 基于新课标“教学评”一体化的小学语文教学设计与实施 培训课件.pptx
- 陶艺课程--校本特色课程-专题讲座.pptx VIP
文档评论(0)