⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtnetlink.c

📁 一个基于linux的TCP/IP协议栈的实现
💻 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 + -