📄 rtnetlink.c
字号:
/* rtnetlink.c * linqianghe@163.com * 2006-10-30 */#include "rtnetlink.h"#include "neighbour.h"#include "log.h"#include <linux/string.h>#include <linux/netlink.h>#include <net/sock.h>static struct rtattr **rta_buf;static int myrtattr_max;struct sock *rtnl;struct rtnetlink_link * myrtnetlink_links[NPROTO];static void myrtnetlink_rcv(struct sock *sk, int len){/* unsigned int qlen = 0; do { rtnl_lock(); netlink_run_queue(sk, &qlen, &rtnetlink_rcv_msg); up(&rtnl_sem); netdev_run_todo(); } while (qlen);*/}static int myrtnetlink_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb){ return 0;}static int mydo_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg){ return 0;}static int myrtnetlink_dump_all(struct sk_buff *skb, struct netlink_callback *cb){ return 0;}static struct rtnetlink_link mylink_rtnetlink_table[RTM_NR_MSGTYPES] ={ [RTM_GETLINK - RTM_BASE] = { .dumpit = myrtnetlink_dump_ifinfo }, [RTM_SETLINK - RTM_BASE] = { .doit = mydo_setlink }, [RTM_GETADDR - RTM_BASE] = { .dumpit = myrtnetlink_dump_all }, [RTM_GETROUTE - RTM_BASE] = { .dumpit = myrtnetlink_dump_all }, [RTM_NEWNEIGH - RTM_BASE] = { .doit = myneigh_add }, [RTM_DELNEIGH - RTM_BASE] = { .doit = myneigh_delete }, [RTM_GETNEIGH - RTM_BASE] = { .dumpit = myneigh_dump_info }, [RTM_GETRULE - RTM_BASE] = { .dumpit = myrtnetlink_dump_all }, [RTM_GETNEIGHTBL - RTM_BASE] = { .dumpit = myneightbl_dump_info }, [RTM_SETNEIGHTBL - RTM_BASE] = { .doit = myneightbl_set },};static const int myrta_max[RTM_NR_FAMILIES] ={ [RTM_FAM(RTM_NEWLINK)] = IFLA_MAX, [RTM_FAM(RTM_NEWADDR)] = IFA_MAX, [RTM_FAM(RTM_NEWROUTE)] = RTA_MAX, [RTM_FAM(RTM_NEWNEIGH)] = NDA_MAX, [RTM_FAM(RTM_NEWRULE)] = RTA_MAX, [RTM_FAM(RTM_NEWQDISC)] = TCA_MAX, [RTM_FAM(RTM_NEWTCLASS)] = TCA_MAX, [RTM_FAM(RTM_NEWTFILTER)] = TCA_MAX, [RTM_FAM(RTM_NEWACTION)] = TCAA_MAX, [RTM_FAM(RTM_NEWNEIGHTBL)] = NDTA_MAX,};void __init myrtnetlink_init(void){ int i; myrtattr_max = 0; for (i = 0; i < ARRAY_SIZE( myrta_max ); i++) if( myrta_max[i] > myrtattr_max ) myrtattr_max = myrta_max[i]; rta_buf = kmalloc( myrtattr_max * sizeof(struct rtattr *), GFP_KERNEL ); if (!rta_buf) panic("rtnetlink_init: cannot allocate rta_buf\n"); rtnl = netlink_kernel_create( MY_NETLINK_ROUTE, RTNLGRP_MAX, myrtnetlink_rcv, THIS_MODULE ); if( rtnl == NULL ) panic("rtnetlink_init: cannot initialize rtnetlink\n"); netlink_set_nonroot( MY_NETLINK_ROUTE, NL_NONROOT_RECV ); myrtnetlink_links[PF_UNSPEC] = mylink_rtnetlink_table; myrtnetlink_links[PF_PACKET] = mylink_rtnetlink_table;}void __exit myrtnetlink_exit(void){ if( rtnl ) rtnl->sk_socket->ops->release( rtnl->sk_socket ); if( rta_buf ) kfree( rta_buf );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -