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

VxWorks

开发平台:

C/C++

  1. /* raw_cb.c - raw protocol control block handling routines */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (c) 1980, 1986, 1993
  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.  * @(#)raw_cb.c 8.1 (Berkeley) 6/10/93
  37.  */
  38. /*
  39. modification history
  40. --------------------
  41. 01d,12oct01,rae  merge from truestack ver 01f, base 01c
  42. 01c,02jul97,vin  fixed warnings.
  43. 01b,05dec96,vin  replaced free with FREE(),
  44. 01a,03mar96,vin  created from BSD4.4 stuff,integrated with 02i of raw_cb.c
  45. */
  46. /*
  47. DESCRIPTION
  48. */
  49. #include "vxWorks.h"
  50. #include "net/systm.h"
  51. #include "net/mbuf.h"
  52. #include "sys/socket.h"
  53. #include "net/socketvar.h"
  54. #include "net/domain.h"
  55. #include "net/protosw.h"
  56. #include "errno.h"
  57. #include "net/if.h"
  58. #include "net/route.h"
  59. #include "net/raw_cb.h"
  60. #include "netinet/in.h"
  61. #ifdef WV_INSTRUMENTATION
  62. #ifdef INCLUDE_WVNET
  63. #include "wvNetLib.h"
  64. #endif
  65. #endif
  66. #ifdef VIRTUAL_STACK
  67. #include "netinet/vsLib.h"
  68. #endif
  69. extern void _insque ();
  70. extern void _remque (); 
  71. #ifndef VIRTUAL_STACK
  72. struct rawcb rawcb; /* head of list */
  73. /*
  74.  * Routines to manage the raw protocol control blocks.
  75.  *
  76.  * TODO:
  77.  * hash lookups by protocol family/protocol + address family
  78.  * take care of unique address problems per AF?
  79.  * redo address binding to allow wildcards
  80.  */
  81. u_long  raw_sendspace = RAWSNDQ;
  82. u_long  raw_recvspace = RAWRCVQ;
  83. #endif
  84. #ifdef WV_INSTRUMENTATION
  85. #ifdef INCLUDE_WVNET
  86.     /* Set common fields of event identifiers for this module. */
  87. LOCAL UCHAR wvNetModuleId = WV_NET_RAWCB_MODULE;   /* Value for raw_cb.c */
  88. LOCAL UCHAR wvNetLocalFilter = WV_NET_NONE;     /* Available event filter */
  89. LOCAL ULONG wvNetEventId;       /* Event identifier: see wvNetLib.h */
  90. #endif    /* INCLUDE_WVNET */
  91. #endif
  92. /*
  93.  * Allocate a control block and a nominal amount
  94.  * of buffer space for the socket.
  95.  */
  96. int
  97. raw_attach(so, proto)
  98. register struct socket *so;
  99. int proto;
  100. {
  101. register struct rawcb *rp = sotorawcb(so);
  102. int error;
  103. #ifdef WV_INSTRUMENTATION
  104. #ifdef INCLUDE_WVNET    /* WV_NET_VERBOSE event */
  105.     WV_NET_MARKER_1 (NET_CORE_EVENT, WV_NET_VERBOSE, 28, 4,
  106.                      WV_NETEVENT_RAWATTACH_START, so->so_fd)
  107. #endif  /* INCLUDE_WVNET */
  108. #endif
  109. /*
  110.  * It is assumed that raw_attach is called
  111.  * after space has been allocated for the
  112.  * rawcb.
  113.  */
  114. if (rp == 0)
  115.             {
  116. /* 
  117.  * XXX - This event cannot currently occur: the route_usrreq() routine
  118.  *       already checks for failure to allocate the control block.
  119. #ifdef WV_INSTRUMENTATION
  120. #ifdef INCLUDE_WVNET    /@ WV_NET_CRITICAL event @/
  121.         WV_NET_MARKER_1 (NET_CORE_EVENT, WV_NET_CRITICAL, 24, 1,
  122.                          WV_NETEVENT_RAWATTACH_NOPCBMEM, so->so_fd)
  123. #endif  /@ INCLUDE_WVNET @/
  124. #endif
  125.  * XXX - end of unused event
  126.  */
  127. return (ENOBUFS);
  128.             }
  129. if ((error = soreserve(so, raw_sendspace, raw_recvspace)))
  130.             {
  131. /* XXX - This event does not currently indicate a memory allocation failure.
  132.  *       The soreserve() routine only sets high and low water mark values
  133.  *       and does not attempt to commit any memory, although it should.
  134. #ifdef WV_INSTRUMENTATION
  135. #ifdef INCLUDE_WVNET    /@ WV_NET_CRITICAL event @/
  136.         WV_NET_MARKER_1 (NET_CORE_EVENT, WV_NET_CRITICAL, 25, 2,
  137.                          WV_NETEVENT_RAWATTACH_NOSOCKBUFMEM, so->so_fd)
  138. #endif  /@ INCLUDE_WVNET @/
  139. #endif
  140.  * XXX - end of unused event
  141.  */
  142. return (error);
  143.             }
  144. rp->rcb_socket = so;
  145. rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
  146. rp->rcb_proto.sp_protocol = proto;
  147. #ifdef VIRTUAL_STACK
  148. insque(rp, &_rawcb);
  149. #else    /* VIRTUAL_STACK */
  150. insque(rp, &rawcb);
  151. #endif    /* VIRTUAL_STACK */
  152. return (0);
  153. }
  154. /*
  155.  * Detach the raw connection block and discard
  156.  * socket resources.
  157.  */
  158. void
  159. raw_detach(rp)
  160. register struct rawcb *rp;
  161. {
  162. struct socket *so = rp->rcb_socket;
  163. #ifdef WV_INSTRUMENTATION
  164. #ifdef INCLUDE_WVNET    /* WV_NET_VERBOSE event */
  165.     WV_NET_MARKER_1 (NET_CORE_EVENT, WV_NET_VERBOSE, 29, 5,
  166.                      WV_NETEVENT_RAWDETACH_START, so->so_fd)
  167. #endif  /* INCLUDE_WVNET */
  168. #endif
  169. so->so_pcb = 0;
  170. sofree(so);
  171. remque(rp);
  172. #ifdef notdef
  173. if (rp->rcb_laddr)
  174. m_freem(dtom(rp->rcb_laddr));
  175. rp->rcb_laddr = 0;
  176. #endif
  177. FREE(rp, MT_PCB);
  178. }
  179. /*
  180.  * Disconnect and possibly release resources.
  181.  */
  182. void
  183. raw_disconnect(rp)
  184. struct rawcb *rp;
  185. {
  186. #ifdef notdef
  187. if (rp->rcb_faddr)
  188. m_freem(dtom(rp->rcb_faddr));
  189. rp->rcb_faddr = 0;
  190. #endif
  191. if (rp->rcb_socket->so_state & SS_NOFDREF)
  192. raw_detach(rp);
  193. }
  194. #ifdef notdef
  195. int
  196. raw_bind(so, nam)
  197. register struct socket *so;
  198. struct mbuf *nam;
  199. {
  200. struct sockaddr *addr = mtod(nam, struct sockaddr *);
  201. register struct rawcb *rp;
  202. /* XXX - This event does not occur because this routine is never called
  203.  *       by the existing network stack since the PRU_BIND option within
  204.  *       the raw_usrreq switch statement is unsupported.
  205. #ifdef WV_INSTRUMENTATION
  206. #ifdef INCLUDE_WVNET    /@ WV_NET_VERBOSE event @/
  207.     WV_NET_MARKER_1 (NET_CORE_EVENT, WV_NET_VERBOSE, 30, 6,
  208.                      WV_NETEVENT_RAWBIND_START, so->so_fd)
  209. #endif  /@ INCLUDE_WVNET @/
  210. #endif
  211.  * XXX -end of unused event
  212.  */
  213. if (ifnet == 0)
  214.             {
  215. /* XXX - This event does not occur because this routine is never called
  216.  *       by the existing network stack since the PRU_BIND option within
  217.  *       the raw_usrreq switch statement is unsupported.
  218. #ifdef WV_INSTRUMENTATION
  219. #ifdef INCLUDE_WVNET    /@ WV_NET_ERROR event @/
  220.         WV_NET_MARKER_1 (NET_CORE_EVENT, WV_NET_ERROR, 31, 3,
  221.                          WV_NETEVENT_RAWBIND_NOIF, so->so_fd)
  222. #endif  /@ INCLUDE_WVNET @/
  223. #endif
  224.  * XXX -end of unused event
  225.  */
  226. return (EADDRNOTAVAIL);
  227.             }
  228. rp = sotorawcb(so);
  229. nam = m_copym(nam, 0, M_COPYALL, M_WAIT);
  230. rp->rcb_laddr = mtod(nam, struct sockaddr *);
  231. return (0);
  232. }
  233. #endif