看了一下相关的实现,总结一下,有不对的请各位指正。
我看的source是kernel 2.6.27,ifplugd-0.28。
问题1:为啥用netlink检测网线插拔只能得到RTM_NEWLINK?
问题2:如何能检测到网卡插拔的信息。
netlink实现主要是在在net/netlink/af_netlink.c下面,但是rtnetlink.c在net/core下面。还有一个netlink.h在include/net下面。
用multicast作为关键字查一下,可以发现一个函数nlmsg_multicast,他的作用是multicast a netlink message。OK,顺着这个往上找。
函数调用关系:
nlmsg_multicast
^
|
nlmsg_notify
^
|
rtnl_notify
^
|
rtmsg_ifinfo
^
|
rtnetlink_event
^
|
rtnetlink_dev_notifier
到这里再往上就是register_netdevice_notifier(&rtnetlink_dev_notifier),到了通知链注册,不用往上看了,再往上就是初始化了。
在rtnetlink_event函数中有如下处理:
switch (event) {
case NETDEV_UNREGISTER:
rtmsg_ifinfo(RTM_DELLINK, dev, ~0U)
我看的source是kernel 2.6.27,ifplugd-0.28。
问题1:为啥用netlink检测网线插拔只能得到RTM_NEWLINK?
问题2:如何能检测到网卡插拔的信息。
netlink实现主要是在在net/netlink/af_netlink.c下面,但是rtnetlink.c在net/core下面。还有一个netlink.h在include/net下面。
用multicast作为关键字查一下,可以发现一个函数nlmsg_multicast,他的作用是multicast a netlink message。OK,顺着这个往上找。
函数调用关系:
nlmsg_multicast
^
|
nlmsg_notify
^
|
rtnl_notify
^
|
rtmsg_ifinfo
^
|
rtnetlink_event
^
|
rtnetlink_dev_notifier
到这里再往上就是register_netdevice_notifier(&rtnetlink_dev_notifier),到了通知链注册,不用往上看了,再往上就是初始化了。
在rtnetlink_event函数中有如下处理:
switch (event) {
case NETDEV_UNREGISTER:
rtmsg_ifinfo(RTM_DELLINK, dev, ~0U)