netBufLib.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:19k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* netBufLib.h - network buffers header header file */
  2. /* Copyright 1984 - 2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01o,05jun02,vvv  added M_EOB flag (SPR #72213)
  7. 01n,26mar02,vvv  added M_PROXY flag (SPR #74518)
  8. 01m,10oct01,rae  merge from truestack ver 01q base 01l
  9. 01l,24mar99,ann  protected some #defines by #ifndefs due to conflicts
  10.                  in project facility (all the ones defined in 00network.cdf)
  11. 01k,16mar99,spm  recovered orphaned code from tor1_0_1.sens1_1 (SPR #25770)
  12. 01j,08oct98,gnn  updated system network buffer allocations
  13. 01i,11dec97,vin  added prototype for netMblkOffsetToBufCopy part of SPR 9563.
  14. 01h,08dec97,vin  added prototype for netMblkChainDup SPR 9966.
  15. 01g,03dec97,vin  added prototype for netTupleGet(), added NUM_SYS_xxx defines
  16. 01f,13nov97,vin  added error codes and cleanup.
  17. 01e,08oct97,vin  corrected clBlkFree()
  18. 01d,30sep96,vin  added M_BLK_SZ.
  19. 01c,26sep97,vin  added NUM_XXX_MIN macros for bootroms.
  20. 01b,19sep97,vin  added cluster Blk typedef, optimized mBlk structure.
  21.  moved mExt structure out of the mBlk structure.
  22. 01a,08aug97,vin  written.
  23. */
  24. #ifndef __INCnetBufLibh
  25. #define __INCnetBufLibh
  26. #ifdef __cplusplus
  27. extern "C" {
  28. #endif
  29. #if CPU_FAMILY==I960
  30. #pragma align 1 /* tell gcc960 not to optimize alignments */
  31. #endif /* CPU_FAMILY==I960 */
  32. /* status codes */
  33. #define S_netBufLib_MEMSIZE_INVALID (M_netBufLib | 1)
  34. #define S_netBufLib_CLSIZE_INVALID (M_netBufLib | 2)
  35. #define S_netBufLib_NO_SYSTEM_MEMORY (M_netBufLib | 3)
  36. #define S_netBufLib_MEM_UNALIGNED (M_netBufLib | 4)
  37. #define S_netBufLib_MEMSIZE_UNALIGNED (M_netBufLib | 5)
  38. #define S_netBufLib_MEMAREA_INVALID (M_netBufLib | 6)
  39. #define S_netBufLib_MBLK_INVALID (M_netBufLib | 7)
  40. #define S_netBufLib_NETPOOL_INVALID (M_netBufLib | 8)
  41. #define S_netBufLib_INVALID_ARGUMENT (M_netBufLib | 9)
  42. #define S_netBufLib_NO_POOL_MEMORY (M_netBufLib | 10)
  43. #ifndef NUM_NET_MBLKS
  44. #define NUM_NET_MBLKS 400 /* no. mBlks to initialize */
  45. #endif  /* NUM_NET_MBLKS */
  46. #define MAX_MBLK_TYPES 256 /* max number of mBlk types */
  47. /* data clusters used by the network stack */
  48. #ifndef NUM_64
  49. #define NUM_64 100 /* no. 64 byte clusters */
  50. #endif  /* NUM_64 */
  51. #ifndef NUM_128
  52. #define NUM_128 100 /* no. 128 byte clusters */
  53. #endif  /* NUM_128 */
  54. #ifndef NUM_256
  55. #define NUM_256 40 /* no. 256 byte clusters */
  56. #endif  /* NUM_256 */
  57. #ifndef NUM_512
  58. #define NUM_512 40 /* no. 512 byte clusters */
  59. #endif  /* NUM_512 */
  60. #ifndef NUM_1024
  61. #define NUM_1024 25 /* no. 1024 byte clusters */
  62. #endif  /* NUM_1024 */
  63. #ifndef NUM_2048
  64. #define NUM_2048 25 /* no. 2048 byte clusters */
  65. #endif  /* NUM_2048 */
  66. #ifndef NUM_CL_BLKS
  67. #define NUM_CL_BLKS (NUM_64 + NUM_128 + NUM_256 +      
  68.  NUM_512 + NUM_1024 + NUM_2048)
  69. #endif  /* NUM_CL_BLKS */
  70. /* data clusters for a minimal configuration */
  71. #define NUM_NET_MBLKS_MIN 200 /* no. mBlks to initialize */
  72. #define NUM_64_MIN 50 /* no. 64 byte clusters */
  73. #define NUM_128_MIN 50 /* no. 128 byte clusters */
  74. #define NUM_256_MIN 10 /* no. 256 byte clusters */
  75. #define NUM_512_MIN 10 /* no. 512 byte clusters */
  76. #define NUM_1024_MIN 20 /* no. 1024 byte clusters */
  77. #define NUM_CL_BLKS_MIN (NUM_64_MIN + NUM_128_MIN + 
  78.  NUM_256_MIN + NUM_512_MIN + 
  79.                                          NUM_1024_MIN)
  80. /* system clusters for routes, interface addresses, pcbs, sockets, etc. */
  81. /* This is 61440 bytes and should allow us to open the default number */
  82. /* of sockets which is 50 (NUM_FILES) */
  83.  
  84. #ifndef NUM_SYS_64
  85. #define NUM_SYS_64 64 /*  64 byte system clusters */
  86. #endif /* NUM_SYS_64 */
  87. #ifndef NUM_SYS_128
  88. #define NUM_SYS_128 64 /* 128 byte system clusters */
  89. #endif /* NUM_SYS_128 */
  90. #ifndef NUM_SYS_256
  91. #define NUM_SYS_256 64 /* 256 byte system clusters */
  92. #endif  /* NUM_SYS_256 */
  93. #ifndef NUM_SYS_512
  94. #define NUM_SYS_512 64 /* 512 byte system clusters */
  95. #endif  /* NUM_SYS_512 */
  96. #ifndef NUM_SYS_CL_BLKS
  97. #define NUM_SYS_CL_BLKS (NUM_SYS_64  + NUM_SYS_128 + 
  98.  NUM_SYS_256 + NUM_SYS_512)
  99. #endif  /* NUM_SYS_CL_BLKS */
  100. #ifndef NUM_SYS_MBLKS
  101. #define NUM_SYS_MBLKS (2 * NUM_SYS_CL_BLKS)
  102. #endif  /* NUM_SYS_MBLKS */
  103. /* system clusters for a minimal configuration */
  104. #define NUM_SYS_64_MIN 20 /*  64 byte system clusters */
  105. #define NUM_SYS_128_MIN 15 /* 128 byte system clusters */
  106. #define NUM_SYS_256_MIN 15 /* 256 byte system clusters */
  107. #define NUM_SYS_512_MIN 10 /* 512 byte system clusters */
  108. #define NUM_SYS_CL_BLKS_MIN (NUM_SYS_64_MIN  + NUM_SYS_128_MIN + 
  109.  NUM_SYS_256_MIN + NUM_SYS_512_MIN)
  110. #define NUM_SYS_MBLKS_MIN NUM_SYS_CL_BLKS_MIN
  111. /* cluster defines */
  112. #define CL_LOG2_64 6
  113. #define CL_LOG2_128 7
  114. #define CL_LOG2_256 8
  115. #define CL_LOG2_512 9
  116. #define CL_LOG2_1024 10
  117. #define CL_LOG2_2048 11
  118. #define CL_LOG2_4096   12
  119. #define CL_LOG2_8192  13
  120. #define CL_LOG2_16384 14
  121. #define CL_LOG2_32768 15
  122. #define CL_LOG2_65536 16
  123. #define CL_SIZE_64 64
  124. #define CL_SIZE_128 128
  125. #define CL_SIZE_256 256
  126. #define CL_SIZE_512 512
  127. #define CL_SIZE_1024 1024
  128. #define CL_SIZE_2048 2048
  129. #define CL_SIZE_4096 4096
  130. #define CL_SIZE_8192 8192
  131. #define CL_SIZE_16384 16384
  132. #define CL_SIZE_32768 32768
  133. #define CL_SIZE_65536 65536
  134. #define CL_LOG2_MIN CL_LOG2_64
  135. #define CL_LOG2_MAX CL_LOG2_65536
  136. #define CL_SIZE_MAX (1 << CL_LOG2_MAX)
  137. #define CL_SIZE_MIN (1 << CL_LOG2_MIN)
  138. #define CL_INDX_MIN 0
  139. #define CL_INDX_MAX (CL_LOG2_MAX - CL_LOG2_MIN)
  140. #define CL_TBL_SIZE (CL_INDX_MAX + 1)
  141. #define CL_LOG2_TO_CL_INDEX(x) ((x) - CL_LOG2_MIN)
  142. #define CL_LOG2_TO_CL_SIZE(x) (1 << (x))
  143. #define SIZE_TO_LOG2(size) (ffsMsb((size)) - 1)
  144. #define CL_SIZE_TO_CL_INDEX(clSize)  (ffsMsb((clSize)) - (1 + CL_LOG2_MIN))
  145. /* mBlk types */
  146. #define MT_FREE 0 /* should be on free list */
  147. #define MT_DATA 1 /* dynamic (data) allocation */
  148. #define MT_HEADER 2 /* packet header */
  149. #define MT_SOCKET 3 /* socket structure */
  150. #define MT_PCB 4 /* protocol control block */
  151. #define MT_RTABLE 5 /* routing tables */
  152. #define MT_HTABLE 6 /* IMP host tables */
  153. #define MT_ATABLE 7 /* address resolution tables */
  154. #define MT_SONAME 8 /* socket name */
  155. #define MT_ZOMBIE       9       /* zombie proc status */
  156. #define MT_SOOPTS 10 /* socket options */
  157. #define MT_FTABLE 11 /* fragment reassembly header */
  158. #define MT_RIGHTS 12 /* access rights */
  159. #define MT_IFADDR 13 /* interface address */
  160. #define MT_CONTROL 14 /* extra-data protocol message */
  161. #define MT_OOBDATA 15 /* expedited data  */
  162. #define MT_IPMOPTS 16 /* internet multicast options */
  163. #define MT_IPMADDR 17 /* internet multicast address */
  164. #define MT_IFMADDR 18 /* link-level multicast address */
  165. #define MT_MRTABLE 19 /* multicast routing tables */
  166. #define NUM_MBLK_TYPES 20 /* number of mBlk types defined */
  167. /* mBlk flags */
  168. #define M_EXT 0x01 /* has an associated cluster */
  169. #define M_PKTHDR 0x02 /* start of record */
  170. #define M_EOR 0x04 /* end of record */
  171. #define M_FORWARD       0x08    /* packet to be forwarded */
  172. /* mBlk pkthdr flags, also in mFlags */
  173. #define M_BCAST 0x10 /* send/received as link-level broadcast */
  174. #define M_MCAST 0x20 /* send/received as link-level multicast */
  175. #define M_PROXY         0x40    /* broadcast forwarded through proxy */
  176. #define M_SECURE_PKT    0x80   /* already gone through security check */ 
  177. /*
  178.  * M_EOB is set when the mblk contains the last part of a large block of
  179.  * data sent by an application using TCP (a large block of data is one
  180.  * which causes sosend to issue multiple protocol send requests).
  181.  * M_EOB and M_PROXY can be used together since M_EOB is only used above
  182.  * IP and M_PROXY is only used at IP level. It is important to clear the
  183.  * M_EOB flag before the packet is sent to IP for transmission.
  184.  */
  185. #define M_EOB           M_PROXY
  186. /* flags to mClGet/mBlkGet */
  187. #define M_DONTWAIT 1 /* dont wait if buffers not available */
  188. #define M_WAIT 0 /* wait if buffers not available */
  189. /* length to copy to copy all data from the mBlk chain*/
  190. #define M_COPYALL 1000000000
  191. /* check to see if an mBlk is associated with a cluster */
  192. #define M_HASCL(pMblk) ((pMblk)->mBlkHdr.mFlags & M_EXT)
  193. #define M_BLK_SZ sizeof(struct mBlk)  /* size of an mBlk */
  194. #define MSIZE M_BLK_SZ /* size of an mBlk */
  195. #define CL_BLK_SZ sizeof(struct clBlk) /* size of cluster block */
  196. /* macro to get to the net pool ptr from the mBlk */
  197. #define MBLK_TO_NET_POOL(pMblk) (*(NET_POOL_ID *)((int)pMblk - sizeof(int)))
  198. /* macro to get to the cluster pool ptr from the cluster buffer */
  199. #define CL_BUF_TO_CL_POOL(pClBuf) (*(CL_POOL_ID *)((int)pClBuf - sizeof(int)))
  200. /* macro to get to the cluster reference count from the cluster buffer */
  201. #define CL_BUF_TO_REFCNT(pClBuf)  (UCHAR *)((int)pClBuf - (2 * sizeof(int)))
  202. /* macros for accessing the functions of net pool directly */
  203. #define poolInit(poolId,pMclBlkConfig,pClDescTbl,tblNumEnt,fromKheap)
  204.      (*(((NET_POOL_ID)(poolId))->pFuncTbl->pInitRtn)) 
  205.                  ((poolId), (pMclBlkConfig), (pClDescTbl), (tblNumEnt), 
  206.   (fromKheap))
  207.     
  208. #define mBlkFree(poolId,pMblk)
  209.      (*(((NET_POOL_ID)(poolId))->pFuncTbl->pMblkFreeRtn)) 
  210.                  ((poolId), (pMblk))
  211. #define clFree(poolId,pClBuf)
  212.      (*(((NET_POOL_ID)(poolId))->pFuncTbl->pClFreeRtn)) 
  213.                  ((poolId), (pClBuf))
  214. #define clBlkFree(poolId,pClBlk)
  215.      (*(((NET_POOL_ID)(poolId))->pFuncTbl->pClBlkFreeRtn)) 
  216.                  ((pClBlk))
  217.                     
  218. #define mBlkClFree(poolId,pMblk)
  219.      (*(((NET_POOL_ID)(poolId))->pFuncTbl->pMblkClFreeRtn)) 
  220.                  ((poolId), (pMblk))
  221. #define mBlkGet(poolId,canWait,type)
  222.                  (*(((NET_POOL_ID)(poolId))->pFuncTbl->pMblkGetRtn)) 
  223.                  ((poolId), (canWait), (type))
  224. #define clBlkGet(poolId,canWait)
  225.                  (*(((NET_POOL_ID)(poolId))->pFuncTbl->pClBlkGetRtn)) 
  226.                  ((poolId), (canWait))
  227.                     
  228. #define clusterGet(poolId,pClPool)
  229.      (*(((NET_POOL_ID)(poolId))->pFuncTbl->pClGetRtn)) 
  230.                  ((poolId), (pClPool))
  231.                     
  232. #define mClGet(poolId,pMblk,bufSize,canWait,bestFit)
  233.      (*(((NET_POOL_ID)(poolId))->pFuncTbl->pMblkClGetRtn)) 
  234.                  ((poolId), (pMblk), (bufSize), (canWait), (bestFit))
  235. #define clPoolIdGet(poolId,bufSize,bestFit)
  236.      (*(((NET_POOL_ID)(poolId))->pFuncTbl->pClPoolIdGetRtn))
  237.                  ((poolId), (bufSize), (bestFit))
  238. /*
  239.  * This structure is used to configure the number of mBlks and cluster blocks
  240.  * that are allocated in a netpool. Each cluster has a corresponding cluster
  241.  * block which manages it. An mBlk manages a cluster block and the cluster.
  242.  * When a netpool is configured there should as many cluster blocks as the
  243.  * cumulative number of clusters. The defaults are defined above, but the
  244.  * structure is defined and fileed in usrConfig.c. For TCP applications it is
  245.  * good to have two mBlks for every cluster block.
  246.  */
  247. typedef struct
  248.     {
  249.     int mBlkNum; /* number of mBlks */
  250.     int clBlkNum; /* number of cluster Blocks */
  251.     char *  memArea; /* pre allocated memory area */
  252.     int memSize; /* pre allocated memory size */
  253.     } M_CL_CONFIG;
  254. /*
  255.  *  This structure defines the way the networking code utilizes clusters.
  256.  *  A table of type CL_DESC is filled in usrNetwork.c. 
  257.  *  Clusters are also used to hold network data structures other than the 
  258.  *  regular data. The network data structures are routing table entries,
  259.  *  interface address structures, multicast address structures etc.
  260.  */
  261. typedef struct clDesc
  262.     {
  263.     int clSize; /* cluster type */
  264.     int clNum; /* number of clusters */
  265.     char * memArea; /* pre allocated memory area */
  266.     int memSize; /* pre allocated memory size */
  267.     } CL_DESC; 
  268. /* this structure defines the cluster */
  269. typedef struct clBuff
  270.     {
  271.     struct clBuff * pClNext;  /* pointer to the next clBuff */
  272.     } CL_BUF;
  273. typedef CL_BUF * CL_BUF_ID; 
  274. /* this structure defines the each cluster pool */
  275. typedef struct clPool
  276.     {
  277.     int clSize; /* cluster size */
  278.     int clLg2; /* cluster log 2 size */
  279.     int clNum;  /* number of clusters */
  280.     int clNumFree;  /* number of clusters free */
  281.     int clUsage; /* number of times used */
  282.     CL_BUF_ID pClHead; /* pointer to the cluster head */
  283.     struct netPool * pNetPool; /* pointer to the netPool */
  284.     } CL_POOL; 
  285. typedef CL_POOL * CL_POOL_ID; 
  286. /* header at beginning of each mBlk */
  287. typedef struct mHdr
  288.     {
  289.     struct mBlk * mNext; /* next buffer in chain */
  290.     struct mBlk * mNextPkt; /* next chain in queue/record */
  291.     char * mData; /* location of data */
  292.     int mLen; /* amount of data in this mBlk */
  293.     UCHAR mType; /* type of data in this mBlk */
  294.     UCHAR mFlags; /* flags; see below */
  295.     USHORT reserved; 
  296.     } M_BLK_HDR;
  297. /* record/packet header in first mBlk of chain; valid if M_PKTHDR set */
  298. typedef struct pktHdr
  299.     {
  300.     struct ifnet * rcvif; /* rcv interface */
  301.     int len; /* total packet length */
  302.     } M_PKT_HDR;
  303. typedef union clBlkList
  304.     {
  305.     struct clBlk *  pClBlkNext; /* pointer to the next clBlk */
  306.     char *  pClBuf; /* pointer to the buffer */
  307.     } CL_BLK_LIST;
  308.     
  309. /* description of external storage mapped into mBlk, valid if M_EXT set */
  310. typedef struct clBlk
  311.     {
  312.     CL_BLK_LIST  clNode; /* union of next clBlk, buffer ptr */
  313.     UINT clSize; /* cluster size */
  314.     int clRefCnt; /* reference count of the cluster */
  315.     FUNCPTR pClFreeRtn; /* pointer to cluster free routine */
  316.     int clFreeArg1; /* free routine arg 1 */
  317.     int clFreeArg2; /* free routine arg 2 */
  318.     int clFreeArg3; /* free routine arg 3 */
  319.     struct netPool * pNetPool; /* pointer to the netPool */
  320.     } CL_BLK;
  321. /* mBlk structure */
  322. typedef struct mBlk
  323.     {
  324.     M_BLK_HDR  mBlkHdr;  /* header */
  325.     M_PKT_HDR mBlkPktHdr; /* pkthdr */
  326.     CL_BLK * pClBlk; /* pointer to cluster blk */
  327.     } M_BLK;
  328. /* mBlk statistics used to show data pool by show routines */
  329. typedef struct mbstat
  330.     {
  331.     ULONG mNum; /* mBlks obtained from page pool */
  332.     ULONG mDrops; /* times failed to find space */
  333.     ULONG mWait; /* times waited for space */
  334.     ULONG mDrain; /* times drained protocols for space */
  335.     ULONG mTypes[256]; /* type specific mBlk allocations */
  336.     } M_STAT;
  337. typedef M_BLK *  M_BLK_ID;
  338. typedef CL_BLK * CL_BLK_ID;
  339. typedef struct netPool  NET_POOL;
  340. typedef struct poolFunc POOL_FUNC;
  341. typedef NET_POOL *  NET_POOL_ID;
  342. struct poolFunc /* POOL_FUNC */
  343.     {
  344.     /* pointer to the pool initialization routine */
  345.     STATUS (*pInitRtn) (NET_POOL_ID pNetPool, M_CL_CONFIG * pMclBlkConfig,
  346.                              CL_DESC * pClDescTbl, int clDescTblNumEnt,
  347.      BOOL fromKheap);
  348.     /* pointer to mBlk free routine */
  349.     void (*pMblkFreeRtn) (NET_POOL_ID pNetPool, M_BLK_ID pMblk);
  350.     /* pointer to cluster Blk free routine */
  351.     void (*pClBlkFreeRtn) (CL_BLK_ID pClBlk);
  352.     /* pointer to cluster free routine */
  353.     void (*pClFreeRtn) (NET_POOL_ID pNetPool, char * pClBuf);
  354.     /* pointer to mBlk/cluster pair free routine */
  355.     M_BLK_ID  (*pMblkClFreeRtn) (NET_POOL_ID pNetPool, M_BLK_ID pMblk);
  356.     /* pointer to mBlk get routine */
  357.     M_BLK_ID (*pMblkGetRtn) (NET_POOL_ID pNetPool, int canWait, UCHAR type);
  358.     /* pointer to cluster Blk get routine */
  359.     CL_BLK_ID (*pClBlkGetRtn) (NET_POOL_ID pNetPool, int canWait);
  360.     
  361.     /* pointer to a cluster buffer get routine */
  362.     char * (*pClGetRtn) (NET_POOL_ID pNetPool, CL_POOL_ID pClPool);
  363.     /* pointer to mBlk/cluster pair get routine */
  364.     STATUS (*pMblkClGetRtn) (NET_POOL_ID pNetPool, M_BLK_ID pMblk,
  365.                                   int bufSize, int canWait, BOOL bestFit);
  366.     /* pointer to cluster pool Id get routine */
  367.     CL_POOL_ID (*pClPoolIdGetRtn) (NET_POOL_ID pNetPool, int bufSize,
  368.                                     BOOL bestFit);
  369.     };
  370. struct netPool /* NET_POOL */
  371.     {
  372.     M_BLK_ID pmBlkHead; /* head of mBlks */
  373.     CL_BLK_ID pClBlkHead; /* head of cluster Blocks */
  374.     int mBlkCnt; /* number of mblks */
  375.     int mBlkFree; /* number of free mblks */
  376.     int clMask; /* cluster availability mask */
  377.     int clLg2Max; /* cluster log2 maximum size */
  378.     int clSizeMax; /* maximum cluster size */
  379.     int clLg2Min; /* cluster log2 minimum size */
  380.     int clSizeMin; /* minimum cluster size */
  381.     CL_POOL *  clTbl [CL_TBL_SIZE]; /* pool table */
  382.     M_STAT * pPoolStat; /* pool statistics */
  383.     POOL_FUNC * pFuncTbl; /* ptr to function ptr table */
  384.     };
  385. /* external declarations */                    
  386.                     
  387. IMPORT STATUS  netBufLibInit (void);
  388. IMPORT STATUS  netPoolInit (NET_POOL_ID pNetPool,
  389.                                      M_CL_CONFIG * pMclBlkConfig,
  390.                                      CL_DESC * pClDescTbl, int clDescTblNumEnt,
  391.                                      POOL_FUNC * pFuncTbl);
  392. IMPORT STATUS netPoolDelete (NET_POOL_ID);
  393. IMPORT void netMblkFree (NET_POOL_ID pNetPool, M_BLK_ID pMblk);
  394. IMPORT void netClBlkFree (NET_POOL_ID pNetPool, CL_BLK_ID pClBlk);
  395. IMPORT void  netClFree (NET_POOL_ID pNetPool, UCHAR * pClBuf);
  396. IMPORT M_BLK_ID  netMblkClFree (M_BLK_ID pMblk);
  397. IMPORT void netMblkClChainFree (M_BLK_ID pMblk);
  398. IMPORT M_BLK_ID  netMblkGet (NET_POOL_ID pNetPool, int canWait,
  399.                                     UCHAR type);
  400. IMPORT CL_BLK_ID netClBlkGet (NET_POOL_ID pNetPool, int canWait);
  401. IMPORT char *   netClusterGet (NET_POOL_ID pNetPool,
  402.                                        CL_POOL_ID pClPool);
  403. IMPORT STATUS    netMblkClGet (NET_POOL_ID pNetPool, M_BLK_ID pMblk,
  404.                                       int bufSize, int canWait, BOOL bestFit);
  405. IMPORT M_BLK_ID  netTupleGet (NET_POOL_ID pNetPool, int bufSize,
  406.                                      int canWait, UCHAR type, BOOL bestFit);
  407. IMPORT M_BLK_ID  netTupleGet2 (NET_POOL_ID, int, int);
  408. IMPORT CL_BLK_ID   netClBlkJoin (CL_BLK_ID pClBlk, char * pClBuf,
  409.                                       int size, FUNCPTR pFreeRtn, int arg1,
  410.                                       int arg2, int arg3);
  411. IMPORT M_BLK_ID   netMblkClJoin (M_BLK_ID pMblk, CL_BLK_ID pClBlk);
  412. IMPORT CL_POOL_ID  netClPoolIdGet (NET_POOL_ID pNetPool, int bufSize,
  413.                                         BOOL bestFit);
  414. IMPORT int  netMblkToBufCopy (M_BLK_ID pMblk, char * pBuf,
  415.                                           FUNCPTR pCopyRtn);
  416. IMPORT int netMblkOffsetToBufCopy (M_BLK_ID pMblk, int offset,
  417.                                                 char * pBuf, int len,
  418.                                                 FUNCPTR pCopyRtn);
  419. IMPORT M_BLK_ID  netMblkDup (M_BLK_ID pSrcMblk, M_BLK_ID pDestMblk);
  420. IMPORT M_BLK_ID  netMblkChainDup (NET_POOL_ID pNetPool, M_BLK_ID pMblk,
  421.                                          int offset, int len, int canWait);
  422. #if CPU_FAMILY==I960
  423. #pragma align 0 /* turn off alignment requirement */
  424. #endif /* CPU_FAMILY==I960 */
  425. #ifdef __cplusplus
  426. }
  427. #endif
  428. #endif /* __INCnetBufLibh */