0a6bd8bffeac37d5153a26db9e4177326e9f80e2
[mirror/winof/.git] / ulp / libibmad / src / gs.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 <infiniband/umad.h>\r
48 #include "mad.h"\r
49 \r
50 #undef DEBUG\r
51 #define DEBUG   if (ibdebug)    IBWARN\r
52 \r
53 static uint8_t *\r
54 pma_query_via(void *rcvbuf, ib_portid_t *dest, int port,\r
55               unsigned timeout, unsigned id, const void *srcport)\r
56 {\r
57         ib_rpc_t rpc = {0};\r
58         int lid = dest->lid;\r
59 \r
60         DEBUG("lid %d port %d", lid, port);\r
61 \r
62         if (lid == -1) {\r
63                 IBWARN("only lid routed is supported");\r
64                 return 0;\r
65         }\r
66 \r
67         rpc.mgtclass = IB_PERFORMANCE_CLASS;\r
68         rpc.method = IB_MAD_METHOD_GET;\r
69         rpc.attr.id = id;\r
70 \r
71         /* Same for attribute IDs */\r
72         mad_set_field(rcvbuf, 0, IB_PC_PORT_SELECT_F, port);\r
73         rpc.attr.mod = 0;\r
74         rpc.timeout = timeout;\r
75         rpc.datasz = IB_PC_DATA_SZ;\r
76         rpc.dataoffs = IB_PC_DATA_OFFS;\r
77 \r
78         dest->qp = 1;\r
79         if (!dest->qkey)\r
80                 dest->qkey = IB_DEFAULT_QP1_QKEY;\r
81 \r
82         if (srcport) {\r
83                 return mad_rpc(srcport, &rpc, dest, rcvbuf, rcvbuf);\r
84         } else {\r
85                 return madrpc(&rpc, dest, rcvbuf, rcvbuf);\r
86         }\r
87 }\r
88 \r
89 uint8_t *\r
90 pma_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout, unsigned id)\r
91 {\r
92         return pma_query_via(rcvbuf, dest, port, timeout, id, NULL);\r
93 }\r
94 \r
95 uint8_t *\r
96 perf_classportinfo_query_via(void *rcvbuf, ib_portid_t *dest, int port,\r
97                              unsigned timeout, const void *srcport)\r
98 {\r
99         return pma_query_via(rcvbuf, dest, port, timeout, CLASS_PORT_INFO,\r
100                              srcport);\r
101 }\r
102 \r
103 MAD_EXPORT uint8_t *\r
104 perf_classportinfo_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout)\r
105 {\r
106         return pma_query(rcvbuf, dest, port, timeout, CLASS_PORT_INFO);\r
107 }\r
108 \r
109 uint8_t *\r
110 port_performance_query_via(void *rcvbuf, ib_portid_t *dest, int port,\r
111                            unsigned timeout, const void *srcport)\r
112 {\r
113         return pma_query_via(rcvbuf, dest, port, timeout,\r
114                              IB_GSI_PORT_COUNTERS, srcport);\r
115 }\r
116 \r
117 MAD_EXPORT uint8_t *\r
118 port_performance_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout)\r
119 {\r
120         return pma_query(rcvbuf, dest, port, timeout, IB_GSI_PORT_COUNTERS);\r
121 }\r
122 \r
123 static uint8_t *\r
124 performance_reset_via(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,\r
125                       unsigned timeout, unsigned id, const void *srcport)\r
126 {\r
127         ib_rpc_t rpc = {0};\r
128         int lid = dest->lid;\r
129 \r
130         DEBUG("lid %d port %d mask 0x%x", lid, port, mask);\r
131 \r
132         if (lid == -1) {\r
133                 IBWARN("only lid routed is supported");\r
134                 return 0;\r
135         }\r
136 \r
137         if (!mask)\r
138                 mask = ~0;\r
139 \r
140         rpc.mgtclass = IB_PERFORMANCE_CLASS;\r
141         rpc.method = IB_MAD_METHOD_SET;\r
142         rpc.attr.id = id;\r
143 \r
144         memset(rcvbuf, 0, IB_MAD_SIZE);\r
145 \r
146         /* Same for attribute IDs */\r
147         mad_set_field(rcvbuf, 0, IB_PC_PORT_SELECT_F, port);\r
148         mad_set_field(rcvbuf, 0, IB_PC_COUNTER_SELECT_F, mask);\r
149         rpc.attr.mod = 0;\r
150         rpc.timeout = timeout;\r
151         rpc.datasz = IB_PC_DATA_SZ;\r
152         rpc.dataoffs = IB_PC_DATA_OFFS;\r
153         dest->qp = 1;\r
154         if (!dest->qkey)\r
155                 dest->qkey = IB_DEFAULT_QP1_QKEY;\r
156 \r
157         if (srcport) {\r
158                 return mad_rpc(srcport, &rpc, dest, rcvbuf, rcvbuf);\r
159         } else {\r
160                 return madrpc(&rpc, dest, rcvbuf, rcvbuf);\r
161         }\r
162 }\r
163 \r
164 static uint8_t *\r
165 performance_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,\r
166                   unsigned timeout, unsigned id)\r
167 {\r
168         return performance_reset_via(rcvbuf, dest, port, mask, timeout,\r
169                                      id, NULL);\r
170 }\r
171 \r
172 uint8_t *\r
173 port_performance_reset_via(void *rcvbuf, ib_portid_t *dest, int port,\r
174                            unsigned mask, unsigned timeout, const void *srcport)\r
175 {\r
176         return performance_reset_via(rcvbuf, dest, port, mask, timeout,\r
177                                      IB_GSI_PORT_COUNTERS, srcport);\r
178 }\r
179 \r
180 MAD_EXPORT uint8_t *\r
181 port_performance_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,\r
182                        unsigned timeout)\r
183 {\r
184         return performance_reset(rcvbuf, dest, port, mask, timeout, IB_GSI_PORT_COUNTERS);\r
185 }\r
186 \r
187 uint8_t *\r
188 port_performance_ext_query_via(void *rcvbuf, ib_portid_t *dest, int port,\r
189                                unsigned timeout, const void *srcport)\r
190 {\r
191         return pma_query_via(rcvbuf, dest, port, timeout,\r
192                              IB_GSI_PORT_COUNTERS_EXT, srcport);\r
193 }\r
194 \r
195 MAD_EXPORT uint8_t *\r
196 port_performance_ext_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout)\r
197 {\r
198         return pma_query(rcvbuf, dest, port, timeout, IB_GSI_PORT_COUNTERS_EXT);\r
199 }\r
200 \r
201 uint8_t *\r
202 port_performance_ext_reset_via(void *rcvbuf, ib_portid_t *dest, int port,\r
203                                unsigned mask, unsigned timeout,\r
204                                const void *srcport)\r
205 {\r
206         return performance_reset_via(rcvbuf, dest, port, mask, timeout,\r
207                                      IB_GSI_PORT_COUNTERS_EXT, srcport);\r
208 }\r
209 \r
210 MAD_EXPORT uint8_t *\r
211 port_performance_ext_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,\r
212                            unsigned timeout)\r
213 {\r
214         return performance_reset(rcvbuf, dest, port, mask, timeout, IB_GSI_PORT_COUNTERS_EXT);\r
215 }\r
216 \r
217 uint8_t *\r
218 port_samples_control_query_via(void *rcvbuf, ib_portid_t *dest, int port,\r
219                                unsigned timeout, const void *srcport)\r
220 {\r
221         return pma_query_via(rcvbuf, dest, port, timeout,\r
222                              IB_GSI_PORT_SAMPLES_CONTROL, srcport);\r
223 }\r
224 \r
225 MAD_EXPORT uint8_t *\r
226 port_samples_control_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout)\r
227 {\r
228         return pma_query(rcvbuf, dest, port, timeout, IB_GSI_PORT_SAMPLES_CONTROL);\r
229 }\r
230 \r
231 uint8_t *\r
232 port_samples_result_query_via(void *rcvbuf, ib_portid_t *dest, int port,\r
233                               unsigned timeout, const void *srcport)\r
234 {\r
235         return pma_query_via(rcvbuf, dest, port, timeout,\r
236                              IB_GSI_PORT_SAMPLES_RESULT, srcport);\r
237 }\r
238 \r
239 MAD_EXPORT uint8_t *\r
240 port_samples_result_query(void *rcvbuf, ib_portid_t *dest, int port,  unsigned timeout)\r
241 {\r
242         return pma_query(rcvbuf, dest, port, timeout, IB_GSI_PORT_SAMPLES_RESULT);\r
243 }\r