`

netlink和rtnetlink(一)

 
阅读更多

转到: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);
这些宏的含义我就不多说了,大家可以man 3 netlink。这里要说的是netlink的用法,netlink的用法在初始化的时候和一般的socket相似,如下:
        #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
       用来修改和读取路由表的,这是我们后面要讨论的关键问题.
NETLINK_FIREWALL
       接收IPv4防火墙代码发送的信息。
NETLINK_ARPD
       在用户空间中管理ARP表.
NETLINK_ROUTE6
       接收和发送路由表更新.
NETLINK_IP6_FW
       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.
NETLINK_SKIP
       Reserved for ENskip.
NETLINK_USERSOCK
       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 */
       };

   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
        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.
        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就是单播。
(未完待续)
分享到:
评论

相关推荐

    netlink和Linux网络配置库Pyroute2.zip

    Pyroute2是一个纯Python编写的netlink和Linux网络配置库。这个库提供了如下模块:Netlink协议实现(RTNetlink, TaskStats等)rtnl, 网络设置 --- 地址(addresses), 路由(routes), 传输控制(traffic controls)nl80211 ...

    netlink.pdf

    netlink socekt是一种用于在内核态和用户态进程之间进行数据传输的特殊的IPC。它通过为内核模块提 供一组特殊的API,并为用户程序提供了一组标准的socket 接口的方式,实现了一种全双工的通讯连接。类似于TCP/IP中...

    内核和用户空间通信—netlink源码

    新的协议类型的选值不能和当前内核中已经定义的netlink协议类型重复。定义了基于该协议类型的消息类型,内核根据接收到消息的不同类型,进行不同的处理:IMP2_U_PID和IMP2_CLOSE分别为请求和关闭。IMP2_K_MSG代表...

    linux netlink 示例代码: 通过net link 进行 内核和用户空间的数据通讯

    内核程序源码 netlink提供了一种很好很强大的的用户与内核之间的通讯机制,本文通过静态的新增一个netlink协议类型,并使用这个新的netlink类型实现用户态和内核态的双向通讯,对linux的netlink通讯方式有了一个初步...

    linux netlink 示例代码

    netlink提供了一种很好很强大的的用户与内核之间的通讯机制,本文通过静态的新增一个netlink协议类型,并使用这个新的netlink类型实现用户态和内核态的双向通讯,对linux的netlink通讯方式有了一个初步的认识。...

    rtnetlink:软件包rtnetlink提供了对Linux rtnetlink API的低级访问。 麻省理工学院许可

    rtnetlink 软件包rtnetlink允许读取和更改内核的路由表。 网络路由,IP地址,... nlmod是一个特殊的内核模块,它允许您捕获内核内部的所有netlink(而不仅仅是rtnetlink)流量。 请注意,这可能在具有大量netlink流

    netlink内核态和用户态编程

    netlink编程,内核态和用户态编程。netlink编程,内核态和用户态编程。

    Linux下通过netlink给网卡添加和删除IP地址(keeplaived和ip命令也是通过netlink来添加删除IP的)

    Linux下通过netlink给网卡添加和删除IP地址(keeplaived和ip命令也是通过netlink来添加删除IP的)。纯C代码,gcc可直接编译,测试通过。 netlink添加IP可以让一个网卡拥有多个IP地址(可以通过ip addr命令来查看)...

    如何使用netlink获取网关MAC地址

    重点针对跨三层转发交换路由的情况下,如何通过netlink获取gateway的二层地址,将netlink的使用接口话,C语言编写

    netlink实现usb热插拔

    linux下netlink机制实现usb热插拔事件并获取诸如厂商编号、协议号等获取相关信息,在不采用udev机制的情况下,可以参考的一种实现方式

    Linux 用户空间使用Netlink监听uevent

    Linux 用户空间使用Netlink监听uevent,不是原理介绍,而是实战demo

    netlink文档资料收集

    netlink文档资料收集 netlink文档资料收集 netlink文档资料收集

    Netlink监听usb设备的插拔

    参考网络资料,整理出来的使用netlink的说明。用在linux系统下实时获得usb设备的状态的改变。

    netlink增加路由

    通过netlink增加路由条目,测试环境ubuntu 10

    Linux 用户态与内核态的交互――netlink 篇

    例如iprote2网络管理工具,它与内核的交互就全部使用了netlink,著名的内核包过滤框架Netfilter在与用户空间的通读,也在最新版本中改变为netlink,无疑,它将是Linux用户态与内核态交流的主要方法之一。它的通信...

    linux netlink

    通过netlink检测设备热插拔, gcc -o netlink_test.c netlink编译

    netlink学习文档

    netlink socekt 是一种用于在内核态和用户态进程之间进行数据传输的特殊的IPC 。它通过为内核模块提供一组特殊的API ,并为用户程序提供了一组标准的socket接口的方式,实现了一种全双工的通讯连接。

    netlink:netlink库防锈

    每个netlink协议都有一个netlink-packet-板条箱,用于提供该协议的数据包: 提供有关消息提供有关协议的消息提供有关协议的消息是所有其他netlink-packet-*包装箱的胶水。 它提供了NetlinkMessage类型,该类型表示...

    netlink:用于 go 的简单 netlink 库

    netlink 包为 go 提供了一个简单的 netlink 库。 Netlink 是 linux 中用户空间程序用来与内核通信的接口。 它可用于添加和删除接口、设置 ip 地址和路由以及配置 ipsec。 Netlink 通信需要提升权限,因此在大多数...

Global site tag (gtag.js) - Google Analytics