[DAPL2] DAPL Counters & 2.0.3 extensions to support counter retrieval.
[mirror/winof/.git] / ulp / dapl2 / dapl / common / dapl_rsp_free.c
1 /*\r
2  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
3  *\r
4  * This Software is licensed under one of the following licenses:\r
5  *\r
6  * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
7  *    available from the Open Source Initiative, see\r
8  *    http://www.opensource.org/licenses/cpl.php.\r
9  *\r
10  * 2) under the terms of the "The BSD License" a copy of which is\r
11  *    available from the Open Source Initiative, see\r
12  *    http://www.opensource.org/licenses/bsd-license.php.\r
13  *\r
14  * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
15  *    copy of which is available from the Open Source Initiative, see\r
16  *    http://www.opensource.org/licenses/gpl-license.php.\r
17  *\r
18  * Licensee has the right to choose one of the above licenses.\r
19  *\r
20  * Redistributions of source code must retain the above copyright\r
21  * notice and one of the license notices.\r
22  *\r
23  * Redistributions in binary form must reproduce both the above copyright\r
24  * notice, one of the license notices in the documentation\r
25  * and/or other materials provided with the distribution.\r
26  */\r
27 \r
28 /**********************************************************************\r
29  * \r
30  * MODULE: dapl_rsp_free.c\r
31  *\r
32  * PURPOSE: Connection management\r
33  * Description: Interfaces in this file are completely described in\r
34  *              the DAPL 1.1 API, Chapter 6, section 4\r
35  *\r
36  * $Id:$\r
37  **********************************************************************/\r
38 \r
39 #include "dapl.h"\r
40 #include "dapl_sp_util.h"\r
41 #include "dapl_ia_util.h"\r
42 #include "dapl_adapter_util.h"\r
43 \r
44 /*\r
45  * dapl_rsp_free\r
46  *\r
47  * uDAPL: User Direct Access Program Library Version 1.1, 6.4.3.5\r
48  *\r
49  * Destroy a specific instance of a Reserved Service Point.\r
50  *\r
51  * Input:\r
52  *      rsp_handle\r
53  *\r
54  * Output:\r
55  *      none\r
56  *\r
57  * Returns:\r
58  *      DAT_SUCCESS\r
59  *      DAT_INVALID_HANDLE\r
60  */\r
61 DAT_RETURN DAT_API\r
62 dapl_rsp_free (\r
63         IN      DAT_RSP_HANDLE     rsp_handle )\r
64 {\r
65     DAPL_IA             *ia_ptr;\r
66     DAPL_SP             *sp_ptr;\r
67     DAPL_EP             *ep_ptr;\r
68     DAT_RETURN          dat_status;\r
69 \r
70     dat_status = DAT_SUCCESS;\r
71 \r
72     sp_ptr = (DAPL_SP *) rsp_handle;\r
73     /*\r
74      * Verify handle\r
75      */\r
76     dapl_dbg_log (DAPL_DBG_TYPE_CM, \r
77                   ">>> dapl_rsp_free %p\n", \r
78                   rsp_handle);\r
79     if ( DAPL_BAD_HANDLE (sp_ptr, DAPL_MAGIC_RSP ) )\r
80     {\r
81         dat_status = DAT_ERROR (DAT_INVALID_HANDLE,DAT_INVALID_HANDLE_RSP);\r
82         goto bail;\r
83     }\r
84 \r
85     /* ia_ptr = (DAPL_IA *)sp_ptr->header.owner_ia; */\r
86     ia_ptr = sp_ptr->header.owner_ia;\r
87 \r
88     DAPL_CNTR(ia_ptr, DCNT_IA_RSP_FREE);        \r
89 \r
90     /*\r
91      * Remove the connection listener if there are no connections.  If\r
92      * we defer removing the sp it becomes something of a zombie\r
93      * container until disconnection, after which it will be cleaned up.\r
94      */\r
95     dapl_os_lock (&sp_ptr->header.lock);\r
96 \r
97     /*\r
98      * Make sure we don't leave a dangling EP. If the state is still\r
99      * RESERVED then the RSP still owns it.\r
100      */\r
101     ep_ptr = (DAPL_EP *)sp_ptr->ep_handle;\r
102     if ( ep_ptr != NULL && ep_ptr->param.ep_state == DAT_EP_STATE_RESERVED )\r
103     {\r
104         ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED;\r
105     }\r
106     sp_ptr->ep_handle = NULL;\r
107 \r
108     /* Release reference on EVD. If an error was encountered in a previous\r
109      * free the evd_handle will be NULL\r
110      */\r
111     if (sp_ptr->evd_handle)\r
112     {\r
113         dapl_os_atomic_dec (& ((DAPL_EVD *)sp_ptr->evd_handle)->evd_ref_count);\r
114         sp_ptr->evd_handle = NULL;\r
115     }\r
116 \r
117     /*\r
118      * Release the base resource if there are no outstanding connections;\r
119      * else the last disconnect on this RSP will free it up. The RSP\r
120      * is used to contain CR records for each connection, which \r
121      * contain information necessary to disconnect.\r
122      * sp_ptr->listening will be DAT_TRUE if there has never been a\r
123      * connection event, and DAT_FALSE if a connection attempt resulted\r
124      * in a reject.\r
125      */\r
126     if ( sp_ptr->cr_list_count == 0 )\r
127     {\r
128         /* This RSP has never been used. Clean it up */\r
129         sp_ptr->listening  = DAT_FALSE;\r
130         sp_ptr->state      = DAPL_SP_STATE_FREE;\r
131         dapl_os_unlock (&sp_ptr->header.lock);\r
132 \r
133         dat_status = dapls_ib_remove_conn_listener ( ia_ptr,\r
134                                                      sp_ptr );\r
135         if (dat_status != DAT_SUCCESS)\r
136         {\r
137             sp_ptr->state     = DAPL_SP_STATE_RSP_LISTENING;\r
138             goto bail;\r
139         }\r
140         dapls_ia_unlink_sp ( ia_ptr, sp_ptr );\r
141         dapls_sp_free_sp ( sp_ptr );\r
142     }\r
143     else\r
144     {\r
145         /* The RSP is now in the pending state, where it will sit until\r
146          * the connection terminates or the app uses the same\r
147          * ServiceID again, which will reactivate it.\r
148          */\r
149         sp_ptr->state = DAPL_SP_STATE_RSP_PENDING;\r
150         dapl_os_unlock (&sp_ptr->header.lock);\r
151     }\r
152 \r
153  bail:\r
154     return dat_status;\r
155 }\r
156 \r
157 /*\r
158  * Local variables:\r
159  *  c-indent-level: 4\r
160  *  c-basic-offset: 4\r
161  *  c-brace-offset: -4\r
162  *  tab-width: 8\r
163  * End:\r
164  */\r