6cadbb11ade5e221bb375a4a658ef8f800d58be6
[mirror/winof/.git] / ulp / libibmad / src / smp.c
1 /*\r
2  * Copyright (c) 2004-2007 Voltaire Inc.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenFabrics.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  */\r
29 \r
30 #if HAVE_CONFIG_H\r
31 #  include <config.h>\r
32 #endif /* HAVE_CONFIG_H */\r
33 \r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 \r
37 #if defined(_WIN32) || defined(_WIN64)\r
38 #include <windows.h>\r
39 #include <winsock2.h>\r
40 #else\r
41 #include <unistd.h>\r
42 #include <string.h>\r
43 #include <pthread.h>\r
44 #include <sys/time.h>\r
45 #endif\r
46 \r
47 #include <mad.h>\r
48 \r
49 #undef DEBUG\r
50 #define DEBUG   if (ibdebug)    IBWARN\r
51 \r
52 uint8_t *\r
53 smp_set_via(void *data, ib_portid_t *portid, unsigned attrid, unsigned mod, unsigned timeout, const void *srcport)\r
54 {\r
55         ib_rpc_t rpc = {0};\r
56 \r
57         DEBUG("attr 0x%x mod 0x%x route %s", attrid, mod, portid2str(portid));\r
58         if ((portid->lid <= 0) ||\r
59             (portid->drpath.drslid == 0xffff) ||\r
60             (portid->drpath.drdlid == 0xffff))\r
61                 rpc.mgtclass = IB_SMI_DIRECT_CLASS;     /* direct SMI */\r
62         else\r
63                 rpc.mgtclass = IB_SMI_CLASS;            /* Lid routed SMI */\r
64 \r
65         rpc.method = IB_MAD_METHOD_SET;\r
66         rpc.attr.id = attrid;\r
67         rpc.attr.mod = mod;\r
68         rpc.timeout = timeout;\r
69         rpc.datasz = IB_SMP_DATA_SIZE;\r
70         rpc.dataoffs = IB_SMP_DATA_OFFS;\r
71 \r
72         portid->sl = 0;\r
73         portid->qp = 0;\r
74 \r
75         if (srcport) {\r
76                 return mad_rpc(srcport, &rpc, portid, data, data);\r
77         } else {\r
78                 return madrpc(&rpc, portid, data, data);\r
79         }\r
80 }\r
81 \r
82 MAD_EXPORT uint8_t *\r
83 smp_set(void *data, ib_portid_t *portid, unsigned attrid, unsigned mod, unsigned timeout)\r
84 {\r
85         return smp_set_via(data, portid, attrid, mod, timeout, NULL);\r
86 }\r
87 \r
88 uint8_t *\r
89 smp_query_via(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod,\r
90               unsigned timeout, const void *srcport)\r
91 {\r
92         ib_rpc_t rpc = {0};\r
93 \r
94         DEBUG("attr 0x%x mod 0x%x route %s", attrid, mod, portid2str(portid));\r
95         rpc.method = IB_MAD_METHOD_GET;\r
96         rpc.attr.id = attrid;\r
97         rpc.attr.mod = mod;\r
98         rpc.timeout = timeout;\r
99         rpc.datasz = IB_SMP_DATA_SIZE;\r
100         rpc.dataoffs = IB_SMP_DATA_OFFS;\r
101 \r
102         if ((portid->lid <= 0) ||\r
103             (portid->drpath.drslid == 0xffff) ||\r
104             (portid->drpath.drdlid == 0xffff))\r
105                 rpc.mgtclass = IB_SMI_DIRECT_CLASS;     /* direct SMI */\r
106         else\r
107                 rpc.mgtclass = IB_SMI_CLASS;            /* Lid routed SMI */\r
108 \r
109         portid->sl = 0;\r
110         portid->qp = 0;\r
111 \r
112         if (srcport) {\r
113                 return mad_rpc(srcport, &rpc, portid, 0, rcvbuf);\r
114         } else {\r
115                 return madrpc(&rpc, portid, 0, rcvbuf);\r
116         }\r
117 }\r
118 \r
119 MAD_EXPORT uint8_t *\r
120 smp_query(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod,\r
121           unsigned timeout)\r
122 {\r
123         return smp_query_via(rcvbuf, portid, attrid, mod, timeout, NULL);\r
124 }\r