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; }
上一篇:
Java架构师技术进阶路线图
下一篇:
个人网络安全学习路线规划