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

VxWorks

开发平台:

C/C++

  1. /* uipc_dom.c - domain routines */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (c) 1982, 1986, 1993, 1995
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  * This product includes software developed by the University of
  19.  * California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  * @(#)uipc_domain.c 8.3 (Berkeley) 2/14/95
  37.  */
  38. /*
  39. modification history
  40. --------------------
  41. 01d,12oct01,rae  merge from truestack ver 01e, base 01c (SPR #69112 etc.)
  42. 01c,01jul97,vin  modified for making routing sockets scalable, removed
  43.  unnecessary max_datalen, added addDomain function.
  44. 01b,22nov96,vin  modified max_datalen variable to new cluster size.
  45. 01a,03mar96,vin  created from BSD4.4 stuff and integrated with 02n version
  46.  of uipc_dom.c. Did not change the name as it would cause
  47.  name conflict when releasing the 44stack as a component.
  48. */
  49. #include "vxWorks.h"
  50. #include "wdLib.h"
  51. #include "errno.h"
  52. #include "sys/socket.h"
  53. #include "net/protosw.h"
  54. #include "net/domain.h"
  55. #include "net/mbuf.h"
  56. #ifdef VIRTUAL_STACK
  57. #include "netinet/vsLib.h"
  58. #else
  59. IMPORT void netJobAdd ();
  60. #endif
  61. IMPORT int  sysClkRateGet(); 
  62. #ifndef VIRTUAL_STACK
  63. struct domain *domains; /* list of domain descriptors */
  64. LOCAL WDOG_ID pfslowtimoWd; /* watchdog timer for pfslowtimo routine */
  65. LOCAL WDOG_ID pffasttimoWd; /* watchdog timer for pffasttimo routine */
  66. static void pfslowtimo (void);
  67. static void pffasttimo (void); 
  68. #else
  69. static void pfslowtimo (int stackNum);
  70. static void pffasttimo (int stackNum); 
  71. #endif /* VIRTUAL_STACK */
  72. int max_linkhdr; /* largest link-level header */
  73. int max_protohdr; /* largest protocol header */
  74. int max_hdr; /* largest link+protocol header */
  75. /*******************************************************************************
  76. * addDomain - add the domain to the domain list
  77. *
  78. * This function adds the domain passed to it into a global domain list
  79. * This global domain list is used by various routines to get to the
  80. * protocols. After adding all the domains then call domaininit ().
  81. * This function is to be called only once per domain at the initialization
  82. * time.
  83. *
  84. * NOTE: No checking is done if a domain is added multiple times. That would be
  85. *       insane.
  86. *
  87. * RETURNS: OK/ERROR
  88. *
  89. * NOMANUAL
  90. */
  91. int addDomain
  92.     (
  93.     struct domain * pDomain /* pointer to the domain to add */
  94.     )
  95.     {
  96.     if (pDomain == NULL)
  97.         return (ERROR);
  98.     /* add the domain to the global list */
  99.     
  100.     pDomain->dom_next = domains;
  101.     domains = pDomain;
  102.     
  103.     return (OK); 
  104.     }
  105. void domaininit(void)
  106. {
  107. register struct domain *dp;
  108. register struct protosw *pr;
  109. for (dp = domains; dp; dp = dp->dom_next) {
  110. if (dp->dom_init)
  111. (*dp->dom_init)();
  112. for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  113. if (pr->pr_init)
  114. (*pr->pr_init)();
  115. }
  116.         if (max_linkhdr < 16) /* XXX */
  117.             max_linkhdr = 16;
  118. max_hdr = max_linkhdr + max_protohdr;
  119.         pffasttimoWd = wdCreate ();
  120.         pfslowtimoWd = wdCreate ();
  121. #ifdef VIRTUAL_STACK
  122. pffasttimo (myStackNum);
  123. pfslowtimo (myStackNum);
  124. #else
  125. pffasttimo ();
  126. pfslowtimo ();
  127. #endif
  128. }
  129. struct protosw *
  130. pffindtype(family, type)
  131. int family;
  132. int type;
  133. {
  134. register struct domain *dp;
  135. register struct protosw *pr;
  136. for (dp = domains; dp; dp = dp->dom_next)
  137. if (dp->dom_family == family)
  138. goto found;
  139. return (0);
  140. found:
  141. for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  142. if (pr->pr_type && pr->pr_type == type)
  143. return (pr);
  144. return (0);
  145. }
  146. struct protosw *
  147. pffindproto(family, protocol, type)
  148. int family, protocol, type;
  149. {
  150. register struct domain *dp;
  151. register struct protosw *pr;
  152. struct protosw *maybe = 0;
  153. if (family == 0)
  154. return (0);
  155. for (dp = domains; dp; dp = dp->dom_next)
  156. if (dp->dom_family == family)
  157. goto found;
  158. return (0);
  159. found:
  160. for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
  161. if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
  162. return (pr);
  163. if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
  164.     pr->pr_protocol == 0 && maybe == (struct protosw *)0)
  165. maybe = pr;
  166. }
  167. return (maybe);
  168. }
  169. int
  170. net_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
  171. int *name;
  172. u_int namelen;
  173. void *oldp;
  174. size_t *oldlenp;
  175. void *newp;
  176. size_t newlen;
  177. struct proc *p;
  178. {
  179. register struct domain *dp;
  180. register struct protosw *pr;
  181. int family, protocol;
  182. /*
  183.  * All sysctl names at this level are nonterminal;
  184.  * next two components are protocol family and protocol number,
  185.  * then at least one addition component.
  186.  */
  187. if (namelen < 3)
  188. return (EISDIR); /* overloaded */
  189. family = name[0];
  190. protocol = name[1];
  191. if (family == 0)
  192. return (0);
  193. for (dp = domains; dp; dp = dp->dom_next)
  194. if (dp->dom_family == family)
  195. goto found;
  196. return (ENOPROTOOPT);
  197. found:
  198. for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  199. if (pr->pr_protocol == protocol && pr->pr_sysctl)
  200. return ((*pr->pr_sysctl)(name + 2, namelen - 2,
  201.     oldp, oldlenp, newp, newlen));
  202. return (ENOPROTOOPT);
  203. }
  204. void
  205. pfctlinput(cmd, sa)
  206. int cmd;
  207. struct sockaddr *sa;
  208. {
  209. register struct domain *dp;
  210. register struct protosw *pr;
  211. for (dp = domains; dp; dp = dp->dom_next)
  212. for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  213. if (pr->pr_ctlinput)
  214. (*pr->pr_ctlinput)(cmd, sa, (caddr_t)0);
  215. }
  216. #ifdef VIRTUAL_STACK
  217. static void pfslowtimoRestart
  218.     (
  219.     int stackNumber
  220.     )
  221.     {
  222.     netJobAdd ((FUNCPTR)pfslowtimo, stackNumber, 2, 3, 4, 5);
  223.     }
  224. static void pfslowtimo
  225.     (
  226.     int stackNum
  227.     )
  228. #else
  229. static void pfslowtimo (void)
  230. #endif
  231.     {
  232.     register struct domain *dp;
  233.     register struct protosw *pr;
  234.     int s;
  235. #ifdef VIRTUAL_STACK    
  236.     virtualStackNumTaskIdSet(stackNum);
  237. #endif
  238.     s = splnet();
  239.     for (dp = domains; dp; dp = dp->dom_next)
  240.         for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  241.             if (pr->pr_slowtimo)
  242.                 (*pr->pr_slowtimo)();
  243.     splx (s);
  244. #ifdef VIRTUAL_STACK
  245.     wdStart (pfslowtimoWd, sysClkRateGet()/2, (FUNCPTR) pfslowtimoRestart,
  246.              (int) myStackNum);
  247. #else
  248.     wdStart (pfslowtimoWd, sysClkRateGet()/2, (FUNCPTR) netJobAdd,
  249.              (int) pfslowtimo);
  250. #endif
  251.     }
  252. #ifdef VIRTUAL_STACK
  253. static void pffasttimoRestart
  254.     (
  255.     int stackNumber
  256.     )
  257.     {
  258.     netJobAdd ((FUNCPTR)pffasttimo, stackNumber, 2, 3, 4, 5);
  259.     }
  260. static void pffasttimo
  261.     (
  262.     int stackNum
  263.     )
  264. #else
  265. static void pffasttimo (void)
  266. #endif
  267.     {
  268.     register struct domain *dp;
  269.     register struct protosw *pr;
  270.     int s;
  271. #ifdef VIRTUAL_STACK
  272.     virtualStackNumTaskIdSet(stackNum);
  273. #endif
  274.     s = splnet();
  275.     for (dp = domains; dp; dp = dp->dom_next)
  276.         for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  277.             if (pr->pr_fasttimo)
  278.                 (*pr->pr_fasttimo)();
  279.     splx (s);
  280. #ifdef VIRTUAL_STACK    
  281.     wdStart (pffasttimoWd, sysClkRateGet()/5, (FUNCPTR) pffasttimoRestart, 
  282.              (int) stackNum);
  283. #else
  284.     wdStart (pffasttimoWd, sysClkRateGet()/5, (FUNCPTR) netJobAdd, 
  285.              (int) pffasttimo);
  286. #endif
  287.     }