接着 前面写过的netlink的简单应用层与内核通信的例子来说,本篇也是总结一下网上找到的一些使用netlink来添加静态路由的一个demo来进行。
linux的netlink机制_言xzZ義的博客-CSDN博客
本文参考到一下博客:linux使用 netlink 添加路由简单代码_greatox的博客-CSDN博客_netlink 路由
IPv4路由数据库之Netlink接口_fanxiaoyu321的博客-CSDN博客
上面篇博客中有详细介绍到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;
}