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

VxWorks

开发平台:

C/C++

  1. /* m2TcpLib.c - MIB-II TCP-group API for SNMP agents */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01f,15oct01,rae  merge from truestack ver 01j, base 01e (VIRTUAL_STACK)
  8. 01e,08mar97,vin  added changes to accomodate changes in pcb structure.
  9. 01d,25jan95,jdi  doc cleanup.
  10. 01c,11nov94,rhp  edit man pages
  11. 01b,10nov94,rhp  fixed typo in m2TcpInit man page
  12. 01a,08dec93,jag  written
  13. */
  14. /*
  15. DESCRIPTION
  16. This library provides MIB-II services for the TCP group.  It provides routines
  17. to initialize the group, access the group global variables, read the table
  18. of TCP connections, and change the state of a TCP connection.  For a broader
  19. description of MIB-II services, see the manual entry for m2Lib.
  20. To use this feature, include the following component:
  21. INCLUDE_MIB2_TCP
  22. USING THIS LIBRARY
  23. This library can be initialized and deleted by calling m2TcpInit() and
  24. m2TcpDelete() respectively, if only the TCP group's services are needed.
  25. If full MIB-II support is used, this group and all other groups can be
  26. initialized and deleted by calling m2Init() and m2Delete().
  27. The group global variables are accessed by calling
  28. m2TcpGroupInfoGet() as follows:
  29. .CS
  30.     M2_TCP   tcpVars;
  31.     if (m2TcpGroupInfoGet (&tcpVars) == OK)
  32. /@ values in tcpVars are valid @/
  33. .CE
  34. The TCP table of connections can be accessed in lexicographical order.  The
  35. first entry in the table can be accessed by setting the table index to
  36. zero.  Every other entry thereafter can be accessed by passing to
  37. m2TcpConnTblEntryGet() the index retrieved in the previous invocation
  38. incremented to the next lexicographical value by giving
  39. M2_NEXT_VALUE as the search parameter.  For example:
  40. .CS
  41. M2_TCPCONNTBL  tcpEntry;
  42.     /@ Specify a zero index to get the first entry in the table @/
  43.     tcpEntry.tcpConnLocalAddress = 0; /@ Local IP address in host byte order @/
  44.     tcpEntry.tcpConnLocalPort    = 0; /@ Local TCP port                    @/
  45.     tcpEntry.tcpConnRemAddress   = 0; /@ remote IP address                 @/
  46.     tcpEntry.tcpConnRemPort      = 0; /@ remote TCP port in host byte order  @/
  47.     /@ get the first entry in the table @/
  48.     if ((m2TcpConnTblEntryGet (M2_NEXT_VALUE, &tcpEntry) == OK)
  49. /@ values in tcpEntry in the first entry are valid  @/
  50.     /@ process first entry in the table @/
  51.     /@ 
  52.      * For the next call, increment the index returned in the previous call.
  53.      * The increment is to the next possible lexicographic entry; for
  54.      * example, if the returned index was 147.11.46.8.2000.147.11.46.158.1000
  55.      * the index passed in the next invocation should be 
  56.      * 147.11.46.8.2000.147.11.46.158.1001.  If an entry in the table
  57.      * matches the specified index, then that entry is returned.  
  58.      * Otherwise the closest entry following it, in lexicographic order,
  59.      * is returned.
  60.      @/
  61.     /@ get the second entry in the table @/
  62.     if ((m2TcpConnTblEntryGet (M2_NEXT_VALUE, &tcpEntry) == OK)
  63. /@ values in tcpEntry in the second entry are valid  @/
  64. .CE
  65. The TCP table of connections allows only for a connection to be deleted as
  66. specified in the MIB-II.  For example: 
  67. .CS
  68.     M2_TCPCONNTBL  tcpEntry;
  69.     /@ Fill in the index for the connection to be deleted in the table @/
  70.     /@ Local IP address in host byte order, and local port number @/
  71.     tcpEntry.tcpConnLocalAddress = 0x930b2e08;
  72.     tcpEntry.tcpConnLocalPort    = 3000;
  73.     /@ Remote IP address in host byte order, and remote port number @/
  74.     tcpEntry.tcpConnRemAddress   = 0x930b2e9e;
  75.     tcpEntry.tcpConnRemPort      = 3000;
  76.     tcpEntry.tcpConnState        = 12; /@ MIB-II state value for delete @/
  77.     /@ set the entry in the table @/
  78.     if ((m2TcpConnTblEntrySet (&tcpEntry) == OK)
  79. /@ tcpEntry deleted successfuly @/
  80. .CE
  81. INCLUDE FILES: m2Lib.h
  82.  
  83. SEE ALSO:
  84. m2Lib, m2IfLib, m2IpLib, m2IcmpLib, m2UdpLib, m2SysLib
  85. */
  86. /* includes */
  87. #include "vxWorks.h"
  88. #include "m2Lib.h"
  89. #include <socket.h>
  90. #include <net/route.h>
  91. #include <netinet/in.h>
  92. #include <netinet/tcp.h>
  93. #include <netinet/tcp_timer.h>
  94. #include <netinet/tcp_fsm.h>
  95. #include <netinet/tcp_var.h>
  96. #include <netinet/tcp_timer.h>
  97. #include <netinet/in_pcb.h>
  98. #include <net/protosw.h>
  99. #include <private/iosLibP.h>
  100. #ifdef VIRTUAL_STACK
  101. #include "netinet/vsLib.h"
  102. #endif
  103. /* defines */
  104. /* MIB-II TCP state definitions */
  105. #define M2TCP_CLOSED        1
  106. #define M2TCP_LISTEN        2
  107. #define M2TCP_SYNSENT       3
  108. #define M2TCP_SYNRECEIVED   4
  109. #define M2TCP_ESTABLISHED   5
  110. #define M2TCP_FINWAIT1      6
  111. #define M2TCP_FINWAIT2      7
  112. #define M2TCP_CLOSEWAIT     8
  113. #define M2TCP_LASTACK       9
  114. #define M2TCP_CLOSING       10
  115. #define M2TCP_TIMEWAIT      11
  116. #define M2TCP_DELETETCB     12
  117. /* globals */
  118. /* 
  119.  * This table maps the BSD TCP states to the MIB-II TCP specified states. The
  120.  * table is indexed using the BSD TCP states.
  121.  */
  122. LOCAL long m2TcpStates [TCP_NSTATES] =
  123. {
  124. M2TCP_CLOSED,            /* TCPS_CLOSED       -> M2TCP_CLOSED */
  125. M2TCP_LISTEN,            /* TCPS_LISTEN       -> M2TCP_LISTEN */
  126. M2TCP_SYNSENT,           /* TCPS_SYN_SENT     -> M2TCP_SYNSENT */
  127. M2TCP_SYNRECEIVED,       /* TCPS_SYN_RECEIVED -> M2TCP_SYNRECEIVED */
  128. M2TCP_ESTABLISHED,       /* TCPS_ESTABLISHED  -> M2TCP_ESTABLISHED */
  129. M2TCP_CLOSEWAIT,         /* TCPS_CLOSE_WAIT   -> M2TCP_CLOSEWAIT */
  130. M2TCP_FINWAIT1,          /* TCPS_FIN_WAIT_1   -> M2TCP_FINWAIT1  */
  131. M2TCP_CLOSING,           /* TCPS_CLOSING      -> M2TCP_CLOSING */
  132. M2TCP_LASTACK,           /* TCPS_LAST_ACK     -> M2TCP_LASTACK */
  133. M2TCP_FINWAIT2,          /* TCPS_FIN_WAIT_2   -> M2TCP_FINWAIT2 */
  134.         M2TCP_TIMEWAIT,          /* TCPS_TIME_WAIT    -> M2TCP_TIMEWAIT */
  135. };
  136. /*******************************************************************************
  137. *
  138. * m2TcpInit - initialize MIB-II TCP-group access
  139. *
  140. * This routine allocates the resources needed to allow access to the TCP 
  141. * MIB-II variables.  This routine must be called before any TCP variables
  142. * can be accessed.
  143. *
  144. * RETURNS: OK, always.
  145. *
  146. * SEE ALSO: 
  147. * m2TcpGroupInfoGet(), m2TcpConnEntryGet(), m2TcpConnEntrySet(), m2TcpDelete()
  148. */
  149. STATUS m2TcpInit (void)
  150.     {
  151.     return (OK);
  152.     }
  153. /******************************************************************************
  154. *
  155. * m2TcpGroupInfoGet - get MIB-II TCP-group scalar variables
  156. *
  157. * This routine fills in the TCP structure pointed to by <pTcpInfo> with the
  158. * values of MIB-II TCP-group scalar variables.
  159. *
  160. * RETURNS: OK, or ERROR if <pTcpInfo> is not a valid pointer.
  161. *
  162. * ERRNO:
  163. * S_m2Lib_INVALID_PARAMETER
  164. *
  165. * SEE ALSO: 
  166. * m2TcpInit(), m2TcpConnEntryGet(), m2TcpConnEntrySet(), m2TcpDelete()
  167. */
  168. STATUS m2TcpGroupInfoGet
  169.     (
  170.     M2_TCPINFO * pTcpInfo  /* pointer to the TCP group structure */
  171.     )
  172.     {
  173.     int            netLock;     /* Use to secure the Network Code Access */
  174.     struct inpcb * pInpCb; /* Ptr to an internet control block */
  175.     struct tcpcb * pTcpCb; /* Ptr to a TCP connection control block */
  176.  
  177.     /* Validate Pointer to TCP structure */
  178.  
  179.     if (pTcpInfo == NULL)
  180. {
  181. errnoSet (S_m2Lib_INVALID_PARAMETER);
  182.         return (ERROR);
  183. }
  184.  
  185.     netLock = splnet ();        /* Get exclusive access to Network Code */
  186.     /* Traverse the list of TCP control block and count the # of connections */
  187. #ifdef VIRTUAL_STACK
  188.     /*
  189.      * To avoid introducing a conflict with the "tcpcb" structure tag,
  190.      * virtual stacks do not alias the head of the pcb list.
  191.      */
  192.     for (pInpCb = tcb.lh_first, pTcpInfo->tcpCurrEstab = 0;
  193. #else
  194.     for (pInpCb = tcpcb.lh_first, pTcpInfo->tcpCurrEstab = 0;
  195. #endif /* VIRTUAL_STACK */
  196.          pInpCb != NULL; pInpCb = pInpCb->inp_list.le_next)
  197.         {
  198.         /* Get TCP Connection control structure */
  199.  
  200.         pTcpCb = (struct tcpcb *) pInpCb->inp_ppcb;
  201.  
  202.         if ((pTcpCb->t_state == TCPS_ESTABLISHED) ||
  203.             (pTcpCb->t_state == TCPS_CLOSE_WAIT))
  204.             pTcpInfo->tcpCurrEstab++;
  205.         }
  206.  
  207.     splx (netLock);             /* Give up exclusive access to Network Code */
  208.  
  209.     pTcpInfo->tcpRtoAlgorithm           = M2_tcpRtoAlgorithm_vanj;
  210.     pTcpInfo->tcpRtoMin                 = (TCPTV_MIN * 1000) / PR_SLOWHZ;
  211.     pTcpInfo->tcpRtoMax                 = (TCPTV_REXMTMAX * 1000) / PR_SLOWHZ;
  212.  
  213.     /* The Maximum number of TCP connections is determined Dynamically == -1 */
  214.  
  215.     pTcpInfo->tcpMaxConn                = -1;
  216.  
  217.     pTcpInfo->tcpActiveOpens            = tcpstat.tcps_connattempt;
  218.     pTcpInfo->tcpPassiveOpens           = tcpstat.tcps_accepts;
  219.     pTcpInfo->tcpAttemptFails           = tcpstat.tcps_conndrops;
  220.     pTcpInfo->tcpEstabResets            = tcpstat.tcps_drops;
  221.     pTcpInfo->tcpInSegs                 = tcpstat.tcps_rcvtotal;
  222.  
  223.     pTcpInfo->tcpOutSegs                = tcpstat.tcps_sndtotal -
  224.                                           tcpstat.tcps_sndrexmitpack -
  225.                                           tcpstat.tcps_persisttimeo;
  226.  
  227.     pTcpInfo->tcpRetransSegs            = tcpstat.tcps_sndrexmitpack;
  228.  
  229.     pTcpInfo->tcpInErrs                 = tcpstat.tcps_rcvbadsum +
  230.                                           tcpstat.tcps_rcvbadoff +
  231.                                           tcpstat.tcps_rcvshort;
  232. #ifdef VIRTUAL_STACK
  233.     /*
  234.      * (Former) tcpOutRsts global renamed for virtual stacks to prevent
  235.      * name conflict with existing structure element.
  236.      */
  237.     pTcpInfo->tcpOutRsts                = tcpOutResets;
  238. #else
  239.     pTcpInfo->tcpOutRsts                = tcpOutRsts;
  240. #endif
  241.     return (OK);
  242.     }
  243. /******************************************************************************
  244. *
  245. * tcpConnCmp -  compare two TCP connections in lexicographical order
  246. *
  247. * This routine compares two TCP connection control blocks.  It compares the
  248. * value 1 with value 2.  It returns equal, value 1 greater than 
  249. * value 2, or value 1 less than value 2.  The comparison is done based on the
  250. * lexicographical order specified by MIB-II.
  251. *
  252. * RETURNS: 0 = equal, 1 > greater than, and -1 < less than.
  253. *
  254. * SEE ALSO: N/A
  255. */
  256. LOCAL int tcpConnCmp
  257.     (
  258.     M2_TCPCONNTBL * pConnVal1, /* pointer to control block (Compare againts) */
  259.     M2_TCPCONNTBL * pConnVal2 /* pointer to control block (Second entry) */
  260.     )
  261.     {
  262.     int result;
  263. /* Comparison of two unsigned values */
  264.         if (pConnVal1->tcpConnLocalAddress > pConnVal2->tcpConnLocalAddress)
  265.             {
  266.             return 1;                   /* First Entry is Greater */
  267.             }
  268.  
  269.         if (pConnVal1->tcpConnLocalAddress < pConnVal2->tcpConnLocalAddress)
  270.             {
  271.             return -1;                  /* First Entry is Smaller */
  272.             }
  273. /* Comparison of two signed values */
  274.         result = pConnVal1->tcpConnLocalPort - pConnVal2->tcpConnLocalPort;
  275.  
  276.         if (result != 0)
  277.             return (result); /* Value > 0 or < 0 */
  278.  
  279. /* Comparison of two unsigned values */
  280.         if (pConnVal1->tcpConnRemAddress > pConnVal2->tcpConnRemAddress)
  281.             {
  282.             return 1;                   /* First Entry is Greater */
  283.             }
  284.  
  285.         if (pConnVal1->tcpConnRemAddress < pConnVal2->tcpConnRemAddress)
  286.             {
  287.             return -1;                  /* First Entry is Smaller */
  288.             }
  289.  
  290.         /* Result will determine Equal, Less than or Greater than */
  291.  
  292.         return (pConnVal1->tcpConnRemPort - pConnVal2->tcpConnRemPort);
  293.     }
  294. /******************************************************************************
  295. *
  296. * m2TcpConnEntryGet - get a MIB-II TCP connection table entry
  297. *
  298. * This routine traverses the TCP table of users and does an
  299. * M2_EXACT_VALUE or a M2_NEXT_VALUE search based on the
  300. * <search> parameter (see m2Lib).  The calling routine is responsible
  301. * for supplying a valid MIB-II entry index in the input structure
  302. * <pReqTcpConnEntry>.  The index is made up of the local IP address,
  303. * the local port number, the remote IP address, and the remote port.
  304. * The first entry in the table is retrieved by doing a M2_NEXT_VALUE
  305. * search with the index fields set to zero.
  306. *
  307. * RETURNS: 
  308. * OK, or ERROR if the input parameter is not specified or a
  309. * match is not found.
  310. *
  311. * ERRNO:
  312. *  S_m2Lib_INVALID_PARAMETER
  313. *  S_m2Lib_ENTRY_NOT_FOUND
  314. *
  315. * SEE ALSO:
  316. * m2Lib, m2TcpInit(), m2TcpGroupInfoGet(), m2TcpConnEntrySet(), m2TcpDelete()
  317. */
  318. STATUS m2TcpConnEntryGet
  319.     (
  320.     int             search,             /* M2_EXACT_VALUE or M2_NEXT_VALUE */
  321.     M2_TCPCONNTBL * pReqTcpConnEntry    /* input = Index, Output = Entry */
  322.     )
  323.     {
  324.     M2_TCPCONNTBL   savedEntry; /* Use to save the table entry to return */
  325.     M2_TCPCONNTBL   tableEntry; /* Use to test an entry in the table */
  326.     int              netLock;   /* Use to secure the Network Code Access */
  327.     struct inpcb   * pPcb;      /* Pointer to an entry in TCP Connection List */
  328.  
  329.     /* Validate Pointer to TCP Table Entry structure */
  330.  
  331.     if (pReqTcpConnEntry == NULL)
  332. {
  333. errnoSet (S_m2Lib_INVALID_PARAMETER);
  334.         return (ERROR);
  335. }
  336.     /* Setup structure used in the search for the requested TCP entry */
  337.     savedEntry.tcpConnState        =  TCP_NSTATES;  /* Invalid TCP State */
  338.     savedEntry.tcpConnLocalAddress = -1;     /* Largest local IP Addr */
  339.     savedEntry.tcpConnLocalPort    = -1;     /* Largest local port */ 
  340.     savedEntry.tcpConnRemAddress   = -1;     /* Largest Remote IP Addr */
  341.     savedEntry.tcpConnRemPort      = -1;     /* Largest Remote Port */
  342.  
  343.     netLock = splnet ();        /* Get exclusive access to Network Code */
  344.     /* 
  345.      * Traverse the circular list of TCP control blocks.  The first item in the
  346.      * list is a dummy header, skip it and used it as the loop exit condition.
  347.      */
  348. #ifdef VIRTUAL_STACK
  349.     /*
  350.      * To avoid introducing a conflict with the "tcpcb" structure tag,
  351.      * virtual stacks do not alias the head of the pcb list.
  352.      */
  353.     for (pPcb = tcb.lh_first; pPcb != NULL; pPcb = pPcb->inp_list.le_next)
  354. #else
  355.     for (pPcb = tcpcb.lh_first; pPcb != NULL; pPcb = pPcb->inp_list.le_next)
  356. #endif
  357.         {
  358.  
  359. /* Convert control block format into a more convenient format */
  360.         tableEntry.tcpConnLocalAddress = ntohl(pPcb->inp_laddr.s_addr);
  361.         tableEntry.tcpConnLocalPort    = ntohs(pPcb->inp_lport);
  362.         tableEntry.tcpConnRemAddress   = ntohl(pPcb->inp_faddr.s_addr);
  363.         tableEntry.tcpConnRemPort      = ntohs(pPcb->inp_fport);
  364.  
  365.         if (search == M2_EXACT_VALUE &&
  366.     (tcpConnCmp(&tableEntry, pReqTcpConnEntry) == 0))
  367.             {
  368.     /* Match, map the connection state to MIB-II format and exit */
  369.             pReqTcpConnEntry->tcpConnState =
  370.     m2TcpStates [((struct tcpcb *) pPcb->inp_ppcb)->t_state];
  371.  
  372.             splx (netLock);      /* Give up exclusive access to Network Code */
  373.             return (OK);
  374.             }
  375.         else
  376.             {
  377.             /*
  378.              * A NEXT search is satisfied by an entry that is lexicographicaly
  379.              * greater than the input TCP connection entry.  Because the TCP 
  380.      * connection list is not in order, the list must be traverse 
  381.      * completly before a selection is made.  The rules for a 
  382.      * lexicographicaly comparison are built in the routine tcpConnCmp.
  383.              */  
  384.             if ((tcpConnCmp(&tableEntry, pReqTcpConnEntry) >= 0) &&
  385.                 (tcpConnCmp(&tableEntry, &savedEntry) < 0))
  386.                 {
  387.                 savedEntry.tcpConnLocalAddress = ntohl(pPcb->inp_laddr.s_addr);
  388.                 savedEntry.tcpConnLocalPort    = ntohs(pPcb->inp_lport);
  389.                 savedEntry.tcpConnRemAddress   = ntohl(pPcb->inp_faddr.s_addr);
  390.                 savedEntry.tcpConnRemPort      = ntohs(pPcb->inp_fport);
  391. /* Save the connection state in BSD format */
  392.                 savedEntry.tcpConnState =
  393.                         ((struct tcpcb *) pPcb->inp_ppcb)->t_state;
  394.                 }
  395.             }
  396.         }
  397.  
  398.     splx (netLock);             /* Give up exclusive access to Network Code */
  399.  
  400.     if (savedEntry.tcpConnState == TCP_NSTATES)
  401. {
  402. errnoSet (S_m2Lib_ENTRY_NOT_FOUND);
  403.         return (ERROR);                 /* Requested Entry Not Found */
  404. }
  405.  
  406.     pReqTcpConnEntry->tcpConnState      = m2TcpStates [savedEntry.tcpConnState];
  407.     pReqTcpConnEntry->tcpConnLocalAddress = savedEntry.tcpConnLocalAddress;
  408.     pReqTcpConnEntry->tcpConnLocalPort    = savedEntry.tcpConnLocalPort;
  409.     pReqTcpConnEntry->tcpConnRemAddress   = savedEntry.tcpConnRemAddress;
  410.     pReqTcpConnEntry->tcpConnRemPort      = savedEntry.tcpConnRemPort;
  411.  
  412.     return (OK);
  413.     }
  414. /******************************************************************************
  415. *
  416. * m2TcpConnEntrySet -  set a TCP connection to the closed state
  417. *
  418. * This routine traverses the TCP connection table and searches for the
  419. * connection specified by the input parameter <pReqTcpConnEntry>. The
  420. * calling routine is responsible for providing a valid index as the
  421. * input parameter <pReqTcpConnEntry>.  The index is made up of the
  422. * local IP address, the local port number, the remote IP address, and
  423. * the remote port.  This call can only succeed if the connection is in
  424. * the MIB-II state "deleteTCB" (12).  If a match is found, the socket
  425. * associated with the TCP connection is closed.
  426. *
  427. * RETURNS: 
  428. * OK, or ERROR if the input parameter is invalid, the state of the
  429. * connection specified at <pReqTcpConnEntry> is not "closed,"
  430. * the specified connection is not found, a socket is not associated
  431. * with the connection, or the close() call fails.
  432. *
  433. * SEE ALSO: 
  434. * m2TcpInit(), m2TcpGroupInfoGet(), m2TcpConnEntryGet(), m2TcpDelete()
  435. */
  436. STATUS m2TcpConnEntrySet
  437.     (
  438.     M2_TCPCONNTBL * pReqTcpConnEntry  /* pointer to TCP connection  to close */
  439.     )
  440.     {
  441.     int               fdToClose;     /* Selected File Descriptor to close */
  442.     int               netLock;       /* Use to secure the Network Code Access */
  443.     struct inpcb    * pInp;      /* Pointer to BSD PCB list */
  444.     struct in_addr    loc_addr;      /* Local IP Address structure */
  445.     struct in_addr    rem_addr;      /* Remote IP Address structure */
  446.     unsigned short    locPort;
  447.     unsigned short    remPort;
  448.  
  449.     /* Validate Pointer to TCP Table Entry structure and operation  */
  450.  
  451.     if (pReqTcpConnEntry == NULL ||
  452.         pReqTcpConnEntry->tcpConnState != M2TCP_DELETETCB)
  453. {
  454. errnoSet (S_m2Lib_INVALID_PARAMETER);
  455.         return (ERROR);
  456. }
  457.  
  458.     /* Look for the Internet Control Block which maps to the TCP Entry */
  459.     locPort         = pReqTcpConnEntry->tcpConnLocalPort;
  460.     remPort         = pReqTcpConnEntry->tcpConnRemPort;
  461.  
  462.     loc_addr.s_addr = htonl(pReqTcpConnEntry->tcpConnLocalAddress);
  463.     locPort         = htons(locPort);
  464.     rem_addr.s_addr = htonl(pReqTcpConnEntry->tcpConnRemAddress);
  465.     remPort         = htons(remPort);
  466.  
  467.     netLock = splnet ();        /* Get exclusive access to Network Code */
  468.  
  469.     if ((pInp = in_pcblookup (&tcbinfo, rem_addr,
  470.       remPort, loc_addr, locPort, 0)) == NULL)
  471.         {
  472.         splx (netLock);         /* Give up exclusive access to Network Code */
  473. errnoSet (S_m2Lib_ENTRY_NOT_FOUND);
  474.         return (ERROR); /* Entry not found */
  475.         }
  476.  
  477.     splx (netLock);             /* Give up exclusive access to Network Code */
  478.  
  479.     /* Look for the FD to issue close in the File Descriptor Table */
  480.  
  481.     for (fdToClose = 0; fdToClose < maxFiles ; fdToClose++)
  482.         {
  483. #ifdef _WRS_VXWORKS_5_X
  484.             if (fdTable [fdToClose].value == (int) pInp->inp_socket)
  485. #else
  486.             if (fdTable [fdToClose] &&
  487.                 fdTable [fdToClose]->value == (int) pInp->inp_socket)
  488. #endif /* _WRS_VXWORKS_5_X */
  489.             
  490.                 break;
  491.         }
  492.  
  493.     if (fdToClose >= maxFiles)
  494. {
  495. errnoSet (S_m2Lib_TCPCONN_FD_NOT_FOUND);
  496.         return (ERROR);
  497. }
  498.  
  499.     /* Issue Close */
  500.     fdToClose = STD_FIX(fdToClose);
  501.  
  502.     return (close (fdToClose));
  503.     }
  504. /*******************************************************************************
  505. *
  506. * m2TcpDelete - delete all resources used to access the TCP group
  507. *
  508. * This routine frees all the resources allocated at the time the group was
  509. * initialized.  The TCP group should not be accessed after this routine has been
  510. * called.
  511. *
  512. * RETURNS: OK, always.
  513. *
  514. * SEE ALSO: 
  515. * m2TcpInit(), m2TcpGroupInfoGet(), m2TcpConnEntryGet(), m2TcpConnEntrySet() 
  516. */
  517. STATUS m2TcpDelete (void)
  518.     {
  519.     return (OK);
  520.     }