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

📄 netlib.c

📁 vxworks源码源码解读是学习vxworks的最佳途径
💻 C
字号:
/* netLib.c - network interface library *//* Copyright 1984 - 1999 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------03o,16mar99,spm  recovered orphaned code from tor1_0_1.sens1_1 (SPR #25770)03n,14mar99,jdi  doc: removed refs to config.h and/or configAll.h (SPR 25663).03m,22sep98,n_s  fixed return value of netJobAdd.  spr # 8538.03l,05oct97,vin  added multicasting hash tbl initialization mcastHashInit.03k,26aug97,spm  removed compiler warnings (SPR #7866)03j,15jul97,spm  corrected comments for schednetisr() routine03i,01jul97,vin  added addDomain() and route_init(), made routing sockets		 scalable, fixed warnings.03h,17apr97,vin	 added mCastRouteCmdHook & mCastRouteFwdHook for scalability.03g,13apr97,rjc  added ip filter hook.03f,20jan96,vin  moved _func_remCurId[SG]et to usrNetwork.c for scalability,		 multiplexed through _netIsrMask.03d,24aug96,vin  modified schednetisr() for BSD4403e,21jul95,dzb  removed call to sockInit().03d,05may93,caf  tweaked for ansi.03c,06sep93,jcf  added prototype of netTypeAdd.03b,05sep93,jcf  initialized _func_remCurId[SG]et to decouple net from shell.03a,11aug93,jmm  Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h02z,02feb93,jdi  documentation cleanup for 5.1.02y,13nov92,dnw  added include of semLibP.h02x,18jul92,smb  Changed errno.h to errnoLib.h.02w,26may92,rrr  the tree shuffle02v,31Mar92,elh  added call to netTypeInit02u,16dec91,gae  added includes for ANSI.02t,04oct91,rrr  passed through the ansification filter                  -changed functions to ansi style		  -changed VOID to void		  -changed copyright notice02s,05apr91,jdi	 documentation -- removed header parens and x-ref numbers;		 doc review by dnw.02r,23jan91,jaa	 documentation.02q,05oct90,dnw  made schednetisr() be NOMANUAL.02p,11jul90,hjb  made ipintrPending LOCAL.  added schednetisr().02o,26jun90,jcf  added splSemInit (), and moved semMInit () to unixLib ()02n,20jun90,jcf  changed binary semaphore interface02m,20mar90,jcf  changed semaphores to binary for efficiency.		 changed netTask name to tNetTask.02l,18mar90,hjb  added code to eliminate costly netJobAdd's of ipintr ().02k,22feb90,jdi  documentation cleanup.02j,02dec88,ecs  bumped netTaskStackSize from 4000 to 10000 for SPARC.02i,28nov88,gae  moved netHelp to usrLib.c to shrink bootroms.02h,04nov88,dnw  changed JOB_RING_SIZE from 2000 to (85*sizeof(TODO_NODE))		   so that ring overflow won't cause ring to be permanently		   out of sync.02g,18aug88,gae  documentation.  removed obsolete header includes.02f,22jun88,dnw  name tweaks.02e,06jun88,dnw  changed taskSpawn/taskCreate args.02d,30may88,dnw  changed to v4 names.02c,28may88,dnw  removed if{config,broadcast,netmask} to ifLib.		 deleted obsolete netGetInetAddr.		 removed mbufStat to uipc_mbuf.		 moved setNetStatus here from sockLib.		 changed call to fioStdIn to STD_IN.02b,05mar88,jcf  changed semaphore calls for new semLib.02a,22feb88,jcf  made kernel independent.01v,16feb88,rdc  added ifnetmask.01u,05jan88,rdc  added include of systm.h01t,23nov87,ecs  lint.01s,20nov87,jcf  added vxAddRebootRtn call in netStart.	   +gae  spawned netd with 0 args to look nice.01r,18nov87,ecs  documentation.01q,17nov87,ecs  lint: added include of inetLib.h.01p,11nov87,jlf  documentation01o,08nov87,dnw  updated and expanded nethelp.01n,01nov87,llk  removed addRoute(), addNetRoute(), deleteRoute().		 moved inet_lnaof() to inetLib.c.		 changed remInetAddr() calls to UNIX compatible inet_addr().		 changed filbuf(0) calls to bzero().		 added netGetInetAddr().		 moved nethelp() here from remLib.c.01m,02may87,dnw  removed unnecessary includes.		 removed initialization of obsolete "hz".		 moved call to ifinit() to netStart() from usrConfig.c.01l,04apr87,jlf  documentation fix.01k,03apr87,llk  documentation.01j,02apr87,jlf  more delinting. grrrrrr.01i,01apr87,jlf  more documentation.		 delinted.	    ecs  added include of strLib.h.01h,26mar87,rdc  added addNetRoute().01g,23mar87,jlf  documentation.01f,27feb87,dnw  changed to spawn netd UNBREAKABLE.01e,10dec86,dnw  reduced TO_DO_RING_SIZE from 10000 to 2000.01d,19nov86,llk  made netd unbreakable.01c,08nov86,dnw  changed netd to perform all actions at splnet().		 changed to spawn netd at "netPriority" level,		   and let spawn choose task id (saved in netdId).		 fixed bug of trying to report error with interrupts		   disabled.01b,06nov86,rdc  ifconfig and the routing stuff had some unclosed sockets.01a,28jul86,rdc  written.*//*DESCRIPTIONThis library contains the network task that runs low-level networkinterface routines in a task context.  The network task executes andremoves routines that were added to the job queue.  This facility is usedby network interfaces in order to have interrupt-level processing attask level.The routine netLibInit() initializes the network and spawns the networktask netTask().  This is done automatically when the configurationmacro INCLUDE_NETWORK is defined.The routine netHelp() in usrLib displays a summary of the network facilitiesavailable from the VxWorks shell.INCLUDE FILES: netLib.hSEE ALSO: routeLib, hostLib, netDrv, netHelp(),.pG "Network"*/#include "vxWorks.h"#include "rngLib.h"#include "semLib.h"#include "taskLib.h"#include "errnoLib.h"#include "rebootLib.h"#include "sys/socket.h"#include "sockLib.h"#include "logLib.h"#include "intLib.h"#include "netLib.h"#include "remLib.h"#include "net/mbuf.h"#include "net/if_subr.h"#include "net/unixLib.h"#include "net/domain.h"#include "net/route.h"#include "private/semLibP.h"#include "private/funcBindP.h"#include "netinet/if_ether.h"#include "netinet/ip.h"#include "netinet/ip_var.h"IMPORT void ifreset ();IMPORT struct domain inetdomain; 		/* in netinet/in_proto.c */IMPORT void splSemInit (void); 			/* in netinet/unixLib.c */IMPORT void mbinit (void); 			/* in netinet/uipc_mbuf.c */IMPORT void mcastHashInit (void); 		/* initialize mcast hsh tbl */typedef struct    {    FUNCPTR routine;	/* routine to be called */    int param1;		/* arg to routine */    int param2;    int param3;    int param4;    int param5;    } TODO_NODE;#define JOB_RING_SIZE (85 * sizeof (TODO_NODE))/* local variables */LOCAL SEMAPHORE netTaskSem;		/* netTask work-to-do sync-semaphore */LOCAL RING_ID   netJobRing;		/* ring buffer of net jobs to do */LOCAL int	_netIsrMask = 0; 	/* network interrupt service mask *//* global variables */SEM_ID netTaskSemId = &netTaskSem;int netTaskId;int netTaskPriority  = 50;int netTaskOptions   = VX_SUPERVISOR_MODE | VX_UNBREAKABLE;int netTaskStackSize = 10000;int _protoSwIndex    = 0; 	/* index for number of protocols initialized *//* various netinet wrs internal hooks added for scalability */VOIDFUNCPTR 	_igmpJoinGrpHook  	= NULL;	/* igmp join Hook */VOIDFUNCPTR 	_igmpLeaveGrpHook 	= NULL;	/* igmp leave Hook */VOIDFUNCPTR 	_icmpErrorHook		= NULL;	/* icmp error Hook */FUNCPTR     	_ipFilterHook		= NULL; /* ip filter/firewall Hook */FUNCPTR  	_mCastRouteCmdHook	= NULL;	/* mcast route command hook */FUNCPTR 	_mCastRouteFwdHook	= NULL;	/* mcast forwarding hook */VOIDFUNCPTR	_rtMissMsgHook		= NULL; /* route miss message hook */VOIDFUNCPTR	_rtIfaceMsgHook		= NULL; /* netwk interface msg hook */VOIDFUNCPTR	_rtNewAddrMsgHook	= NULL; /* new address msg hook *//********************************************************************************* netLibInit - initialize the network package** This creates the network task job* queue, and spawns the network task netTask().  It should be called once to* initialize the network.  This is done automatically when the* configuration macro INCLUDE_NETWORK is defined.** RETURNS: OK, or ERROR if network support cannot be initialized.** SEE ALSO: usrConfig, netTask()*/STATUS netLibInit (void)    {    static BOOL done = FALSE;    if (done)	return (netTaskId == ERROR ? ERROR : OK);    done = TRUE;    if ((netJobRing = rngCreate (JOB_RING_SIZE)) == (RING_ID) NULL)	panic ("netLibInit: couldn't create job ring\n");    if (rebootHookAdd ((FUNCPTR) ifreset) == ERROR)	logMsg ("netLibInit: unable to add reset hook\n", 0, 0, 0, 0, 0, 0);    semBInit (netTaskSemId, SEM_Q_PRIORITY, SEM_EMPTY);    splSemInit ();			/* initialize spl semaphore */    mbinit ();				/* network buffer initialization */    ifinit ();				/* generic interface initialization */    addDomain (&inetdomain); 		/* add the internet domain */        domaininit ();			/* intialize all domains */        route_init (); 			/* routing table intialization */    mcastHashInit ();	 		/* defined in in.c */        netTypeInit ();			/* initialize netTypes */    netTaskId = taskSpawn ("tNetTask", netTaskPriority,		           netTaskOptions, netTaskStackSize,			   (FUNCPTR) netTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);    return (netTaskId == ERROR ? ERROR : OK);    }/********************************************************************************* netTask - network task entry point** This routine is the VxWorks network support task.  Most of the VxWorks* network runs in this task's context.** NOTE* To prevent an application task from monopolizing the CPU if it is* in an infinite loop or is never blocked, the priority of netTask()* relative to an application may need to be adjusted.  Network communication* may be lost if netTask() is "starved" of CPU time.  The default task* priority of netTask() is 50.  Use taskPrioritySet() to change the priority* of a task.** This task is spawned by netLibInit().** RETURNS: N/A** SEE ALSO: netLibInit()** INTERNAL* netTask() reads messages from a ring buffer which is filled by calling* netJobAdd().*/void netTask (void)    {    TODO_NODE 	jobNode;    int 	s;    FOREVER	{	/* wait for somebody to wake us up */	semTake (netTaskSemId, WAIT_FOREVER);	/* process requests in the toDo list */	while (rngIsEmpty (netJobRing) == FALSE)	    {	    if (rngBufGet (netJobRing, (char *) &jobNode,			   sizeof (jobNode)) != sizeof (jobNode))		{		panic ("netTask: netJobRing overflow!\n");		}	    s = splnet ();	    (*(jobNode.routine)) (jobNode.param1, jobNode.param2,				  jobNode.param3, jobNode.param4,				  jobNode.param5);	    splx (s);	    }	/* 	 * a hack to eliminate costly netJobAdd's for ipintr () routine	 * Since there are only two protocols supported currently it is 	 * faster with if statements 	 */	s = splnet (); 			/* check if this is needed XXX vin*/	if (_netIsrMask & IP_INTR_MASK)	    {	    ipintr (); 				/* service IP interrupt */	    _netIsrMask &= ~IP_INTR_MASK; 	    }	if (_netIsrMask & ARP_INTR_MASK)	    {	    arpintr (); 			/* service ARP interrupt */	    _netIsrMask &= ~ARP_INTR_MASK; 	    }	splx (s); 	}    }/********************************************************************************* netJobAdd - add a routine to the network task job queue** This function allows a routine and up to 5 parameters,* to be added to the network job queue.* Only network interfaces should use this function, usually* to have their interrupt level processing done at task level.** RETURNS: OK or ERROR** NOMANUAL*/STATUS netJobAdd    (    FUNCPTR routine,    int param1,    int param2,    int param3,    int param4,    int param5    )    {    FAST int oldlevel;    TODO_NODE newNode;    BOOL ok;    newNode.routine = routine;    newNode.param1 = param1;    newNode.param2 = param2;    newNode.param3 = param3;    newNode.param4 = param4;    newNode.param5 = param5;    oldlevel = intLock ();    ok = rngBufPut (netJobRing, (char *) &newNode, sizeof (newNode)) ==							sizeof (newNode);    intUnlock (oldlevel);    if (!ok)	{	panic ("netJobAdd: ring buffer overflow!\n");	return (ERROR);	}    /* wake up the network daemon to process the request */    semGive (netTaskSemId);    return (OK);    }/********************************************************************************* netErrnoSet - set network error status** netErrnoSet calls errnoSet () with the given `status' or'd with the* network status prefix.** NOMANUAL*/void netErrnoSet    (    int status    )    {    errnoSet (M_errno | status);    }/********************************************************************************* schednetisr - schedule a call to ipintr() routine and wake up the netTask* if necessary.** This routine should not be called at interrupt level.  Currently it is* called directly by the loopback, slip, and ulip network interface drivers.  * It is also called indirectly by all other network interface drivers through* their calls to the do_protocol_with_type() routine.** NOMANUAL*/void schednetisr     (    int isrType    )    {    _netIsrMask |= (1 << isrType);    semGive (netTaskSemId);    }

⌨️ 快捷键说明

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