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

📄 wanmain.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** wanmain.c	WAN Multiprotocol Router Module. Main code.**		This module is completely hardware-independent and provides*		the following common services for the WAN Link Drivers:*		 o WAN device managenment (registering, unregistering)*		 o Network interface management*		 o Physical connection management (dial-up, incomming calls)*		 o Logical connection management (switched virtual circuits)*		 o Protocol encapsulation/decapsulation** Author:	Gideon Hack	** Copyright:	(c) 1995-1999 Sangoma Technologies Inc.**		This program is free software; you can redistribute it and/or*		modify it under the terms of the GNU General Public License*		as published by the Free Software Foundation; either version*		2 of the License, or (at your option) any later version.* ============================================================================* Oct 01, 1999  Gideon Hack     Update for s514 PCI card* Dec 27, 1996	Gene Kozin	Initial version (based on Sangoma's WANPIPE)* Jan 16, 1997	Gene Kozin	router_devlist made public* Jan 31, 1997  Alan Cox	Hacked it about a bit for 2.1* Jun 27, 1997  Alan Cox	realigned with vendor code* Oct 15, 1997  Farhan Thawar   changed wan_encapsulate to add a pad byte of 0* Apr 20, 1998	Alan Cox	Fixed 2.1 symbols* May 17, 1998  K. Baranowski	Fixed SNAP encapsulation in wan_encapsulate* Dec 15, 1998  Arnaldo Melo    support for firmwares of up to 128000 bytes*                               check wandev->setup return value* Dec 22, 1998  Arnaldo Melo    vmalloc/vfree used in device_setup to allocate*                               kernel memory and copy configuration data to*                               kernel space (for big firmwares)* May 19, 1999  Arnaldo Melo    __init in wanrouter_init* Jun 02, 1999  Gideon Hack	Updates for Linux 2.0.X and 2.2.X kernels.	*****************************************************************************/#include <linux/version.h>#include <linux/config.h>#include <linux/stddef.h>	/* offsetof(), etc. */#include <linux/errno.h>	/* return codes */#include <linux/kernel.h>#include <linux/module.h>	/* support for loadable modules */#include <linux/malloc.h>	/* kmalloc(), kfree() */#include <linux/mm.h>		/* verify_area(), etc. */#include <linux/string.h>	/* inline mem*, str* functions */#include <linux/vmalloc.h>	/* vmalloc, vfree */#include <asm/segment.h>	/* kernel <-> user copy */#include <asm/byteorder.h>	/* htons(), etc. */#include <asm/uaccess.h>	/* copy_to/from_user */#include <linux/wanrouter.h>	/* WAN router API definitions */#include <linux/init.h>		/* __init et al. *//* * 	Defines and Macros  */#ifndef	min#define min(a,b) (((a)<(b))?(a):(b))#endif#ifndef	max#define max(a,b) (((a)>(b))?(a):(b))#endif/* * 	Function Prototypes  *//*  * 	Kernel loadable module interface. */#ifdef MODULEint init_module (void);void cleanup_module (void);#endif/*  *	WAN device IOCTL handlers  */static int device_setup(wan_device_t *wandev, wandev_conf_t *u_conf);static int device_stat(wan_device_t *wandev, wandev_stat_t *u_stat);static int device_shutdown(wan_device_t *wandev);static int device_new_if(wan_device_t *wandev, wanif_conf_t *u_conf);static int device_del_if(wan_device_t *wandev, char *u_name); /*  *	Miscellaneous  */static wan_device_t *find_device (char *name);static int delete_interface (wan_device_t *wandev, char *name, int force);/* *	Global Data */static char fullname[]		= "WAN Router";static char copyright[]		= "(c) 1995-1999 Sangoma Technologies Inc.";static char modname[]		= ROUTER_NAME;	/* short module name */wan_device_t* router_devlist 	= NULL;	/* list of registered devices */static int devcnt 		= 0;/*  *	Organize Unique Identifiers for encapsulation/decapsulation  */static unsigned char oui_ether[] = { 0x00, 0x00, 0x00 };#if 0static unsigned char oui_802_2[] = { 0x00, 0x80, 0xC2 };#endif#ifndef MODULEint __init wanrouter_init(void){	int err;	extern int wanpipe_init(void),		   cyclomx_init(void);	printk(KERN_INFO "%s v%u.%u %s\n",		fullname, ROUTER_VERSION, ROUTER_RELEASE, copyright);	err = wanrouter_proc_init();	if (err)		printk(KERN_ERR "%s: can't create entry in proc filesystem!\n",	modname);	/*	 *	Initialise compiled in boards	 */			 #ifdef CONFIG_VENDOR_SANGOMA	wanpipe_init();#endif	#ifdef CONFIG_CYCLADES_SYNC	cyclomx_init();#endif	return err;}#else/* *	Kernel Loadable Module Entry Points *//* * 	Module 'insert' entry point. * 	o print announcement * 	o initialize static data * 	o create /proc/net/router directory and static entries * * 	Return:	0	Ok *		< 0	error. * 	Context:	process */int init_module	(void){	int err;	printk(KERN_INFO "%s v%u.%u %s\n",		fullname, ROUTER_VERSION, ROUTER_RELEASE, copyright);	err = wanrouter_proc_init();	if (err) printk(KERN_ERR		"%s: can't create entry in proc filesystem!\n", modname);	return err;}/* * 	Module 'remove' entry point. * 	o delete /proc/net/router directory and static entries. */void cleanup_module (void){	wanrouter_proc_cleanup();}#endif/* * 	Kernel APIs *//* * 	Register WAN device. * 	o verify device credentials * 	o create an entry for the device in the /proc/net/router directory * 	o initialize internally maintained fields of the wan_device structure * 	o link device data space to a singly-linked list * 	o if it's the first device, then start kernel 'thread' * 	o increment module use count * * 	Return: *	0	Ok *	< 0	error. * * 	Context:	process */int register_wan_device(wan_device_t *wandev){	int err, namelen;	if ((wandev == NULL) || (wandev->magic != ROUTER_MAGIC) ||	    (wandev->name == NULL))		return -EINVAL;	namelen = strlen(wandev->name);	if (!namelen || (namelen > WAN_DRVNAME_SZ))		return -EINVAL;			if (find_device(wandev->name) != NULL)		return -EEXIST;#ifdef WANDEBUG			printk(KERN_INFO "%s: registering WAN device %s\n",		modname, wandev->name);#endif	/*	 *	Register /proc directory entry 	 */	err = wanrouter_proc_add(wandev);	if (err) {		printk(KERN_ERR			"%s: can't create /proc/net/router/%s entry!\n",			modname, wandev->name);		return err;	}	/*	 *	Initialize fields of the wan_device structure maintained by the	 *	router and update local data.	 */	 	wandev->ndev = 0;	wandev->dev  = NULL;	wandev->next = router_devlist;	router_devlist = wandev;	++devcnt;        MOD_INC_USE_COUNT;	/* prevent module from unloading */	return 0;}/* *	Unregister WAN device. *	o shut down device *	o unlink device data space from the linked list *	o delete device entry in the /proc/net/router directory *	o decrement module use count * *	Return:		0	Ok *			<0	error. *	Context:	process */int unregister_wan_device(char *name){	wan_device_t *wandev, *prev;	if (name == NULL)		return -EINVAL;	for (wandev = router_devlist, prev = NULL;		wandev && strcmp(wandev->name, name);		prev = wandev, wandev = wandev->next)		;	if (wandev == NULL)		return -ENODEV;#ifdef WANDEBUG			printk(KERN_INFO "%s: unregistering WAN device %s\n", modname, name);#endif		if (wandev->state != WAN_UNCONFIGURED) {		while(wandev->dev)			delete_interface(wandev, wandev->dev->name, 1);		if (wandev->shutdown)				wandev->shutdown(wandev);	}	if (prev)		prev->next = wandev->next;	else		router_devlist = wandev->next;	--devcnt;	wanrouter_proc_delete(wandev);        MOD_DEC_USE_COUNT;	return 0;}/* *	Encapsulate packet. * *	Return:	encapsulation header size *		< 0	- unsupported Ethertype * *	Notes: *	1. This function may be called on interrupt context. */int wanrouter_encapsulate (struct sk_buff* skb, struct net_device* dev){	int hdr_len = 0;	switch (skb->protocol)	{	case ETH_P_IP:		/* IP datagram encapsulation */		hdr_len += 1;		skb_push(skb, 1);		skb->data[0] = NLPID_IP;		break;	case ETH_P_IPX:		/* SNAP encapsulation */	case ETH_P_ARP:		hdr_len += 7;		skb_push(skb, 7);		skb->data[0] = 0;		skb->data[1] = NLPID_SNAP;		memcpy(&skb->data[2], oui_ether, sizeof(oui_ether));		*((unsigned short*)&skb->data[5]) = htons(skb->protocol);		break;	default:		/* Unknown packet type */		printk(KERN_INFO			"%s: unsupported Ethertype 0x%04X on interface %s!\n",			modname, skb->protocol, dev->name);		hdr_len = -EINVAL;	}	return hdr_len;}/* *	Decapsulate packet. * *	Return:	Ethertype (in network order) *			0	unknown encapsulation * *	Notes: *	1. This function may be called on interrupt context. */unsigned short wanrouter_type_trans (struct sk_buff* skb, struct net_device* dev){	int cnt = skb->data[0] ? 0 : 1;	/* there may be a pad present */	unsigned short ethertype;	switch (skb->data[cnt])	{	case NLPID_IP:		/* IP datagramm */		ethertype = htons(ETH_P_IP);		cnt += 1;		break;        case NLPID_SNAP:	/* SNAP encapsulation */		if (memcmp(&skb->data[cnt + 1], oui_ether, sizeof(oui_ether)))		{          		printk(KERN_INFO				"%s: unsupported SNAP OUI %02X-%02X-%02X "				"on interface %s!\n", modname,				skb->data[cnt+1], skb->data[cnt+2],				skb->data[cnt+3], dev->name);			return 0;		}			ethertype = *((unsigned short*)&skb->data[cnt+4]);		cnt += 6;		break;	/* add other protocols, e.g. CLNP, ESIS, ISIS, if needed */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -