[DAPL2] DAPL Counters & 2.0.3 extensions to support counter retrieval.
[mirror/winof/.git] / ulp / dapl2 / dapl / udapl / dapl_init.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_init.c\r
31  *\r
32  * PURPOSE: Interface Adapter management\r
33  * Description: Interfaces in this file are completely described in\r
34  *              the DAPL 1.1 API, Chapter 6, section 2\r
35  *\r
36  * $Id:$\r
37  **********************************************************************/\r
38 \r
39 #include "dapl.h"\r
40 #include <dat/dat_registry.h> /* Provider API function prototypes */\r
41 #include "dapl_hca_util.h"\r
42 #include "dapl_init.h"\r
43 #include "dapl_provider.h"\r
44 #include "dapl_mr_util.h"\r
45 #include "dapl_osd.h"\r
46 #include "dapl_adapter_util.h"\r
47 #include "dapl_name_service.h"\r
48 #include "dapl_timer_util.h"\r
49 #include "dapl_vendor.h"\r
50 \r
51 \r
52 /*\r
53  * dapl_init\r
54  *\r
55  * initialize this provider\r
56  * includes initialization of all global variables\r
57  * as well as registering all supported IAs with the dat registry\r
58  *\r
59  * This function needs to be called once when the provider is loaded.\r
60  *\r
61  * Input:\r
62  *      none\r
63  *\r
64  * Output:\r
65  *      none\r
66  *\r
67  * Return Values:\r
68  */\r
69 void dapl_init ( void )\r
70 {\r
71     DAT_RETURN          dat_status;\r
72 \r
73     /* set up debug type */\r
74     g_dapl_dbg_type = dapl_os_get_env_val ( "DAPL_DBG_TYPE", \r
75                                             DAPL_DBG_TYPE_ERR | DAPL_DBG_TYPE_WARN);\r
76     /* set up debug destination */\r
77     g_dapl_dbg_dest = dapl_os_get_env_val ( "DAPL_DBG_DEST", \r
78                                             DAPL_DBG_DEST_STDOUT );\r
79 \r
80 #ifdef __linux__\r
81     /* open log file on first logging call if necessary */\r
82     if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG)\r
83         openlog("libdapl", LOG_ODELAY|LOG_PID|LOG_CONS, LOG_USER);\r
84 #endif\r
85         \r
86     dapl_log (DAPL_DBG_TYPE_UTIL, "dapl_init: dbg_type=0x%x,dbg_dest=0x%x\n",\r
87               g_dapl_dbg_type, g_dapl_dbg_dest);\r
88 \r
89     /* See if the user is on a loopback setup */\r
90     g_dapl_loopback_connection = dapl_os_get_env_bool ( "DAPL_LOOPBACK" );\r
91 \r
92     dapl_dbg_log (DAPL_DBG_TYPE_UTIL, "DAPL: %s Setting Loopback\n", \r
93                   g_dapl_loopback_connection ? "" : "NOT");\r
94 \r
95     /* initialize verbs library */\r
96     dapls_ib_init ();\r
97     \r
98     /* initialize the timer */\r
99     dapls_timer_init();\r
100 \r
101     /* Set up name services */\r
102     dat_status = dapls_ns_init ();\r
103     if (DAT_SUCCESS != dat_status)\r
104     {\r
105         dapl_dbg_log (DAPL_DBG_TYPE_ERR,\r
106                       "dapls_ns_init failed %d\n", dat_status);\r
107         goto bail;\r
108     }\r
109 \r
110     /* initialize the provider list */\r
111     dat_status = dapl_provider_list_create ();\r
112 \r
113     if (DAT_SUCCESS != dat_status)\r
114     {\r
115         dapl_dbg_log (DAPL_DBG_TYPE_ERR, \r
116                       "dapl_provider_list_create failed %d\n", dat_status);\r
117         goto bail;\r
118     }\r
119 \r
120     return;\r
121 \r
122 bail:\r
123     dapl_dbg_log (DAPL_DBG_TYPE_ERR, "ERROR: dapl_init failed\n");\r
124     return;\r
125 }\r
126 \r
127 \r
128 /*\r
129  * dapl_fini\r
130  *\r
131  * finalize this provider\r
132  * includes freeing of all global variables\r
133  * as well as deregistering all supported IAs from the dat registry\r
134  *\r
135  * This function needs to be called once when the provider is loaded.\r
136  *\r
137  * Input:\r
138  *      none\r
139  *\r
140  * Output:\r
141  *      none\r
142  *\r
143  * Return Values:\r
144  */\r
145 void dapl_fini ( void )\r
146 {\r
147     DAT_RETURN          dat_status;\r
148 \r
149     dapl_dbg_log (DAPL_DBG_TYPE_UTIL, "DAPL: ENTER (dapl_fini)\n");\r
150 \r
151     dat_status = dapl_provider_list_destroy ();\r
152     if (DAT_SUCCESS != dat_status)\r
153     {\r
154         dapl_dbg_log (DAPL_DBG_TYPE_ERR,\r
155                       "dapl_provider_list_destroy failed %d\n", dat_status);\r
156     }\r
157     \r
158     dapls_ib_release ();\r
159 \r
160     dapl_dbg_log (DAPL_DBG_TYPE_UTIL, "DAPL: Exit (dapl_fini)\n");\r
161 \r
162     return;\r
163 }\r
164 \r
165 \r
166 /*\r
167  *\r
168  * This function is called by the registry to initialize a provider\r
169  *\r
170  * The instance data string is expected to have the following form:\r
171  *\r
172  * <hca name> <port number>\r
173  *\r
174  */\r
175 void DAT_API\r
176 DAT_PROVIDER_INIT_FUNC_NAME (\r
177     IN const DAT_PROVIDER_INFO  *provider_info,\r
178     IN const char               *instance_data )\r
179 {\r
180     DAT_PROVIDER        *provider;\r
181     DAPL_HCA            *hca_ptr;\r
182     DAT_RETURN          dat_status;\r
183     char *              data;\r
184     char *              name;\r
185     char *              port;\r
186     unsigned int        len;\r
187     unsigned int        i;\r
188 \r
189     data = NULL;\r
190     provider = NULL;\r
191     hca_ptr = NULL;\r
192 \r
193 #if defined(_WIN32) || defined(_WIN64)\r
194     /* initialize DAPL library here as when called from DLL context in DLLmain()\r
195      * the IB (ibal) call hangs.\r
196      */\r
197     dapl_init();\r
198 #endif\r
199 \r
200     dat_status = dapl_provider_list_insert(provider_info->ia_name, &provider);\r
201     if ( DAT_SUCCESS != dat_status ) \r
202     {\r
203         dapl_dbg_log (DAPL_DBG_TYPE_ERR, \r
204                       "dat_provider_list_insert failed: %x\n", dat_status);\r
205         goto bail;\r
206     }\r
207 \r
208     data = dapl_os_strdup(instance_data);\r
209     if ( NULL == data )\r
210     {\r
211         goto bail;\r
212     }\r
213     \r
214     len = dapl_os_strlen(data);\r
215     \r
216     for ( i = 0; i < len; i++ )\r
217     {\r
218         if ( ' ' == data[i] ) \r
219         { \r
220             data[i] = '\0';\r
221             break; \r
222         }\r
223     }\r
224 \r
225     /* if the instance data did not have a valid format */\r
226     if ( i == len ) \r
227     {\r
228         goto bail;\r
229     }\r
230 \r
231     name = data;\r
232     port = data + (i + 1);\r
233 \r
234     hca_ptr = dapl_hca_alloc (name, port);\r
235     if ( NULL == hca_ptr )\r
236     {\r
237         dapl_dbg_log (DAPL_DBG_TYPE_ERR, "%s() dapl_hca_alloc failed?\n");\r
238         goto bail;\r
239     }\r
240     \r
241     provider->extension = hca_ptr;\r
242     dat_status = dat_registry_add_provider (provider, provider_info);\r
243     if ( DAT_SUCCESS != dat_status ) \r
244     {\r
245         dapl_dbg_log (DAPL_DBG_TYPE_ERR,\r
246                       "dat_registry_add_provider failed: %x\n", dat_status);\r
247     }\r
248 \r
249  bail:\r
250     if ( NULL != data )\r
251     {\r
252         dapl_os_free(data, len + 1);\r
253     }\r
254     \r
255     if ( DAT_SUCCESS != dat_status ) \r
256     {\r
257         if ( NULL != provider )\r
258         {\r
259             (void) dapl_provider_list_remove(provider_info->ia_name);\r
260         }\r
261         \r
262         if ( NULL != hca_ptr )\r
263         {\r
264             dapl_hca_free (hca_ptr);\r
265         }\r
266     }\r
267 }\r
268 \r
269 \r
270 /*\r
271  *\r
272  * This function is called by the registry to de-initialize a provider\r
273  *\r
274  */\r
275 void DAT_API\r
276 DAT_PROVIDER_FINI_FUNC_NAME (\r
277     IN const DAT_PROVIDER_INFO  *provider_info )\r
278 {\r
279     DAT_PROVIDER        *provider;\r
280     DAT_RETURN          dat_status;\r
281     \r
282     dat_status = dapl_provider_list_search(provider_info->ia_name, &provider);\r
283     if ( DAT_SUCCESS != dat_status ) \r
284     {\r
285         dapl_dbg_log (DAPL_DBG_TYPE_ERR,\r
286                       "dat_registry_add_provider failed: %x\n", dat_status);\r
287         return;\r
288     }\r
289     \r
290     dat_status = dat_registry_remove_provider (provider, provider_info);\r
291     if ( DAT_SUCCESS != dat_status ) \r
292     {\r
293         dapl_dbg_log (DAPL_DBG_TYPE_ERR,\r
294                       "dat_registry_add_provider failed: %x\n", dat_status);\r
295     }\r
296 \r
297     /*\r
298      * free HCA memory\r
299      */\r
300     dapl_hca_free (provider->extension);\r
301 \r
302     (void) dapl_provider_list_remove(provider_info->ia_name);\r
303 \r
304 #if defined(_WIN32) || defined(_WIN64)\r
305     /* cleanup DAPL library - relocated here from OSD DLL context as the IBAL\r
306      * calls hung in the DLL context?\r
307      */\r
308     dapl_fini();\r
309 #endif\r
310 }\r
311 \r
312 \r
313 /*\r
314  * Local variables:\r
315  *  c-indent-level: 4\r
316  *  c-basic-offset: 4\r
317  *  tab-width: 8\r
318  * End:\r
319  */\r