[ND] reinstate '-i' to install 'default' ND service provider IBAL; reinstate '-r...
[mirror/winof/.git] / tools / ndinstall / user / installsp.c
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
4  * Copyright (c) 2009 Intel Corp, Inc.  All rights reserved.\r
5  *\r
6  * This software is available to you under the OpenIB.org BSD license\r
7  * below:\r
8  *\r
9  *     Redistribution and use in source and binary forms, with or\r
10  *     without modification, are permitted provided that the following\r
11  *     conditions are met:\r
12  *\r
13  *      - Redistributions of source code must retain the above\r
14  *        copyright notice, this list of conditions and the following\r
15  *        disclaimer.\r
16  *\r
17  *      - Redistributions in binary form must reproduce the above\r
18  *        copyright notice, this list of conditions and the following\r
19  *        disclaimer in the documentation and/or other materials\r
20  *        provided with the distribution.\r
21  *\r
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
23  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
24  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
25  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
26  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
27  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
28  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
29  * SOFTWARE.\r
30  *\r
31  * $Id$\r
32  */\r
33 \r
34 /*\r
35  *      Module Name: installsp.c\r
36  *      Description: This module installs/removes the NetworkDirect provider for infiniband.\r
37  *      execute:\r
38  *      To install the service provider\r
39  *              installsp -i\r
40  *      To remove the service provider\r
41  *              installsp -r\r
42  */\r
43 \r
44 #include <winsock2.h>\r
45 #include <ws2tcpip.h>\r
46 #include <ws2spi.h>\r
47 #include <stdio.h>\r
48 #include <string.h>\r
49 #include "..\..\..\..\etc\user\getopt.c"\r
50 \r
51 #ifndef PFL_NETWORKDIRECT_PROVIDER\r
52 #define PFL_NETWORKDIRECT_PROVIDER          0x00000010\r
53 #endif\r
54 \r
55 /* Initialize the LSP's provider path for Infiniband Service Provider dll */\r
56 #define IBAL_INDEX                      0\r
57 #define IBAL_DEBUG_INDEX        1\r
58 #define WV_INDEX                        2\r
59 #define WV_DEBUG_INDEX          3\r
60 #define MAX_INDEX                       4\r
61 \r
62 #define DEFAULT_PROVIDER_INDEX IBAL_INDEX\r
63 \r
64 static int g_index=DEFAULT_PROVIDER_INDEX;\r
65 \r
66 static const char * const provider_name[MAX_INDEX] = {\r
67         "IBAL", "IBAL (debug)", "WinVerbs", "WinVerbs (debug)"\r
68 };\r
69 \r
70 static const WCHAR * const provider_path[MAX_INDEX] = {\r
71         L"%SYSTEMROOT%\\system32\\ibndprov.dll",\r
72         L"%SYSTEMROOT%\\system32\\ibndprov.dll",\r
73         L"%SYSTEMROOT%\\system32\\wvndprov.dll",\r
74         L"%SYSTEMROOT%\\system32\\wvndprovd.dll"\r
75 };\r
76 \r
77 static const WCHAR * const provider_desc[MAX_INDEX] = {\r
78         L"OpenFabrics Network Direct Provider",\r
79         L"OpenFabrics Network Direct Provider (Debug)",\r
80         L"OpenFabrics Winverbs Network Direct Provider",\r
81         L"OpenFabrics Winverbs Network Direct Provider (Debug)"\r
82 };\r
83 \r
84 static GUID provider_guid[MAX_INDEX] = {\r
85         // {52CDAA00-29D0-46be-8FC6-E51D7075C338}\r
86         { 0x52CDAA00, 0x29D0, 0x46be, { 0x8f, 0xc6, 0xe5, 0x1d, 0x70, 0x75, 0xc3, 0x38 } },\r
87         // {52CDAA00-29D0-46be-8FC6-E51D7075C338}\r
88         { 0x52CDAA00, 0x29D0, 0x46be, { 0x8f, 0xc6, 0xe5, 0x1d, 0x70, 0x75, 0xc3, 0x38 } },\r
89         // {854DCE83-C872-4462-A3EB-C961C40E59D0}\r
90         { 0x854dce83, 0xc872, 0x4462, { 0xa3, 0xeb, 0xc9, 0x61, 0xc4, 0x0e, 0x59, 0xd0 } },\r
91         // {1B8F1692-EDD9-4153-A159-605A73BCFFCF}\r
92         { 0x1b8f1692, 0xedd9, 0x4153, { 0xa1, 0x59, 0x60, 0x5a, 0x73, 0xbc, 0xff, 0xcf } }\r
93 };\r
94 \r
95 #ifdef _WIN64\r
96 #define WSCInstallProvider      WSCInstallProvider64_32\r
97 #endif  /* _WIN64 */\r
98 \r
99 static void\r
100 show_usage (char *progname)\r
101 {\r
102         char drv[_MAX_DRIVE];\r
103         char dir[_MAX_DIR];\r
104         char fname[_MAX_FNAME];\r
105         char ext[_MAX_EXT];\r
106 \r
107         _splitpath(progname,drv,dir,fname,ext); // sad basename() equivalent.\r
108 \r
109         printf("usage: %s%s\n",fname,ext);\r
110         printf("\tRemove, install and list OFA NetworkDirect providers\n\n");\r
111         printf("\t[-[i|r] [provider]] Install/remove the specified/default"\r
112                         " provider\n");\r
113         printf("\t[-d]                Install/remove debug version of provider\n");\r
114         printf("\t[-l]                list OFA ND providers\n");\r
115         printf("\t[-q]                Suppress default listing of providers\n");\r
116         printf("\t[-h]                This text\n");\r
117         printf("\tprovider must be one of the following names:\n");\r
118         printf("\t\tibal\n");\r
119         printf("\t\twinverbs\n");\r
120         printf("\t\t<blank> use the default ND provider '%s'\n",\r
121                 provider_name[DEFAULT_PROVIDER_INDEX]);\r
122 }\r
123 \r
124 \r
125 static void print_providers(void)\r
126 {\r
127         WSAPROTOCOL_INFOW *protocol_info;\r
128         unsigned int protocol_count;\r
129         unsigned int i;\r
130         DWORD protocol_size;\r
131         INT err_no;\r
132         int rc;\r
133 \r
134         /* Find the size of the buffer */\r
135         protocol_size = 0;\r
136         rc = WSCEnumProtocols (NULL, NULL, &protocol_size, &err_no);\r
137         if (rc == SOCKET_ERROR && err_no != WSAENOBUFS) {\r
138                 printf("WSCEnumProtocols() returned error (%d)\n", err_no);\r
139                 return;\r
140         }\r
141 \r
142         protocol_info = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, protocol_size);\r
143         if (protocol_info == NULL) {\r
144                 printf("HeapAlloc() failed\n");\r
145                 return;\r
146         }\r
147 \r
148         /* Enumerate the catalog for real */\r
149         rc = WSCEnumProtocols (NULL, protocol_info, &protocol_size, &err_no);\r
150         if (rc == SOCKET_ERROR) {\r
151                 printf("WSCEnumProtocols returned error for real enumeration (%d)\n",\r
152                          err_no);\r
153                 HeapFree (GetProcessHeap (), 0, protocol_info);\r
154                 return;\r
155         }\r
156 \r
157         protocol_count = rc;\r
158 \r
159         printf("\nCurrent providers:\n");\r
160         for (i = 0; i < protocol_count; i++) {\r
161                 printf ("\t%010d - %S\n", protocol_info[i].dwCatalogEntryId,\r
162                                 protocol_info[i].szProtocol);\r
163         }\r
164 \r
165         HeapFree (GetProcessHeap (), 0, protocol_info);\r
166 \r
167         return;\r
168 }\r
169 \r
170 /*\r
171  * Function: install_provider\r
172  *   Description: installs the service provider\r
173  *\r
174  * Note: most of the information setup here comes from "MSDN Home >\r
175  * MSDN Library > Windows Development > Network Devices and\r
176  * Protocols > Design Guide > System Area Networks > Windows Sockets\r
177  * Direct > Windows Sockets Direct Component Operation > Installing\r
178  * Windows Sockets Direct Components".\r
179  * The direct link is http://msdn.microsoft.com/library/default.asp?url=/library/en-us/network/hh/network/wsdp_2xrb.asp\r
180  */\r
181 static int install_provider(void)\r
182 {\r
183         int rc, err_no;\r
184         WSAPROTOCOL_INFOW provider;\r
185 \r
186         /* Setup the values in PROTOCOL_INFO */\r
187         provider.dwServiceFlags1 = \r
188                 XP1_GUARANTEED_DELIVERY | \r
189                 XP1_GUARANTEED_ORDER | \r
190                 XP1_MESSAGE_ORIENTED |\r
191                 XP1_CONNECT_DATA;  /*XP1_GRACEFUL_CLOSE;*/\r
192         provider.dwServiceFlags2 = 0;   /* Reserved */\r
193         provider.dwServiceFlags3 = 0;   /* Reserved */\r
194         provider.dwServiceFlags4 = 0;   /* Reserved */\r
195         provider.dwProviderFlags = PFL_HIDDEN | PFL_NETWORKDIRECT_PROVIDER;\r
196         provider.ProviderId = provider_guid[g_index];\r
197         provider.dwCatalogEntryId = 0;\r
198         provider.ProtocolChain.ChainLen = 1;    /* Base Protocol Service Provider */\r
199         provider.iVersion = 1;\r
200         if (g_index == IBAL_INDEX || g_index == IBAL_DEBUG_INDEX) {\r
201                 provider.iAddressFamily = AF_INET;\r
202                 provider.iMaxSockAddr = sizeof(SOCKADDR_IN);\r
203         } else {\r
204                 provider.iAddressFamily = AF_INET6;\r
205                 provider.iMaxSockAddr = sizeof(SOCKADDR_IN6);\r
206         }\r
207         provider.iMinSockAddr = 16;\r
208         provider.iSocketType = -1;\r
209         provider.iProtocol = 0;\r
210         provider.iProtocolMaxOffset = 0;\r
211         provider.iNetworkByteOrder = BIGENDIAN;\r
212         provider.iSecurityScheme = SECURITY_PROTOCOL_NONE;\r
213         provider.dwMessageSize = 0xFFFFFFFF; /* IB supports 32-bit lengths for data transfers on RC */\r
214         provider.dwProviderReserved = 0;\r
215         wcscpy( provider.szProtocol, provider_desc[g_index] );\r
216 \r
217         printf("\nInstalling %s provider: ", provider_name[g_index]);\r
218         rc = WSCInstallProvider(\r
219                 &provider_guid[g_index], provider_path[g_index], &provider, 1, &err_no );\r
220         if( rc == SOCKET_ERROR )\r
221         {\r
222                 if( err_no == WSANO_RECOVERY )\r
223                         printf("already installed\n");\r
224                 else\r
225                         printf("WSCInstallProvider failed: %d\n", err_no);\r
226                         rc = err_no;\r
227         } else {\r
228                 printf("successful\n");\r
229                 rc = 0;\r
230         }\r
231         return rc;\r
232 }\r
233 \r
234 /*\r
235  * Function: remove_provider\r
236  *   Description: removes our provider.\r
237  */\r
238 static int remove_provider(void)\r
239 {\r
240         int rc=0, err_no, rc1;\r
241 \r
242         /* Remove from the catalog */\r
243         printf("\nRemoving %s provider: ", provider_name[g_index]);\r
244         rc1 = WSCDeinstallProvider(&provider_guid[g_index], &err_no);\r
245         if (rc1 == SOCKET_ERROR) {\r
246                 printf ("WSCDeinstallProvider failed: %d\n", err_no);\r
247                 rc1 = err_no;\r
248         } else {\r
249                 printf ("successful\n");\r
250                 rc1 = 0;\r
251         }\r
252 \r
253 #ifdef _WIN64\r
254         /* Remove from the 32-bit catalog too! */\r
255         printf("Removing 32-bit %s provider: ", provider_name[g_index]);\r
256         rc = WSCDeinstallProvider32(&provider_guid[g_index], &err_no);\r
257         if (rc == SOCKET_ERROR) {\r
258                 printf ("WSCDeinstallProvider32 failed: %d\n", err_no);\r
259                 rc = err_no;\r
260         } else {\r
261                 printf ("successful\n");\r
262                 rc = 0;\r
263         }\r
264 #endif  /* _WIN64 */\r
265         if ( rc || rc1 )\r
266                 return (rc ? rc : rc1);\r
267         return 0;\r
268 }\r
269 \r
270 static int get_prov_index(char *name)\r
271 {\r
272         int i;\r
273 \r
274         if ( !name )\r
275                 return 0; /* assumes global 'g_index' set to default provider index. */\r
276 \r
277         for (i = 0; i < MAX_INDEX; i++) {\r
278                 if (!_stricmp(provider_name[i], name)) {\r
279                         g_index = i;\r
280                         return 0;\r
281                 }\r
282         }\r
283         return -1;\r
284 }\r
285 \r
286 int __cdecl main (int argc, char *argv[])\r
287 {\r
288         int ret=0, op;\r
289         int install = 0, remove = 0, debug = 0, quiet = 0;\r
290         WSADATA wsd;\r
291         char *prov;\r
292 \r
293         while ((op = getopt(argc, argv, "hi::r::dlq")) != -1) {\r
294                 switch (op) {\r
295                 case 'h':\r
296                                 goto usage;\r
297                 case 'i':\r
298                         if (install || remove || get_prov_index(optarg)) {\r
299                                 goto usage;\r
300                         }\r
301                         install = 1;\r
302                         break;\r
303                 case 'r':\r
304                         if (install || remove || get_prov_index(optarg)) {\r
305                                 goto usage;\r
306                         }\r
307                         remove = 1;\r
308                         break;\r
309                 case 'd':\r
310                         debug = 1;\r
311                         break;\r
312                 case 'l':\r
313                         quiet = 0;\r
314                         break;\r
315                 case 'q':\r
316                         quiet = 1;\r
317                         break;\r
318                 default:\r
319                         goto usage;\r
320                 }\r
321         }\r
322 \r
323         g_index += debug;\r
324 \r
325         if (WSAStartup (MAKEWORD (2, 2), &wsd) != 0) {\r
326                 printf ("InstallSP: Unable to load Winsock: %d\n", GetLastError ());\r
327                 return -1;\r
328         }\r
329 \r
330         if (LOBYTE (wsd.wVersion) != 2 || HIBYTE (wsd.wVersion) != 2) {\r
331                 WSACleanup ();\r
332                 printf("InstallSP: Unable to find a usable version of Winsock DLL\n");\r
333                 ret = -1;\r
334                 goto exit;\r
335         }\r
336 \r
337         if (install) {\r
338                 ret = install_provider();\r
339         } else if (remove) {\r
340                 ret = remove_provider();\r
341         }\r
342 \r
343         if (quiet == 0)\r
344                 print_providers();\r
345 \r
346 exit:\r
347         WSACleanup();\r
348         return ret;\r
349 \r
350 usage:\r
351         show_usage(argv[0]);\r
352         return -1;\r
353 }\r