linux的netlink路由的使用

接着 前面写过的netlink的简单应用层与内核通信的例子来说,本篇也是总结一下网上找到的一些使用netlink来添加静态路由的一个demo来进行。

上面篇博客中有详细介绍到rtmsg的成员参数介绍,也有一系列的关于路由的内核部分的博客。

先列一下需要使用的结构体。在进行路由的操作时,netlink中要用到的是struct rtmsg,从内核读取IPV4路由表信息为例。从上面表看,nlmsg_type一定使用RTM_xxxROUTE操作,对应的是rtmsg。既然是读取,那么应该是RTM_GETROUTE了

//nlmsg_type == RTM_NEWROUTE ||  RTM_DELROUTE
structrtmsg {
unsigned char rtm_family; /* 路由表地址族 */
unsigned char rtm_dst_len; /* 目的长度 */
unsigned char rtm_src_len; /* 源长度 */ (2.4.10头文件的注释标反了?)
unsigned char rtm_tos; /* TOS */
 
unsigned char rtm_table; /* 路由表选取 */
unsigned char rtm_protocol; /* 路由协议 */
unsigned char rtm_scope;
unsigned char rtm_type;
 
unsigned int rtm_flags;
};

对于RTM_GETROUTE操作来说,我们只需指定两个成员:rtm_family:AF_INET, rtm_table: RT_TABLE_MAIN。其他成员都初始化为0即可。将这个结构体跟nlmsghdr结合起来,得到我们自己的新结构体: struct { struct nlmsghdr nl; struct rtmsg rt; }req;

//RTM_NEWLINK   RTM_DELLINK

struct ifinfomsg *ifi;
struct ifinfomsg {
    unsigned char ifi_family;
    unsigned short ifi_type;
    int ifi index;
    unsigned int ifi_flags;
    unsigned int ifi_change;
};
//RTM_NEWADDR    RTM_DELADDR

 struct ifaddrmsg *ifa;
struct rtattr {
    unsigned short rta_len;
    unsigned short rta_type;
}
经验分享 程序员 微信小程序 职场和发展