[DAPL2] DAPL Counters & 2.0.3 extensions to support counter retrieval.
[mirror/winof/.git] / ulp / dapl2 / dapl / udapl / dapl_evd_create.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_evd_create.c\r
31  *\r
32  * PURPOSE: EVENT management\r
33  *\r
34  * Description: Interfaces in this file are completely defined in \r
35  *              the uDAPL 1.1 API, Chapter 6, section 3\r
36  *\r
37  * $Id:$\r
38  **********************************************************************/\r
39 \r
40 #include "dapl.h"\r
41 #include "dapl_evd_util.h"\r
42 \r
43 /*\r
44  * dapl_evd_create\r
45  *\r
46  * DAPL Requirements Version xxx, 6.3.2.1\r
47  *\r
48  * Create and instance of Event Dispatcher.\r
49  *\r
50  * Input:\r
51  *    ia_handle\r
52  *    cno_handle\r
53  *    evd_min_qlen\r
54  *    evd_flags\r
55  *\r
56  * Output:\r
57  *    evd_handle\r
58  *\r
59  * Returns:\r
60  *     DAT_SUCCESS\r
61  *     DAT_INSUFFICIENT_RESOURCES\r
62  *     DAT_INVALID_PARAMETER\r
63  */\r
64 \r
65 /* ** REVISIT **\r
66  *\r
67  * Selecting the cqe handing domain must still be done.\r
68  * We *probably* want one per hca, but we could have one\r
69  * per provider or one per consumer.\r
70  */\r
71 /* Note that if there already is a cq, it is not deleted\r
72  * even if it is not required. However, it will not be armed.\r
73  */\r
74 \r
75 DAT_RETURN DAT_API dapl_evd_create (\r
76     IN    DAT_IA_HANDLE         ia_handle,\r
77     IN    DAT_COUNT             evd_min_qlen,\r
78     IN    DAT_CNO_HANDLE        cno_handle,\r
79     IN    DAT_EVD_FLAGS         evd_flags,\r
80     OUT   DAT_EVD_HANDLE        *evd_handle )\r
81 {\r
82     DAPL_IA             *ia_ptr;\r
83     DAPL_EVD            *evd_ptr;\r
84     DAPL_CNO            *cno_ptr;\r
85     DAT_RETURN          dat_status;\r
86     DAT_PROVIDER_ATTR   provider_attr;\r
87     int                 i;\r
88     int                 j;\r
89     int                 flag_mask[6];\r
90 \r
91     dapl_dbg_log (DAPL_DBG_TYPE_API,\r
92                   "dapl_evd_create (%p, %d, %p, 0x%x, %p)\n", \r
93                   ia_handle, \r
94                   evd_min_qlen, \r
95                   cno_handle, \r
96                   evd_flags, \r
97                   evd_handle);\r
98 \r
99     ia_ptr      = (DAPL_IA *)ia_handle;\r
100     cno_ptr     = (DAPL_CNO *)cno_handle;\r
101     evd_ptr     = NULL;\r
102     *evd_handle = NULL;\r
103     dat_status  = DAT_SUCCESS;\r
104 \r
105     if (DAPL_BAD_HANDLE (ia_handle, DAPL_MAGIC_IA))\r
106     {\r
107         dat_status = DAT_ERROR (DAT_INVALID_HANDLE,DAT_INVALID_HANDLE_IA);\r
108         goto bail;\r
109     }\r
110 \r
111     DAPL_CNTR(ia_ptr, DCNT_IA_EVD_CREATE);\r
112 \r
113     if ( evd_min_qlen <= 0 )\r
114     {\r
115         dat_status = DAT_ERROR (DAT_INVALID_PARAMETER,DAT_INVALID_ARG2);\r
116         goto bail;\r
117     }\r
118     if ( evd_min_qlen > ia_ptr->hca_ptr->ia_attr.max_evd_qlen )\r
119     {\r
120         dat_status = DAT_ERROR (DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_TEVD);\r
121         goto bail;\r
122     }\r
123 \r
124     if (cno_handle != DAT_HANDLE_NULL\r
125         && DAPL_BAD_HANDLE(cno_handle, DAPL_MAGIC_CNO)) \r
126     {\r
127         dat_status = DAT_ERROR (DAT_INVALID_HANDLE,DAT_INVALID_HANDLE_CNO);\r
128         goto bail;\r
129     }\r
130 \r
131     /*\r
132      * Check the merging attributes to ensure the combination of\r
133      * flags requested is supported.\r
134      */\r
135     dapl_ia_query (ia_handle, NULL,\r
136                    0, NULL,\r
137                    DAT_PROVIDER_FIELD_ALL, &provider_attr);\r
138     \r
139     /* Set up an array of flags to compare against; the EVD bits are\r
140      * a sparse array that need to be mapped to the merging flags\r
141      */\r
142     flag_mask[0] = DAT_EVD_SOFTWARE_FLAG;\r
143     flag_mask[1] = DAT_EVD_CR_FLAG;\r
144     flag_mask[2] = DAT_EVD_DTO_FLAG;\r
145     flag_mask[3] = DAT_EVD_CONNECTION_FLAG;\r
146     flag_mask[4] = DAT_EVD_RMR_BIND_FLAG;\r
147     flag_mask[5] = DAT_EVD_ASYNC_FLAG;\r
148 \r
149     for (i = 0; i < 6; i++)\r
150     {\r
151         if (flag_mask[i] & evd_flags)\r
152         {\r
153             for (j = 0; j < 6; j++)\r
154             {\r
155                 if (flag_mask[j] & evd_flags)\r
156                 {\r
157                     if (provider_attr.evd_stream_merging_supported[i][j] == DAT_FALSE)\r
158                     {\r
159                         dat_status = DAT_ERROR (DAT_INVALID_PARAMETER,DAT_INVALID_ARG4);\r
160                         goto bail;\r
161                     }\r
162                 }\r
163             } /* end for j */\r
164         }\r
165     } /* end for i */\r
166 \r
167     dat_status = dapls_evd_internal_create (ia_ptr, \r
168                                           cno_ptr, \r
169                                           evd_min_qlen, \r
170                                           evd_flags,\r
171                                           &evd_ptr);\r
172     if (dat_status != DAT_SUCCESS)\r
173     {\r
174         goto bail;\r
175     }\r
176 \r
177     evd_ptr->evd_state = DAPL_EVD_STATE_OPEN;\r
178 \r
179     *evd_handle = (DAT_EVD_HANDLE) evd_ptr;\r
180 \r
181 bail:\r
182     if (dat_status != DAT_SUCCESS)\r
183     {\r
184         if (evd_ptr)\r
185         {\r
186             dapl_evd_free (evd_ptr);\r
187         }\r
188     }\r
189 \r
190     dapl_dbg_log (DAPL_DBG_TYPE_RTN,\r
191                   "dapl_evd_create () returns 0x%x\n", \r
192                   dat_status);\r
193 \r
194     return dat_status;\r
195 }\r