- 浏览: 1473639 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
getelephantbyid:
make 无法通过.....
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
getelephantbyid:
patch -p1 ../php-5.4.7_thttpd-2 ...
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
zander:
zander 写道c 语言是静态类型语言还是动态类型语言阅读理 ...
什么是动态语言和静态语言? -
zander:
c 语言是静态类型语言还是动态类型语言
什么是动态语言和静态语言? -
lunajiayou:
很有道理,赞一个
跟着苍蝇会找到厕所,跟着蜜蜂会找到花朵
转载:http://blog.csdn.net/firo_baidu/article/details/6145231
放假回家的第一天,呵呵。
缅怀Stevens大师。
最好的参考资料:
1.师从互联网。
2.Linux man 命令:man netlink,man rtnetlink。
3.UNP v1第18章 。
4.http://blog.csdn.net/unbutun/archive/2010/01/10/5170059.aspx
http://en.wikipedia.org/wiki/Netlink
http://yongqig.onlyblog.com/blog2/enchen/8605.html
http://linux.chinaunix.net/techdoc/develop/2006/10/15/942169.shtml
http://yangelc.blog.sohu.com/68245920.html
http://www.chinaunix.net/jh/4/822500.html
http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs/
第一条:概述。
简单说来,linux通过Netlink机制与内核中相应的模块进行通信来掌控设备(网络方面的居多)。
man手册如是说:
Netlink is used to transfer information between kernel and userspace processes. It consists of a standard sockets-based interface for userspace processes and an internal kernel API for kernel modules. The internal kernel interface is not documented in this manual page. There is also an obsolete netlink interface via netlink character devices;this interface is not documented here and is only provided for backwards compatibility.
我翻译的:
Netlink用于在内核和用户空间的进程之间通信。Netlink机制由在用户空间的SocketAPI和内核模块的系统调用组成。手册不提及内核的系统调用接口。至于,Netlink字符设备的接口API也没说,Netlink字符设备的接口API是为了向后兼容。
另外:UNPv1第18章的路由Socket不适用于Linux,linux使用netlink机制全面代替BSD的路由套接口机制。
#define PF_ROUTE PF_NETLINK /* Alias to emulate 4.4BSD. */
题外话:什么是套接字?即IP地址和端口的组合。
第二条:Netlink套接字描述符
int sockfd = socket(AF_NETLINK, sock_type, netlink_faimly);
1.sock_type :man手册中说:Netlink is a datagram-oriented service。netlink机制是面向数据报的服务,故可以使用SOCK_RAW 和SOCK_DGRAM,不能使用SOCK_STREAM。手册中也提到:netlink机制不区分数据报(datagram)套接字和原始(raw)套 接字。
2.netlink_faimly :指定与哪个内核模块进行通信的协议,如下:
NETLINK_ROUTE:路由 daemon
Receives routing and link updates and may be used to modify the routing tables (both IPv4 and IPv6), IP addresses, link parameters, neighbor setups, queueing disciplines, traffic classes and packet classifiers (see rtnetlink(7)).
NETLINK_W1:1-wire 子系统
Messages from 1-wire subsystem.
NETLINK_USERSOCK:用户态 socket 协议
Reserved for user-mode socket protocols.
NETLINK_FIREWALL:防火墙
Transport IPv4 packets from netfilter to userspace. Used by ip_queue kernel module.
NETLINK_INET_DIAG:socket 监视
INET socket monitoring.
NETLINK_NFLOG:netfilter 日志
Netfilter/iptables ULOG.
NETLINK_XFRM:ipsec 安全策略
IPsec.
NETLINK_SELINUX:SELinux 事件通知
SELinux event notifications.
NETLINK_ISCSI:iSCSI 子系统
Open-iSCSI.
NETLINK_AUDIT:进程审计
Auditing.
NETLINK_FIB_LOOKUP:转发信息表查询
Access to FIB lookup from userspace.
第三条:Netlink 套接字地址结构
#inlcude<linux/netlink.h>
struct sockaddr_nl {//几乎和TCP里的sockaddr一样。
sa_family_t nl_family; /* 必须为AF_NETLINK或PF_NETLINK */
unsigned short nl_pad; /*保留未用,初始为0 */
__u32 nl_pid; /* port ID,*/
__u32 nl_groups; /* multicast groups mask 多播 组掩码 */
};
第四条:Netlink消息。
Netlink与内核通信的消息有两部分:首部和数据。
首先,Netlink socket 和TCP协议中接收放送数据一样,也需要首部。主要用于多路复用和多路分解,以及其它的一些控制。
struct nlmsghdr { //这个结构就是用于表示首部(头部)。
__u32 nlmsg_len; /* Length of message including header. 整个数据的大小,包括这个首部和要接收/发送的数据*/
__u16 nlmsg_type; /* Type of message content. 接收/发送数据的用途 */
__u16 nlmsg_flags; /* Additional flags. 附加标志*/
__u32 nlmsg_seq; /* Sequence number. 序列号,就是这个消息是第几个*/
__u32 nlmsg_pid; /* PID of the sending process. */
};
nlmsg_seq 和 nlmsg_pid 用于应用追踪消息,前者表示顺序号,后者为消息来源进程 ID。
如果一个消息是由多个数据报组成,也就是说这个消息有多个首部,当然每个首部后面跟着数据部分。那么除了最后数据报,每个部分的首部都要在 nlmsg_flags设置NLM_F_MULTI,最后数据报的首部nlmsg_type设置为NLMSG_DONE。这种情况多是由内核向用户空间造 成的,所以这些标志一般都是由内核赋值的我们不需要赋值,只在接收消息检测这些标志位。
nlmsg_type:取值如下:
以下四个值一般由内核设置,用于我们接收数据后,检测。
1.NLMSG_NOOP : message is to be ignored;这个消息类型表示数据内容为空,应用可以忽略该报文
2.NLMSG_ERROR:message signals an error and the payload contains an nlmsgerr structure 这个消息类型表示数据部分是一个错误信息,数据部分的结构如下
struct nlmsgerr {
int error; /* Negative errno or 0 for acknowledgements;负数表示的出错号 errno 或为 0 要求确认 acks*/
struct nlmsghdr msg; /* Message header that caused the error:造成出错的消息报头*/
};
3.NLMSG_DONE : message terminates a multipart message.在我们接收或者发送消息给内核的时候,可能一次发送多个报文,这个消息类型标志最后一个报文。
4.NLMSG_OVERRUN : Data lost。
以下是由程序员设置的,这里的是NETLINK_ROUTE协议支持的类型,至于其他协议的有待研究,每种类型对应着后面数据部分的不同承载结构。使用NETLINK_ROUTE协议时候支持的类型如下,他们都定义在linux/rtnetlink.h中:
1.Link Layer:创建,删除、获取、设置网络设备的信息:RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK,RTM_SETLINK
对应数据部分数据结构:在linux/rtnetlink.h中
struct ifinfomsg {/* struct ifinfomsg passes link level specific information, not dependent on network protocol.*/
unsigned char ifi_family;
unsigned char __ifi_pad;
unsigned short ifi_type; /* ARPHRD_* */
int ifi_index; /* Link index */
unsigned ifi_flags; /* IFF_* flags */
unsigned ifi_change; /* IFF_* change mask */
};
2.Address Settings:创建,删除、获取网络设备的IP信息:RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
对应数据部分数据结构 :在linux/if_addr.h中
struct ifaddrmsg {
__u8 ifa_family;
__u8 ifa_prefixlen; /* The prefix length */
__u8 ifa_flags; /* Flags */
__u8 ifa_scope; /* Address scope */
__u32 ifa_index; /* Link index */
};
3.Routing Tables: 创建,删除、获取网络设备的路由信息:RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
对应数据部分数据结构 :在linux/rtnetlink.h中
struct rtmsg {//Definitions used in routing table administration.
unsigned char rtm_family;/* 路由表地址族 */
unsigned char rtm_dst_len; /* 目的长度 */
unsigned char rtm_src_len; /* 源长度 */
unsigned char rtm_tos; /* TOS */
unsigned char rtm_table; /* Routing table id */ /* 路由表选取 */
unsigned char rtm_protocol; /* Routing protocol; see below *//* 路由协议 */
unsigned char rtm_scope; /* See below */
unsigned char rtm_type; /* See below */
unsigned rtm_flags;
};
4.Neighbor Cache:创建,删除、获取网络设备的相邻信息:RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
对应数据部分数据结构 :在linux/neighbour.h中
struct ndmsg {
__u8 ndm_family;
__u8 ndm_pad1;
__u16 ndm_pad2;
__s32 ndm_ifindex;
__u16 ndm_state;
__u8 ndm_flags;
__u8 ndm_type;
};
struct nda_cacheinfo {
__u32 ndm_confirmed;
__u32 ndm_used;
__u32 ndm_updated;
__u32 ndm_refcnt;
};
5.Routing Rules:创建,删除、获取路由规则信息:RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
对应数据部分数据结构 :在linux/rtnetlink.h中struct rtmsg
6.Queuing Discipline Settings:创建,删除、获取队列的原则:RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
对应数据部分数据结构 :在linux/rtnetlink.h中
struct tcmsg {//Traffic control messages.
unsigned char tcm_family;
unsigned char tcm__pad1;
unsigned short tcm__pad2;
int tcm_ifindex;
__u32 tcm_handle;
__u32 tcm_parent;
__u32 tcm_info;
};
7.Traffic Classes used with Queues:创建,删除、获取流量的类别:RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
对应数据部分数据结构 :linux/rtnetlink.h中struct tcmsg
8.Traffic filters:创建,删除、获取流量的过虑:RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
对应数据部分数据结构 : linux/rtnetlink.h中struct tcmsg
9.Others: RTM_NEWACTION , RTM_DELACTION , RTM_GETACTION , RTM_NEWPREFIX , RTM_GETPREFIX , RTM_GETMULTICAST ,
RTM_GETANYCAST ,RTM_NEWNEIGHTBL ,RTM_GETNEIGHTBL , RTM_SETNEIGHTBL
nlmsg_flags:这个成员用于控制和表示消息, 值如下:
1.Standard flag bits in nlmsg_flags
NLM_F_REQUEST Must be set on all request messages.表示消息是一个请求,所有应用首先发起的消息都应设置该标志。,这个标志可以和以下的一个标志组合
- NLM_F_ROOT 被许多 netlink 协议的各种数据获取操作使用,该标志指示被请求的数据表应当整体返回用户应用,而不是一个条目一个条目地返回。有该标志的请求通常导致响应消息设置 NLM_F_MULTI标志。注意,当设置了该标志时,请求是协议特定的,因此,需要在字段 nlmsg_type 中指定协议类型。
- NLM_F_MATCH 表示该协议特定的请求只需要一个数据子集,数据子集由指定的协议特定的过滤器来匹配。
- NLM_F_ATOMIC 返回对象表的快照
- NLM_F_DUMP 被定义为NLM_F_ROOT|NLM_F_MATCH
- NLM_F_REPLACE 用于取代在数据表中的现有条目。
- NLM_F_EXCL 用于和 CREATE 和 APPEND 配合使用,如果条目已经存在,将失败。
- NLM_F_CREAT 指示应当在指定的表中创建一个条目。
- NLM_F_APPEND 指示在表末尾添加新的条目。
NLM_F_MULTI The message is part of a multipart message terminated by NLMSG_DONE. 用于指示该消息是一个多部分消息的一部分,后续的消息可以通过宏NLMSG_NEXT来获得。
NLM_F_ACK Request for an acknowledgment on success.表示该消息是前一个请求消息的响应,顺序号与进程ID可以把请求与响应关联起来。
NLM_F_ECHO Echo this request.表示该消息是相关的一个包的回传。
2.Additional flag bits for GET requests
NLM_F_ROOT Return the complete table instead of a single entry.
NLM_F_MATCH Return all entries matching criteria(标准,要求) passed in message content. Not implemented yet.
NLM_F_ATOMIC Return an atomic snapshot of the table.
NLM_F_DUMP Convenience macro; equivalent to (NLM_F_ROOT|NLM_F_MATCH).
Note that NLM_F_ATOMIC requires the CAP_NET_ADMIN capability or an effective UID of 0.
3.Additional flag bits for NEW requests
NLM_F_REPLACE Replace existing matching object.
NLM_F_EXCL Don't replace if the object already exists.
NLM_F_CREATE Create object if it doesn't already exist.
NLM_F_APPEND Add to the end of the object list.
第五条Netlink与内核通信
发表评论
-
使用strongswan建立基于ikev2 eap-mschapv2的ipsec服务器
2017-04-17 23:14 3225sudo apt-get install strongsw ... -
使用strongswan/xl2tpd建立ipsec/l2tp服务器
2017-04-17 22:32 6180sudo apt-get install strongsw ... -
SecureFX中文件名乱码的解决
2014-08-28 03:23 3359原始贴子:https://forums.vandyke.c ... -
为Linux编译atheros ar1111(设备ID:168c:0037,AW-NB100H – AR5B225 Atheros half size)网卡驱动
2012-07-15 22:57 4626买了个zotac h61itx-a-e wifi主板,从zot ... -
PHY管理接口(MDIO)
2012-01-17 17:01 4221对吉比特以太网而言,串行通信总线称为管理数据输入输出 (MDI ... -
理解ipsec身份标识和认证选项
2012-01-11 15:42 6887This article is part of the Ide ... -
netfiletr和iptables的状态和连接跟踪机制
2012-01-11 15:38 3350Como se lleva a cabo el rastreo ... -
编译安装iw
2011-11-09 13:31 2380ubuntu安装build-essentials libnl- ... -
从ip addr add和ifconfig的区别看linux网卡ip地址的结构
2011-09-24 13:06 1692转至:http://blog.csdn.net/dog25 ... -
DLNA中的UPnP技术浅析
2011-09-22 18:39 5105说到DLNA,UPn ... -
Linux 用户态与内核态的交互——netlink 篇
2011-09-19 01:39 3540转至:http://bbs.chinaunix.net/thr ... -
netlink与rtnetlink(二)
2011-09-19 01:36 16021转至:http://blogold.chinaunix.net ... -
netlink和rtnetlink(一)
2011-09-19 01:35 5237转到:http://blogold.chinaunix.net ... -
linux notification chains
2011-08-13 00:26 1060linux内核由各个不同的子系统构成,比如网络子系统、存储 ... -
内核中的notification chain浅析
2011-08-13 00:25 1382内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些 ... -
Linux Notification chains
2011-08-13 00:24 2854Notifier是Linux 中提供一种在内核子系统 中共 ... -
printk 使用方法
2011-08-12 22:28 9894内核通过 printk() 输出的信息具有日志级别,日志级 ... -
WEXT/mac80211/nl80211/cfg80211
2011-07-29 02:32 11271Wireless-Extensions--旧的无 ... -
fedora上wpa_supplicant上网配置
2011-07-29 01:28 35451,vi /etc/sysconfig/wpa_supplic ... -
vi替换命令用法详解
2011-07-19 01:06 2206vi替换命令用法详解 : ranges /pat1/ ...
相关推荐
在不依赖udev这样的动态设备管理系统的情况下,可以通过内核与用户空间之间的通信机制——netlink来实现USB热插拔事件的处理。本文将深入探讨如何利用netlink机制实现这一功能,并获取USB设备的相关信息,如厂商编号...
标签"linux_mpls"、"mpls"和"mpls_linux"进一步强调了这个主题的核心——MPLS在Linux环境的应用。压缩包中的"www.pudn.com.txt"可能是一个文档,包含了下载链接、使用说明或其他相关信息。而"mpls-linux"可能是实际...
在这一背景下,Linux2.6内核引入了一项重大更新——全面支持IPSec协议。这标志着Linux系统在网络安全领域迈出了重要的一步,为用户提供了一个更加安全、可靠的数据传输环境。 #### Linux2.6内核IPSec支持架构解析 ...
“Linux网络协议栈——Socket入门(1)和(2)”则介绍了如何在Linux中使用Socket API进行网络编程。Socket是进程间通信的一种方式,特别是在网络环境下,它提供了标准接口供应用程序发送和接收数据。Socket API包括创建...
这个压缩包包含了针对不同操作系统——Linux、Windows和Android的驱动程序以及相关的移植方法说明文档,为开发者提供了全面的支持。 在Linux环境下,EC20R21的驱动通常是一个内核模块,需要与设备树(DTBO)或配置...
标题 "libmnl-src.zip" 暗示了一个与Linux系统相关的开源库——libmnl(Message Name Lookup)的源代码压缩包。这个库主要服务于网络编程,特别是涉及Netlink协议的时候,它提供了一种方便的方式来处理Netlink消息。...
- **Netlink**:深入探讨Netlink协议,这是用户空间与内核间通信的关键机制之一。 - **配置更改序列化**:介绍如何处理并发的配置更新请求,避免数据不一致问题。 - **第4章:通知链** - **通知链目的**:解释...
#### 二、iproute2的核心命令——ip iproute2的核心命令是`ip`。这个命令非常强大,几乎涵盖了所有与网络相关的操作。下面我们将详细介绍如何使用`ip`命令来执行常见的网络管理任务。 #### 三、iproute2的典型应用...
3. **多平台兼容性**:尽管netlink是Linux特有的,但qdevicewatcher项目通过Qt的跨平台特性,实现了在其他操作系统(如Windows和macOS)上的功能模拟。这通常需要借助于特定操作系统的API来替代netlink,例如在...
本课程旨在深入理解Linux设备模型及其应用——特别是Platform设备驱动。通过学习这些内容,开发者能够更好地理解和设计Linux系统中的设备驱动程序。了解Linux设备模型对于构建高效稳定的硬件驱动至关重要,而...
harmonyos底层是linux Doc 用于记录一些优秀的文档 epoll详细讲解: 多路复用: EPOLL 事件之 EPOLLRDHUP: 陈硕blog: Go内存分析: 蓝牙和wifi管理: ...netlink: linux: ...linux ...beacon帧字段结构——VH
\n\n在配置GPIO按钮时,利用`gpio-button-hotplug`驱动可以检测按键事件并通过netlink广播,系统会监控并执行相应脚本,例如reset或BTN_0。此外,`poll-interval`用于设置输入检测的消抖时间,`label`则关联到运行...
1. **netlink**:这是Linux内核与用户空间通信的一种机制,可以用于传递网络设备状态的变化。当设备状态改变时,内核可以通过netlink socket将消息发送到用户空间的进程。 2. **udev**:这是一个动态管理设备的系统...
它可能使用了Linux特有的API,如`inotify`或`netlink`套接字来监听网络配置文件的变化,或者通过`sysfs`接口来检测网络接口的状态。 从这些源代码文件,我们可以学习到以下知识点: 1. **网络状态监控**:如何在...
即使使用了tgid,线程组 leader(进程组长)也没有特殊待遇——只要进程还有任何任务,就认为它是活动的。 使用taskstats接口,用户空间需要打开一个unicast netlink套接字(NETLINK_GENERIC家族),然后发送命令...
在讨论 Vold 之前,我们需要先了解 Linux 内核中的设备管理器——udev。udev 是 Linux 2.6 及以上版本内核中的一个重要组成部分,用于管理和维护系统的设备文件。它取代了旧版的 devfs,成为 Linux 系统默认的设备...
《TCP/IP协议栈在Linux操作系统中的实现——基于CLICK》 TCP/IP协议栈是互联网通信的基础,它定义了一套标准的网络通信规则,使得不同设备能够有效地进行数据交换。在这个项目中,我们关注的是如何在Linux操作系统...
由于Android操作系统在其设计之初就没有完全遵循传统Linux的标准,因此,Android社区选择为Android量身定制了一套类似于udev的解决方案——Vold。Vold与udev一样,基于sysfs文件系统工作,但针对移动设备的特性进行...
因此,Android社区选择重新设计一套类似的设备管理工具——Vold。Vold同样基于sysfs文件系统,通过接收内核发出的uevent事件来管理外部存储设备的状态变化。 #### 2. Vold功能分析 Vold的主要职责包括管理USB、SD...