绑定NETLINK_ROUTE
协议,加入内核提供的RTMGRP_IPV4_ROUTE
广播组,接收监听路由变化消息。
使用 libnl 编写主程序,对于libnl-route
是否提供对rtmsg进行解析的API?尚未研究。本文根据上一篇文章《Netlink分层模型及消息格式 》一步一步解析netlink message。
-
创建 nl_sock
sock = nl_socket_alloc();
-
加入广播组 RTMGRP_IPV4_ROUTE
nl_join_groups(sock, RTMGRP_IPV4_ROUTE);
-
创建并绑定真实的socket
nl_connect(sock, NETLINK_ROUTE);
nl_join_groups()必须在nl_connect()之前调用,因为nl_connect()封装了socket()和bind(),而真正的加入广播组是在bind()本地地址时完成的。
-
设置回调函数callback (nlmsg处理函数)
nl_socket_modify_cb(sock, NL_CB_MSG_IN, NL_CB_CUSTOM, parse_nlmsg, NULL);
该函数会将 callback函数parse_nlmsg注册到nl_sock->s_cb->cb_set[]上 .
NL_CB_MSG_IN
表示每收到一个数据包,都会调用callback函数
NL_CB_CUSTOM
表示收到数据包后,调用用户指定的回函调用(parse_nlmsg()即这里定义的回调函数),如果使用NL_CB_DEBUG
,回调函数会设置成 nl_msg_dump(nlmsg, stdout);
(实际上是nl_msg_in_handler_debug() ) 输出数据包基本信息及原始数据。
函数原型如下
回调函数类型及含义如下
回调函数属性
nl_socket_modify_cb 最终在调用过程中的nl_cb_set函数中,有如下设置
nl_recvmsgs_default(sock);
阻塞,每到来一个消息数据包,就调用nl_sock->s_cb中注册好的callback函数。
编译上述代码,执行。用类似下面的命令增加删除路由(必须保证执行成功,即路由表变化,才能收到netlink广播消息)
route add -net 30.30.30.0 netmask 255.255.255.0 gw 20.20.20.21
route del -net 30.30.30.0 netmask 255.255.255.0 gw 20.20.20.21
https://github.com/rcatolino/nlroute-state-watch
留下评论