RTNETLINK内核与用户空间网络子系统交互机制
主要涉及net/netlink/af_netlink.c与net/core/rtnetlink.c两个主文件。内核的网络子系统定义了rtnetlink,用做和用户空间的交互,rtnetlink为AF_NETLINK协议的一个类别NETLINK_ROUTE,其它类别包括NETLINK_XFRM、NETLINK_GENERIC等。renetlink主要注册了LINK、ROUTE、ADDRESS、NEIGHOUR等相关的操作。 本文以PF_UNSPEC协议族的RTM_GETLINK为例进行介绍,首先注册rtnetlink内核套接口,主要是注册一个接收函数挂载到AF_NETLINK的处理流程中: static int __net_init rtnetlink_net_init( struct net * net) { struct netlink_kernel_cfg cfg = { .input = rtnetlink_rcv, }; sk = netlink_kernel_create(net, NETLINK_ROUTE, &cfg); } 其次,注册三个回调函数在全局的数组rtnl_msg_handlers上,其结构如下: struct rtnl_link { rtnl_doit_func doit; rtnl_dumpit_func dumpit; rtnl_calcit