netLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:13k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* netLib.c - network interface library */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 03q,07may02,kbw  man page edits
  8. 03p,15oct01,rae  merge from truestack ver 04a, base 03o, (SPRs 69112, 32626 etc.)
  9. 03o,16mar99,spm  recovered orphaned code from tor1_0_1.sens1_1 (SPR #25770)
  10. 03n,14mar99,jdi  doc: removed refs to config.h and/or configAll.h (SPR 25663).
  11. 03m,22sep98,n_s  fixed return value of netJobAdd.  spr # 8538.
  12. 03l,05oct97,vin  added multicasting hash tbl initialization mcastHashInit.
  13. 03k,26aug97,spm  removed compiler warnings (SPR #7866)
  14. 03j,15jul97,spm  corrected comments for schednetisr() routine
  15. 03i,01jul97,vin  added addDomain() and route_init(), made routing sockets
  16.  scalable, fixed warnings.
  17. 03h,17apr97,vin  added mCastRouteCmdHook & mCastRouteFwdHook for scalability.
  18. 03g,13apr97,rjc  added ip filter hook.
  19. 03f,20jan96,vin  moved _func_remCurId[SG]et to usrNetwork.c for scalability,
  20.  multiplexed through _netIsrMask.
  21. 03d,24aug96,vin  modified schednetisr() for BSD44
  22. 03e,21jul95,dzb  removed call to sockInit().
  23. 03d,05may93,caf  tweaked for ansi.
  24. 03c,06sep93,jcf  added prototype of netTypeAdd.
  25. 03b,05sep93,jcf  initialized _func_remCurId[SG]et to decouple net from shell.
  26. 03a,11aug93,jmm  Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h
  27. 02z,02feb93,jdi  documentation cleanup for 5.1.
  28. 02y,13nov92,dnw  added include of semLibP.h
  29. 02x,18jul92,smb  Changed errno.h to errnoLib.h.
  30. 02w,26may92,rrr  the tree shuffle
  31. 02v,31Mar92,elh  added call to netTypeInit
  32. 02u,16dec91,gae  added includes for ANSI.
  33. 02t,04oct91,rrr  passed through the ansification filter
  34.                   -changed functions to ansi style
  35.   -changed VOID to void
  36.   -changed copyright notice
  37. 02s,05apr91,jdi  documentation -- removed header parens and x-ref numbers;
  38.  doc review by dnw.
  39. 02r,23jan91,jaa  documentation.
  40. 02q,05oct90,dnw  made schednetisr() be NOMANUAL.
  41. 02p,11jul90,hjb  made ipintrPending LOCAL.  added schednetisr().
  42. 02o,26jun90,jcf  added splSemInit (), and moved semMInit () to unixLib ()
  43. 02n,20jun90,jcf  changed binary semaphore interface
  44. 02m,20mar90,jcf  changed semaphores to binary for efficiency.
  45.  changed netTask name to tNetTask.
  46. 02l,18mar90,hjb  added code to eliminate costly netJobAdd's of ipintr ().
  47. 02k,22feb90,jdi  documentation cleanup.
  48. 02j,02dec88,ecs  bumped netTaskStackSize from 4000 to 10000 for SPARC.
  49. 02i,28nov88,gae  moved netHelp to usrLib.c to shrink bootroms.
  50. 02h,04nov88,dnw  changed JOB_RING_SIZE from 2000 to (85*sizeof(TODO_NODE))
  51.    so that ring overflow won't cause ring to be permanently
  52.    out of sync.
  53. 02g,18aug88,gae  documentation.  removed obsolete header includes.
  54. 02f,22jun88,dnw  name tweaks.
  55. 02e,06jun88,dnw  changed taskSpawn/taskCreate args.
  56. 02d,30may88,dnw  changed to v4 names.
  57. 02c,28may88,dnw  removed if{config,broadcast,netmask} to ifLib.
  58.  deleted obsolete netGetInetAddr.
  59.  removed mbufStat to uipc_mbuf.
  60.  moved setNetStatus here from sockLib.
  61.  changed call to fioStdIn to STD_IN.
  62. 02b,05mar88,jcf  changed semaphore calls for new semLib.
  63. 02a,22feb88,jcf  made kernel independent.
  64. 01v,16feb88,rdc  added ifnetmask.
  65. 01u,05jan88,rdc  added include of systm.h
  66. 01t,23nov87,ecs  lint.
  67. 01s,20nov87,jcf  added vxAddRebootRtn call in netStart.
  68.    +gae  spawned netd with 0 args to look nice.
  69. 01r,18nov87,ecs  documentation.
  70. 01q,17nov87,ecs  lint: added include of inetLib.h.
  71. 01p,11nov87,jlf  documentation
  72. 01o,08nov87,dnw  updated and expanded nethelp.
  73. 01n,01nov87,llk  removed addRoute(), addNetRoute(), deleteRoute().
  74.  moved inet_lnaof() to inetLib.c.
  75.  changed remInetAddr() calls to UNIX compatible inet_addr().
  76.  changed filbuf(0) calls to bzero().
  77.  added netGetInetAddr().
  78.  moved nethelp() here from remLib.c.
  79. 01m,02may87,dnw  removed unnecessary includes.
  80.  removed initialization of obsolete "hz".
  81.  moved call to ifinit() to netStart() from usrConfig.c.
  82. 01l,04apr87,jlf  documentation fix.
  83. 01k,03apr87,llk  documentation.
  84. 01j,02apr87,jlf  more delinting. grrrrrr.
  85. 01i,01apr87,jlf  more documentation.
  86.  delinted.
  87.     ecs  added include of strLib.h.
  88. 01h,26mar87,rdc  added addNetRoute().
  89. 01g,23mar87,jlf  documentation.
  90. 01f,27feb87,dnw  changed to spawn netd UNBREAKABLE.
  91. 01e,10dec86,dnw  reduced TO_DO_RING_SIZE from 10000 to 2000.
  92. 01d,19nov86,llk  made netd unbreakable.
  93. 01c,08nov86,dnw  changed netd to perform all actions at splnet().
  94.  changed to spawn netd at "netPriority" level,
  95.    and let spawn choose task id (saved in netdId).
  96.  fixed bug of trying to report error with interrupts
  97.    disabled.
  98. 01b,06nov86,rdc  ifconfig and the routing stuff had some unclosed sockets.
  99. 01a,28jul86,rdc  written.
  100. */
  101. /*
  102. DESCRIPTION
  103. This library contains the network task that runs low-level network
  104. interface routines in a task context.  The network task executes and
  105. removes routines that were added to the job queue.  This facility is used
  106. by network interfaces in order to have interrupt-level processing at
  107. task level.
  108. The routine netLibInit() initializes the network and spawns the network
  109. task netTask().  This is done automatically when INCLUDE_NET_LIB is defined.
  110. The routine netHelp() in usrLib displays a summary of the network facilities
  111. available from the VxWorks shell.
  112. INCLUDE FILES: netLib.h
  113. SEE ALSO: routeLib, hostLib, netDrv, netHelp(),
  114. */
  115. #include "vxWorks.h"
  116. #include "rngLib.h"
  117. #include "semLib.h"
  118. #include "taskLib.h"
  119. #include "errnoLib.h"
  120. #include "rebootLib.h"
  121. #include "sys/socket.h"
  122. #include "sockLib.h"
  123. #include "logLib.h"
  124. #include "intLib.h"
  125. #include "netLib.h"
  126. #include "remLib.h"
  127. #include "net/mbuf.h"
  128. #include "net/if_subr.h"
  129. #include "net/unixLib.h"
  130. #include "net/domain.h"
  131. #include "net/route.h"
  132. #include "private/semLibP.h"
  133. #include "private/funcBindP.h"
  134. #include "netinet/if_ether.h"
  135. #include "netinet/ip.h"
  136. #include "netinet/ip_var.h"
  137. #include "routeEnhLib.h"
  138. #ifdef VIRTUAL_STACK
  139. #include "netinet/vsLib.h"
  140. #include "netinet/vsMcast.h"
  141. #endif
  142. IMPORT void ifresetImmediate (void);            /* in netinet/if.c */
  143.  
  144. #ifndef VIRTUAL_STACK
  145. IMPORT struct domain inetdomain;  /* in netinet/in_proto.c */
  146. #endif
  147. IMPORT void splSemInit (void);  /* in netinet/unixLib.c */
  148. IMPORT void mbinit (void);  /* in netinet/uipc_mbuf.c */
  149. IMPORT void mcastHashInit (void);  /* initialize mcast hsh tbl */
  150. typedef struct
  151.     {
  152.     FUNCPTR routine; /* routine to be called */
  153.     int param1; /* arg to routine */
  154.     int param2;
  155.     int param3;
  156.     int param4;
  157.     int param5;
  158.     } TODO_NODE;
  159. #define JOB_RING_SIZE (85 * sizeof (TODO_NODE))
  160. /* local variables */
  161. LOCAL SEMAPHORE netTaskSem; /* netTask work-to-do sync-semaphore */
  162. LOCAL RING_ID   netJobRing; /* ring buffer of net jobs to do */
  163. /* global variables */
  164. SEM_ID netTaskSemId = &netTaskSem;
  165. int netTaskId;
  166. int netTaskPriority  = 50;
  167. int netTaskOptions   = VX_SUPERVISOR_MODE | VX_UNBREAKABLE;
  168. int netTaskStackSize = 10000;
  169. int netLibInitialized = FALSE;
  170. #ifndef VIRTUAL_STACK
  171. int _protoSwIndex    = 0;  /* index for number of protocols initialized */
  172. VOIDFUNCPTR  _icmpErrorHook = NULL; /* icmp error Hook */
  173. FUNCPTR  _mCastRouteFwdHook = NULL; /* mcast forwarding hook */
  174. #endif
  175. /* various netinet wrs internal hooks added for scalability */
  176. VOIDFUNCPTR  _igmpJoinGrpHook   = NULL; /* igmp join Hook */
  177. VOIDFUNCPTR  _igmpLeaveGrpHook  = NULL; /* igmp leave Hook */
  178. FUNCPTR      _ipFilterHook = NULL; /* ip filter/firewall Hook */
  179. FUNCPTR   _mCastRouteCmdHook = NULL; /* mcast route command hook */
  180. VOIDFUNCPTR rtMissMsgHook = NULL; /* route miss message hook */
  181. VOIDFUNCPTR rtIfaceMsgHook = NULL; /* netwk interface msg hook */
  182. VOIDFUNCPTR rtNewAddrMsgHook = NULL; /* new address msg hook */
  183. /******************************************************************************
  184. *
  185. * netLibGeneralInit - initialize the various network code
  186. *
  187. * This code use to be in netLibInit. With virtual stacks, we need these
  188. * specific routines to be executed on a per virtual stack basis.
  189. *
  190. * RETURNS: N/A
  191. *
  192. * NOMANUAL
  193. */
  194. void netLibGeneralInit (void)
  195.     {
  196.     /*
  197.      * Original startup code: uses contents of in_proto.c module 
  198.      * for inetdomain setup. The virtual stack startup sequences
  199.      * uses virtualStackInit() to setup the stack-specific
  200.      * environments instead of that module.
  201.      */
  202.     splSemInit (); /* initialize spl semaphore */
  203.     mbinit (); /* network buffer initialization */
  204. #ifdef VIRTUAL_STACK
  205.     arpLibInit(); /* initialize the VS part of arpLib */
  206. #endif /* VIRTUAL_STACK */
  207.     ifinit (); /* generic interface initialization */
  208.     addDomain (&inetdomain);  /* add the internet domain */
  209.     
  210.     domaininit (); /* intialize all domains */
  211. #ifndef VIRTUAL_STACK
  212.     route_init ();  /* routing table intialization */
  213. #else
  214.     routeStorageCreate ();
  215. #endif /* VIRTUAL_STACK */
  216. #ifdef ROUTER_STACK
  217.     routeIntInit ();                    /* routing enhancement initialization */
  218. #endif /* ROUTER_STACK */
  219.     
  220.     netTypeInit (); /* initialize netTypes */
  221.     mcastHashInit ();   /* defined in in.c */
  222.     }
  223. /*******************************************************************************
  224. *
  225. * netLibInit - initialize the network package
  226. *
  227. * This creates the network task job
  228. * queue, and spawns the network task netTask().  It should be called once to
  229. * initialize the network.  This is done automatically when INCLUDE_NET_LIB
  230. * is defined.
  231. *
  232. * VXWORKS AE PROTECTION DOMAINS
  233. * Under VxWorks AE, you can call this function from within the kernel 
  234. * protection domain only.  This restriction does not apply under non-AE 
  235. * versions of VxWorks.  
  236. *
  237. * RETURNS: OK, or ERROR if network support cannot be initialized.
  238. *
  239. * SEE ALSO: usrConfig, netTask()
  240. */
  241. STATUS netLibInit (void)
  242.     {
  243.     if (netLibInitialized)
  244. #ifndef VIRTUAL_STACK
  245. return (netTaskId == ERROR ? ERROR : OK);
  246. #else
  247. {
  248. /*
  249.  * This is so we can initialized other virtual stacks
  250.  * by just calling netLibInit instead of netLibGeneralInit.
  251.  */
  252. netLibGeneralInit ();
  253. return (OK);
  254. }
  255. #endif /* VIRTUAL_STACK */
  256.     netLibInitialized = TRUE;
  257.     if ((netJobRing = rngCreate (JOB_RING_SIZE)) == (RING_ID) NULL)
  258. panic ("netLibInit: couldn't create job ringn");
  259.     if (rebootHookAdd ((FUNCPTR) ifresetImmediate) == ERROR)
  260. logMsg ("netLibInit: unable to add reset hookn", 0, 0, 0, 0, 0, 0);
  261.     semBInit (netTaskSemId, SEM_Q_PRIORITY, SEM_EMPTY);
  262.     netLibGeneralInit ();      /* General initialization of the network */
  263.     netTaskId = taskSpawn ("tNetTask", netTaskPriority,
  264.            netTaskOptions, netTaskStackSize,
  265.    (FUNCPTR) netTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  266.     return (netTaskId == ERROR ? ERROR : OK);
  267.     }
  268. /*******************************************************************************
  269. *
  270. * netTask - network task entry point
  271. *
  272. * This routine is the VxWorks network support task.  Most of the VxWorks
  273. * network runs in this task's context.
  274. *
  275. * NOTE
  276. * To prevent an application task from monopolizing the CPU if it is
  277. * in an infinite loop or is never blocked, the priority of netTask()
  278. * relative to an application may need to be adjusted.  Network communication
  279. * may be lost if netTask() is "starved" of CPU time.  The default task
  280. * priority of netTask() is 50.  Use taskPrioritySet() to change the priority
  281. * of a task.
  282. *
  283. * This task is spawned by netLibInit().
  284. *
  285. * VXWORKS AE PROTECTION DOMAINS
  286. * Under VxWorks AE, you can call this function from within the kernel 
  287. * protection domain only.  This restriction does not apply under non-AE 
  288. * versions of VxWorks.  
  289. *
  290. * RETURNS: N/A
  291. *
  292. * SEE ALSO: netLibInit()
  293. *
  294. * INTERNAL
  295. * netTask() reads messages from a ring buffer which is filled by calling
  296. * netJobAdd().
  297. */
  298. void netTask (void)
  299.     {
  300.     TODO_NODE  jobNode;
  301.     FOREVER
  302. {
  303. /* wait for somebody to wake us up */
  304. semTake (netTaskSemId, WAIT_FOREVER);
  305. /* process requests in the toDo list */
  306. while (rngIsEmpty (netJobRing) == FALSE)
  307.     {
  308.     if (rngBufGet (netJobRing, (char *) &jobNode,
  309.    sizeof (jobNode)) != sizeof (jobNode))
  310. {
  311. panic ("netTask: netJobRing overflow!n");
  312. }
  313.     (*(jobNode.routine)) (jobNode.param1, jobNode.param2,
  314.   jobNode.param3, jobNode.param4,
  315.   jobNode.param5);
  316.     }
  317. }
  318.     }
  319. /*******************************************************************************
  320. *
  321. * netJobAdd - add a routine to the network task job queue
  322. *
  323. * This function allows a routine and up to 5 parameters,
  324. * to be added to the network job queue.
  325. * Only network interfaces should use this function, usually
  326. * to have their interrupt level processing done at task level.
  327. *
  328. * RETURNS: OK or ERROR
  329. *
  330. * NOMANUAL
  331. */
  332. STATUS netJobAdd
  333.     (
  334.     FUNCPTR routine,
  335.     int param1,
  336.     int param2,
  337.     int param3,
  338.     int param4,
  339.     int param5
  340.     )
  341.     {
  342.     FAST int oldlevel;
  343.     TODO_NODE newNode;
  344.     BOOL ok;
  345.     newNode.routine = routine;
  346.     newNode.param1 = param1;
  347.     newNode.param2 = param2;
  348.     newNode.param3 = param3;
  349.     newNode.param4 = param4;
  350.     newNode.param5 = param5;
  351.     oldlevel = intLock ();
  352.     ok = rngBufPut (netJobRing, (char *) &newNode, sizeof (newNode)) ==
  353. sizeof (newNode);
  354.     intUnlock (oldlevel);
  355.     if (!ok)
  356. {
  357. panic ("netJobAdd: ring buffer overflow!n");
  358. return (ERROR);
  359. }
  360.     /* wake up the network daemon to process the request */
  361.     semGive (netTaskSemId);
  362.     return (OK);
  363.     }
  364. /*******************************************************************************
  365. *
  366. * netErrnoSet - set network error status
  367. *
  368. * netErrnoSet calls errnoSet () with the given `status' or'd with the
  369. * network status prefix.
  370. *
  371. * NOMANUAL
  372. */
  373. void netErrnoSet
  374.     (
  375.     int status
  376.     )
  377.     {
  378.     errnoSet (M_errno | status);
  379.     }