- 浏览: 1473742 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
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://blogold.chinaunix.net/u/15993/showart.php?id=89359
我们先从netlink说起,netlink其实就是一组宏,这组宏用来访问和创建netlink数据报,其实和其他套结字一样,只不过它是用来给用户进程和内核模块之间进行通信的,它的宏定义有:
#include <asm/types.h>
#include <linux/netlink.h>
int NLMSG_ALIGN(size_t len);
int NLMSG_LENGTH(size_t len);
int NLMSG_SPACE(size_t len);
void *NLMSG_DATA(struct nlmsghdr *nlh);
struct nlmsghdr *NLMSG_NEXT(struct nlmsghdr *nlh, int len);
int NLMSG_OK(struct nlmsghdr *nlh, int len);
int NLMSG_PAYLOAD(struct nlmsghdr *nlh, int len);
#include <asm/types.h>
#include <linux/netlink.h>
int NLMSG_ALIGN(size_t len);
int NLMSG_LENGTH(size_t len);
int NLMSG_SPACE(size_t len);
void *NLMSG_DATA(struct nlmsghdr *nlh);
struct nlmsghdr *NLMSG_NEXT(struct nlmsghdr *nlh, int len);
int NLMSG_OK(struct nlmsghdr *nlh, int len);
int NLMSG_PAYLOAD(struct nlmsghdr *nlh, int len);
这些宏的含义我就不多说了,大家可以man 3 netlink。这里要说的是netlink的用法,netlink的用法在初始化的时候和一般的socket相似,如下:
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
netlink_socket = socket(PF_NETLINK, socket_type, netlink_family);
socket_type为SOCK_RAW或者SOCK_DGRAM都可以,因为netlink本身是基于数据报的。
netlink_family有下面几种:
NETLINK_ROUTE
用来修改和读取路由表的,这是我们后面要讨论的关键问题.
socket_type为SOCK_RAW或者SOCK_DGRAM都可以,因为netlink本身是基于数据报的。
netlink_family有下面几种:
NETLINK_ROUTE
用来修改和读取路由表的,这是我们后面要讨论的关键问题.
NETLINK_FIREWALL
接收IPv4防火墙代码发送的信息。
接收IPv4防火墙代码发送的信息。
NETLINK_ARPD
在用户空间中管理ARP表.
在用户空间中管理ARP表.
NETLINK_ROUTE6
接收和发送路由表更新.
接收和发送路由表更新.
NETLINK_IP6_FW
to receive packets that failed the IPv6 firewall
checks (currently not implemented).
to receive packets that failed the IPv6 firewall
checks (currently not implemented).
NETLINK_TAPBASE...NETLINK_TAPBASE+15
are the instances of the ethertap device. Ethertap
is a pseudo network tunnel device that allows an
ethernet driver to be simulated from user space.
are the instances of the ethertap device. Ethertap
is a pseudo network tunnel device that allows an
ethernet driver to be simulated from user space.
NETLINK_SKIP
Reserved for ENskip.
Reserved for ENskip.
NETLINK_USERSOCK
is reserved for future user space protocols.
is reserved for future user space protocols.
Netlink消息是一个含有一个或者多个nlmsghdr头和相关载荷组成的字节流。除了最后一个nlmsghdr头的类型是NLMSG_DONE,其他的nlmsghdr头都是NLM_F_MULTI类型。这个字节流只能被上面描述过的标准NLMSG_*宏来访问。
Netlink是一个不可靠的协议。如果出现内存用尽或者其他错误,它就会丢包。如果需要可靠传输。发送者可以通过设置NLM_F_ACK标志
来向接收端要求一个ACK。一个ACK其实就是一个NLMSG_ERROR包,只不过它的error
field设置为0。应用程序需要为接收的消息自己产生ACK。内核尽力为每个失败的包产生NLMSG_ERROR消息。用户进程也要遵守这个规范。
struct nlmsghdr
{
__u32 nlmsg_len; /* Length of message including header */
__u16 nlmsg_type; /* Message content */
__u16 nlmsg_flags;/* Additional flags */
__u32 nlmsg_seq; /* Sequence number */
__u32 nlmsg_pid; /* Sending process PID */
};
{
__u32 nlmsg_len; /* Length of message including header */
__u16 nlmsg_type; /* Message content */
__u16 nlmsg_flags;/* Additional flags */
__u32 nlmsg_seq; /* Sequence number */
__u32 nlmsg_pid; /* Sending process PID */
};
struct nlmsgerr
{
int error; /* negative errno or 0 for acks. */
struct nlmsghdr msg; /* message header that caused the error */
};
nlmsg_flag的标准flag
NLM_F_REQUEST set on all request messages
NLM_F_MULTI the message is part of a multipart mes-
sage terminated by NLMSG_DONE
NLM_F_ACK reply with an acknowledgment on success
NLM_F_ECHO echo this request
NLM_F_REQUEST set on all request messages
NLM_F_MULTI the message is part of a multipart mes-
sage terminated by NLMSG_DONE
NLM_F_ACK reply with an acknowledgment on success
NLM_F_ECHO echo this request
GET请求的附加标志位
NLM_F_ROOT Return the complete table instead of a single entry.
NLM_F_MATCH Not implemented yet.
NLM_F_ATOMIC Return an atomic snapshot of the table.
NLM_F_DUMP not documented yet.
NLM_F_ROOT Return the complete table instead of a single entry.
NLM_F_MATCH Not implemented yet.
NLM_F_ATOMIC Return an atomic snapshot of the table.
NLM_F_DUMP not documented yet.
NEW请求的附加标志位
NLM_F_REPLACE Override existing 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.
sockaddr_nl结构描述了一个用户空间或者内核空间里面的netlink客户端。一个sockaddr_nl可以为单播也可以为组播。
struct sockaddr_nl
{
sa_family_t nl_family; /* AF_NETLINK */
unsigned short nl_pad; /* zero */
pid_t nl_pid; /* process pid */
__u32 nl_groups; /* multicast groups mask */
};
nl_pid是用户空间netlink的pid,如果为0,就代表是内核空间。nl_groups是一个位掩码,每个bit代表了一个组号。如果是0就是单播。
NLM_F_REPLACE Override existing 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.
sockaddr_nl结构描述了一个用户空间或者内核空间里面的netlink客户端。一个sockaddr_nl可以为单播也可以为组播。
struct sockaddr_nl
{
sa_family_t nl_family; /* AF_NETLINK */
unsigned short nl_pad; /* zero */
pid_t nl_pid; /* process pid */
__u32 nl_groups; /* multicast groups mask */
};
nl_pid是用户空间netlink的pid,如果为0,就代表是内核空间。nl_groups是一个位掩码,每个bit代表了一个组号。如果是0就是单播。
(未完待续)
发表评论
-
使用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 4222对吉比特以太网而言,串行通信总线称为管理数据输入输出 (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 2381ubuntu安装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 5107说到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 ... -
Linux——Netlink
2011-09-19 01:24 9688转载:http://blog.csdn.net/firo_ba ... -
linux notification chains
2011-08-13 00:26 1061linux内核由各个不同的子系统构成,比如网络子系统、存储 ... -
内核中的notification chain浅析
2011-08-13 00:25 1383内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些 ... -
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 2207vi替换命令用法详解 : ranges /pat1/ ...
相关推荐
Pyroute2是一个纯Python编写的netlink和Linux网络配置库。这个库提供了如下模块:Netlink协议实现(RTNetlink, TaskStats等)rtnl, 网络设置 --- 地址(addresses), 路由(routes), 传输控制(traffic controls)nl80211 ...
rtnetlink的核心是netlink套接字,它是一种特殊的socket类型,允许用户空间和内核之间传递消息。在描述中提到的"protocol independent part"指的是rtnetlink设计时考虑到了协议的独立性,意味着无论底层网络协议如何...
Netlink 是Linux内核与用户空间之间的一种通信机制,它允许用户空间程序查询和更新内核数据结构,例如网络配置信息。在这个特定的场景中,我们关注的是如何使用Netlink查询IP路由信息以及可能遇到的问题。 在...
rtnetlink 软件包rtnetlink允许读取和更改内核的路由表。 网络路由,IP地址,... nlmod是一个特殊的内核模块,它允许您捕获内核内部的所有netlink(而不仅仅是rtnetlink)流量。 请注意,这可能在具有大量netlink流
`<linux/rtnetlink.h>`头文件包含了处理路由和Netlink相关数据结构的定义。 ```c struct rtmsg { __u8 rtm_family; // 地址族,通常为AF_INET或AF_INET6 __u8 rtm_dst_len; // 目标地址长度 __u8 rtm_src_len; /...
`rtnetlink`是一种基于`netlink`机制的协议,`netlink`是Linux内核提供的一种用于进程间通信(IPC)的机制,特别适用于用户空间程序和内核模块之间的通信。`rtnetlink`主要负责处理网络相关的控制消息,如创建、删除...
每个netlink协议都有一个netlink-packet-板条箱,用于提供该协议的数据包: 提供有关消息提供有关协议的消息提供有关协议的消息是所有其他netlink-packet-*包装箱的胶水。 它提供了NetlinkMessage类型,该类型表示...
Netlink是一种用户空间和内核空间通信的机制,特别适合于网络配置和控制。对于获取IPv6地址,可以建立一个Netlink套接字,订阅`RTMGRP_IPV6_IFADDR`组来接收接口地址的变更消息。这种方法需要对Netlink协议有深入的...
Netlink是一种路由器管理协议,它为内核与用户空间应用程序之间提供了通信机制,主要用于网络设备管理和配置。具体来说,初始化Netlink套接字的代码位于`linux-2.4.22\net\core\Rtnetlink.c`文件中,这部分代码实现...
- Netlink是一种用于内核空间和用户空间之间通信的机制,主要用于传递网络设备状态等信息。 - **2.2.5 RTNetlink初始化 (Function rtnetlinkinit())** - RTNetlink是Netlink的一个子集,专门用于处理路由相关的...
2. **rtnetlink**:rtnetlink是Linux内核提供的一种用于内核和用户空间通信的机制,特别是对于网络状态变化的通知。它使用标准的socket API,支持模块化实现、异步通信和多播,是内核与用户空间进行网络事件交互的...
这段代码只是一个框架,你需要填充具体的路由消息结构和处理逻辑。在实际应用中,你可能还需要处理网络接口的获取、路由消息的编码解码以及错误处理等复杂情况。 总的来说,使用C语言在Linux下实现静态路由功能是一...
2.2.5 Function rtnetlink init() . . . . . . . . . . . . . . . . . 12 2.2.5.1 Function netlink kernel create() . . . . . . . . 13 2.2.5.2 Function register netdevice notifier() . . . . . 13 2.2.6 ...
介绍 Xenium LLMNR响应程序(xllmnrd)是一个IPv6网络服务守护程序,它响应来自同一网络链接上的Microsoft Windows计算机的名称查询,以便您无需任何...本程序是根据或任何更高版本的条款和条件提供的。 也可以看看 。