📄 netlib.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 + -