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

VxWorks

开发平台:

C/C++

  1. /* zbufSockLib.c - zbuf socket interface library */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01l,07may02,kbw  man page edits
  8. 01k,15oct01,rae  merge from truestack ver 01l, base 01j (cleanup)
  9. 01j,18oct00,zhu  check NULL for sockFdtosockFunc
  10. 01i,29apr99,pul  Upgraded NPT phase3 code to tor2.0.0
  11. 01h,14mar99,jdi  doc: removed refs to config.h and/or configAll.h (SPR 25663).
  12. 01h,02feb99,sgv  Added checks for zbuf support in the underlying backend in
  13.  zbufSockSend,zbufSockSendto,zbufSockBufSend, zbufSockBufSendto,
  14.  zbufSockRecv, zbufSockRecvfrom calls.
  15. 01g,26oct95,rhp  doc: mention values for <flags> params in socket
  16.                  calls (SPR#4423)
  17. 01f,10mar95,jdi  doc addn to zbufSockRecv(), zbufSockRecvfrom() as per dana.
  18. 01e,11feb95,jdi  fixed doc style for `errno'.
  19. 01d,23jan95,jdi  more doc tweaks.
  20. 01c,12nov94,rhp  doc tweaks.
  21. 01b,09nov94,rhp  library man page added, subroutine man pages edited.
  22. 01a,08nov94,dzb  written.
  23. */
  24. /*
  25. DESCRIPTION
  26. This library contains routines that communicate over BSD sockets using
  27. the
  28. .I "zbuf interface"
  29. described in the zbufLib manual page.  These zbuf
  30. socket calls communicate over BSD sockets in a similar manner to the
  31. socket routines in sockLib, but they avoid copying data unnecessarily
  32. between application buffers and network buffers.
  33. VXWORKS AE PROTECTION DOMAINS
  34. Under VxWorks AE, this feature is accessible from the kernel protection 
  35. domain only.  This restriction does not apply under non-AE versions of 
  36. VxWorks.  
  37. To use this feature, include the INCLUDE_ZBUF_SOCK component.
  38. SEE ALSO
  39. zbufLib, sockLib 
  40. */
  41. /* includes */
  42. #include "vxWorks.h"
  43. #include "zbufSockLib.h"
  44. #include "mbufSockLib.h"
  45. #include "sys/socket.h"
  46. #include "sockFunc.h"
  47. #include "netLib.h"
  48. /* locals */
  49. LOCAL ZBUF_SOCK_FUNC zbufSockFuncNull = /* null funcs for unconnected */
  50.     {
  51.     NULL, /* zbufLibInit() */
  52.     NULL, /* zbufSockSend() */
  53.     NULL, /* zbufSockSendto() */
  54.     NULL, /* zbufSockBufSend() */
  55.     NULL, /* zbufSockBufSendto() */
  56.     NULL, /* zbufSockRecv() */
  57.     NULL /* zbufSockRecvfrom() */
  58.     };
  59. LOCAL ZBUF_SOCK_FUNC * pZbufSockFunc = &zbufSockFuncNull;
  60. /* forward declarations */
  61. IMPORT SOCK_FUNC * sockFdtosockFunc (int s);
  62. /*******************************************************************************
  63. *
  64. * zbufSockLibInit - initialize the zbuf socket interface library
  65. *
  66. * This routine initializes the zbuf socket interface
  67. * library.  It must be called before any zbuf socket routines are used.
  68. * It is called automatically when INCLUDE_ZBUF_SOCK is defined.
  69. *
  70. * VXWORKS AE PROTECTION DOMAINS
  71. * Under VxWorks AE, you can call this function from within the kernel 
  72. * protection domain only.  In addition, all arguments to this function can  
  73. * reference only that data which is valid in the kernel protection domain. 
  74. * This restriction does not apply under non-AE versions of VxWorks.  
  75. *
  76. * RETURNS:
  77. * OK, or ERROR if the zbuf socket interface could not be initialized.
  78. */
  79. STATUS zbufSockLibInit (void)
  80.     {
  81.     ZBUF_SOCK_FUNC * pZbufSockFuncTemp;
  82.     /* call the back-end initialization routine */
  83.     if ((pZbufSockFuncTemp = _mbufSockLibInit()) == NULL)
  84. return (ERROR);
  85.     
  86.     pZbufSockFunc = pZbufSockFuncTemp; /* connect socket back-end func table */
  87.     return (zbufLibInit (pZbufSockFunc->libInitRtn));
  88.     }
  89. /*******************************************************************************
  90. *
  91. * zbufSockSend - send zbuf data to a TCP socket
  92. *
  93. * This routine transmits all of the data in <zbufId> to a previously
  94. * established connection-based (stream) socket.
  95. *
  96. * The <zbufLen> parameter is used only for determining the amount of space
  97. * needed from the socket write buffer.  <zbufLen> has no effect on how many
  98. * bytes are sent; the entire zbuf is always transmitted.  If the length of
  99. * <zbufId> is not known, the caller must first determine it by calling
  100. * zbufLength().
  101. *
  102. * This routine transfers ownership of the zbuf from the user application
  103. * to the VxWorks network stack.  The zbuf ID, <zbufId>, is deleted by this
  104. * routine, and should not be used after the routine is called, even if
  105. * an ERROR status is returned.  (Exceptions:  when the routine
  106. * fails because the zbuf socket interface library was not initialized or an
  107. * invalid zbuf ID was passed in, in which case there is no zbuf to delete.
  108. * Moreover, if the call fails during a non-blocking I/O socket write
  109. * with an `errno' of EWOULDBLOCK, then <zbufId> is not deleted; thus the
  110. * caller may send it again at a later time.)
  111. *
  112. * You may OR the following values into the <flags> parameter with this
  113. * operation:
  114. *
  115. * .iP "MSG_OOB (0x1)" 26
  116. * Out-of-band data.
  117. * .iP "MSG_DONTROUTE (0x4)"
  118. * Send without using routing tables.
  119. * .LP
  120. * VXWORKS AE PROTECTION DOMAINS
  121. * Under VxWorks AE, you can call this function from within the kernel 
  122. * protection domain only.  In addition, all arguments to this function can  
  123. * reference only that data which is valid in the kernel protection domain. 
  124. * This restriction does not apply under non-AE versions of VxWorks.  
  125. *
  126. * RETURNS
  127. * The number of bytes sent, or ERROR if the call fails.
  128. *
  129. * SEE ALSO: zbufLength(), zbufSockBufSend(), send()
  130. */
  131. int zbufSockSend
  132.     (
  133.     int s, /* socket to send to */
  134.     ZBUF_ID zbufId, /* zbuf to transmit */
  135.     int zbufLen, /* length of entire zbuf */
  136.     int flags /* flags to underlying protocols */
  137.     )
  138.     {
  139.     SOCK_FUNC * pSockFunc = sockFdtosockFunc(s);
  140.     if (pSockFunc == NULL || pSockFunc->zbufRtn == NULL ||
  141. (pSockFunc->zbufRtn)() == FALSE)
  142. {
  143. netErrnoSet (ENOTSUP);
  144. return (ERROR);
  145. }
  146.     return ((pZbufSockFunc->sendRtn == NULL) ? ERROR :
  147. (pZbufSockFunc->sendRtn) (s, zbufId, zbufLen, flags));
  148.     }
  149. /*******************************************************************************
  150. *
  151. * zbufSockSendto - send a zbuf message to a UDP socket
  152. *
  153. * This routine sends the entire message in <zbufId> to the datagram socket
  154. * named by <to>.  The socket <s> is the sending socket.
  155. *
  156. * The <zbufLen> parameter is used only for determining the amount of space
  157. * needed from the socket write buffer.  <zbufLen> has no effect on how many
  158. * bytes are sent; the entire zbuf is always transmitted.  If the length of
  159. * <zbufId> is not known, the caller must first determine it by calling
  160. * zbufLength().
  161. *
  162. * This routine transfers ownership of the zbuf from the user application
  163. * to the VxWorks network stack.  The zbuf ID <zbufId> is deleted by this
  164. * routine, and should not be used after the routine is called, even if
  165. * an ERROR status is returned.  (Exceptions:  when the routine
  166. * fails because the zbuf socket interface library was not initialized or an
  167. * invalid zbuf ID was passed in, in which case there is no zbuf to delete.
  168. * Moreover, if the call fails during a non-blocking I/O socket write
  169. * with an `errno' of EWOULDBLOCK, then <zbufId> is not deleted; thus the
  170. * caller may send it again at a later time.)
  171. *
  172. * You may OR the following values into the <flags> parameter with this
  173. * operation:
  174. *
  175. * .iP "MSG_OOB (0x1)" 26
  176. * Out-of-band data.
  177. * .iP "MSG_DONTROUTE (0x4)"
  178. * Send without using routing tables.
  179. * .LP
  180. * VXWORKS AE PROTECTION DOMAINS
  181. * Under VxWorks AE, you can call this function from within the kernel 
  182. * protection domain only.  In addition, all arguments to this function can  
  183. * reference only that data which is valid in the kernel protection domain. 
  184. * This restriction does not apply under non-AE versions of VxWorks.  
  185. *
  186. * RETURNS
  187. * The number of bytes sent, or ERROR if the call fails.
  188. *
  189. * SEE ALSO: zbufLength(), zbufSockBufSendto(), sendto()
  190. */
  191. int zbufSockSendto
  192.     (
  193.     int s, /* socket to send to */
  194.     ZBUF_ID zbufId, /* zbuf to transmit */
  195.     int zbufLen, /* length of entire zbuf */
  196.     int flags, /* flags to underlying protocols */
  197.     struct sockaddr * to, /* recipient's address */
  198.     int tolen /* length of <to> socket addr */
  199.     )
  200.     {
  201.     SOCK_FUNC * pSockFunc = sockFdtosockFunc(s);
  202.     
  203.     if (pSockFunc == NULL) 
  204. {
  205. netErrnoSet (ENOTSUP);
  206. return (ERROR);
  207. }
  208.     if ((pSockFunc->zbufRtn == NULL) || ((pSockFunc->zbufRtn)() == FALSE))
  209. {
  210. netErrnoSet (ENOTSUP);
  211. return (ERROR);
  212. }
  213.     return ((pZbufSockFunc->sendtoRtn == NULL) ? ERROR :
  214. (pZbufSockFunc->sendtoRtn) (s, zbufId, zbufLen, flags, to, tolen));
  215.     }
  216. /*******************************************************************************
  217. *
  218. * zbufSockBufSend - create a zbuf from user data and send it to a TCP socket
  219. *
  220. * This routine creates a zbuf from the user buffer <buf>, and transmits
  221. * it to a previously established connection-based (stream) socket.
  222. *
  223. * The user-provided free routine callback at <freeRtn> is called when <buf>
  224. * is no longer in use by the TCP/IP network stack.  Applications can
  225. * exploit this callback to receive notification that <buf> is free.
  226. * If <freeRtn> is NULL, the routine functions normally, except that the 
  227. * application has no way of being notified when <buf> is released by the
  228. * network stack.  The free routine runs in the context of the task that last
  229. * references the buffer.  This is typically either the context of tNetTask, 
  230. * or the context of the caller's task.  Declare <freeRtn> as follows
  231. * (using whatever name is convenient):
  232. * .CS
  233. *       void freeCallback
  234. *           (
  235. *           caddr_t     buf,    /@ pointer to user buffer @/
  236. *           int         freeArg /@ user-provided argument to free routine @/
  237. *           )
  238. * .CE
  239. *
  240. * You may OR the following values into the <flags> parameter with this
  241. * operation:
  242. *
  243. * .iP "MSG_OOB (0x1)" 26
  244. * Out-of-band data.
  245. * .iP "MSG_DONTROUTE (0x4)"
  246. * Send without using routing tables.
  247. * .LP
  248. * VXWORKS AE PROTECTION DOMAINS
  249. * Under VxWorks AE, you can call this function from within the kernel 
  250. * protection domain only.  In addition, all arguments to this function can  
  251. * reference only that data which is valid in the kernel protection domain. 
  252. * This restriction does not apply under non-AE versions of VxWorks.  
  253. *
  254. * RETURNS:
  255. * The number of bytes sent, or ERROR if the call fails.
  256. *
  257. * SEE ALSO
  258. * zbufSockSend(), send()
  259. *
  260. */
  261. int zbufSockBufSend
  262.     (
  263.     int s, /* socket to send to */
  264.     char * buf, /* pointer to data buffer */
  265.     int         bufLen, /* number of bytes to send */
  266.     VOIDFUNCPTR freeRtn, /* free routine callback */
  267.     int freeArg, /* argument to free routine */
  268.     int flags /* flags to underlying protocols */
  269.     )
  270.     {
  271.     SOCK_FUNC * pSockFunc = sockFdtosockFunc(s);
  272.     if (pSockFunc == NULL || pSockFunc->zbufRtn == NULL ||
  273.  (pSockFunc->zbufRtn)() == FALSE)
  274. {
  275. netErrnoSet (ENOTSUP);
  276. return (ERROR);
  277. }
  278.     return ((pZbufSockFunc->bufSendRtn == NULL) ? ERROR :
  279. (pZbufSockFunc->bufSendRtn) (s, buf, bufLen, freeRtn, freeArg, flags));
  280.     }
  281. /*******************************************************************************
  282. *
  283. * zbufSockBufSendto - create a zbuf from a user message and send it to a UDP socket
  284. *
  285. * This routine creates a zbuf from the user buffer <buf>, and sends
  286. * it to the datagram socket named by <to>.  The socket <s> is the
  287. * sending socket.
  288. *
  289. * The user-provided free routine callback at <freeRtn> is called when <buf>
  290. * is no longer in use by the UDP/IP network stack.  Applications can
  291. * exploit this callback to receive notification that <buf> is free.
  292. * If <freeRtn> is NULL, the routine functions normally, except that the 
  293. * application has no way of being notified when <buf> is released by the
  294. * network stack.  The free routine runs in the context of the task that last
  295. * references the buffer.  This is typically either tNetTask context, 
  296. * or the caller's task context.  Declare <freeRtn> as follows
  297. * (using whatever name is convenient):
  298. * .CS
  299. *       void freeCallback
  300. *           (
  301. *           caddr_t     buf,    /@ pointer to user buffer @/
  302. *           int         freeArg /@ user-provided argument to free routine @/
  303. *           )
  304. * .CE
  305. *
  306. * You may OR the following values into the <flags> parameter with this
  307. * operation:
  308. *
  309. * .iP "MSG_OOB (0x1)" 26
  310. * Out-of-band data.
  311. * .iP "MSG_DONTROUTE (0x4)"
  312. * Send without using routing tables.
  313. * .LP
  314. * VXWORKS AE PROTECTION DOMAINS
  315. * Under VxWorks AE, you can call this function from within the kernel 
  316. * protection domain only.  In addition, all arguments to this function can  
  317. * reference only that data which is valid in the kernel protection domain. 
  318. * This restriction does not apply under non-AE versions of VxWorks.  
  319. *
  320. * RETURNS:
  321. * The number of bytes sent, or ERROR if the call fails.
  322. *
  323. * SEE ALSO
  324. * zbufSockSendto(), sendto()
  325. */
  326. int zbufSockBufSendto
  327.     (
  328.     int s, /* socket to send to */
  329.     char * buf, /* pointer to data buffer */
  330.     int         bufLen, /* number of bytes to send */
  331.     VOIDFUNCPTR freeRtn, /* free routine callback */
  332.     int freeArg, /* argument to free routine */
  333.     int flags, /* flags to underlying protocols */
  334.     struct sockaddr * to, /* recipient's address */
  335.     int tolen /* length of <to> socket addr */
  336.     )
  337.     {
  338.     SOCK_FUNC * pSockFunc = sockFdtosockFunc(s);
  339.     if (pSockFunc == NULL || pSockFunc->zbufRtn == NULL ||
  340. (pSockFunc->zbufRtn)() == FALSE)
  341. {
  342. netErrnoSet (ENOTSUP);
  343. return (ERROR);
  344. }
  345.     return ((pZbufSockFunc->bufSendtoRtn == NULL) ? ERROR :
  346. (pZbufSockFunc->bufSendtoRtn) (s, buf, bufLen, freeRtn, freeArg,
  347. flags, to, tolen));
  348.     }
  349. /*******************************************************************************
  350. *
  351. * zbufSockRecv - receive data in a zbuf from a TCP socket
  352. *
  353. * This routine receives data from a connection-based (stream) socket, and
  354. * returns the data to the user in a newly created zbuf.
  355. *
  356. * The <pLen> parameter indicates the number of bytes requested by the caller.
  357. * If the operation is successful, the number of bytes received is
  358. * copied to <pLen>.
  359. *
  360. * You may OR the following values into the <flags> parameter with this
  361. * operation:
  362. *
  363. * .iP "MSG_OOB (0x1)" 26
  364. * Out-of-band data.
  365. * .iP "MSG_PEEK (0x2)"
  366. * Return data without removing it from socket.
  367. * .LP
  368. * Once the user application is finished with the zbuf, zbufDelete() should
  369. * be called to return the zbuf memory buffer to the VxWorks network stack.
  370. *
  371. * VXWORKS AE PROTECTION DOMAINS
  372. * Under VxWorks AE, you can call this function from within the kernel 
  373. * protection domain only.  In addition, all arguments to this function can  
  374. * reference only that data which is valid in the kernel protection domain. 
  375. * This restriction does not apply under non-AE versions of VxWorks.  
  376. *
  377. * RETURNS:
  378. * The zbuf ID of a newly created zbuf containing the received data,
  379. * or NULL if the operation fails.
  380. *
  381. * SEE ALSO
  382. * recv()
  383. */
  384. ZBUF_ID zbufSockRecv
  385.     (
  386.     int s, /* socket to receive data from */
  387.     int flags, /* flags to underlying protocols */
  388.     int * pLen /* number of bytes requested/returned */
  389.     )
  390.     {
  391.     SOCK_FUNC * pSockFunc = sockFdtosockFunc(s);
  392.     if (pSockFunc == NULL || pSockFunc->zbufRtn == NULL || (pSockFunc->zbufRtn)() == FALSE)
  393. {
  394. netErrnoSet (ENOTSUP);
  395. return (NULL);
  396. }
  397.     return ((pZbufSockFunc->recvRtn == NULL) ? NULL :
  398. (ZBUF_ID) (pZbufSockFunc->recvRtn) (s, flags, pLen));
  399.     }
  400. /*******************************************************************************
  401. *
  402. * zbufSockRecvfrom - receive a message in a zbuf from a UDP socket
  403. *
  404. * This routine receives a message from a datagram socket, and
  405. * returns the message to the user in a newly created zbuf.
  406. *
  407. * The message is received regardless of whether the socket is connected.
  408. * If <from> is nonzero, the address of the sender's socket is copied to it.
  409. * Initialize the value-result parameter <pFromLen> to the size of
  410. * the <from> buffer.  On return, <pFromLen> contains the actual size of the
  411. * address stored in <from>.
  412. *
  413. * The <pLen> parameter indicates the number of bytes requested by the caller.
  414. * If the operation is successful, the number of bytes received is
  415. * copied to <pLen>.
  416. *
  417. * You may OR the following values into the <flags> parameter with this
  418. * operation:
  419. *
  420. * .iP "MSG_OOB (0x1)" 26
  421. * Out-of-band data.
  422. * .iP "MSG_PEEK (0x2)" 
  423. * Return data without removing it from socket.  
  424. * .LP
  425. * Once the user application is finished with the zbuf, zbufDelete() should
  426. * be called to return the zbuf memory buffer to the VxWorks network stack.
  427. *
  428. * VXWORKS AE PROTECTION DOMAINS
  429. * Under VxWorks AE, you can call this function from within the kernel 
  430. * protection domain only.  In addition, all arguments to this function can  
  431. * reference only that data which is valid in the kernel protection domain. 
  432. * This restriction does not apply under non-AE versions of VxWorks.  
  433. *
  434. * RETURNS:
  435. * The zbuf ID of a newly created zbuf containing the received message,
  436. * or NULL if the operation fails.
  437. */
  438. ZBUF_ID zbufSockRecvfrom
  439.     (
  440.     int s, /* socket to receive from */
  441.     int flags, /* flags to underlying protocols */
  442.     int * pLen, /* number of bytes requested/returned */
  443.     struct sockaddr * from, /* where to copy sender's addr */
  444.     int * pFromLen /* value/result length of <from> */
  445.     )
  446.     {
  447.     SOCK_FUNC * pSockFunc = sockFdtosockFunc(s);
  448.     if (pSockFunc == NULL || pSockFunc->zbufRtn == NULL ||
  449. (pSockFunc->zbufRtn)() == FALSE)
  450. {
  451. netErrnoSet (ENOTSUP);
  452. return (NULL);
  453. }
  454.     return ((pZbufSockFunc->recvfromRtn == NULL) ? NULL :
  455. (ZBUF_ID) (pZbufSockFunc->recvfromRtn) (s, flags, pLen,
  456. from, pFromLen));
  457.     }