1 /*
2  * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2002-2015 Mellanox Technologies LTD. All rights reserved.
4  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5  * Copyright (c) 2009 HNR Consulting. All rights reserved.
6  * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
7  *
8  * This software is available to you under a choice of one of two
9  * licenses.  You may choose to be licensed under the terms of the GNU
10  * General Public License (GPL) Version 2, available from the file
11  * COPYING in the main directory of this source tree, or the
12  * OpenIB.org BSD license below:
13  *
14  *     Redistribution and use in source and binary forms, with or
15  *     without modification, are permitted provided that the following
16  *     conditions are met:
17  *
18  *      - Redistributions of source code must retain the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer.
21  *
22  *      - Redistributions in binary form must reproduce the above
23  *        copyright notice, this list of conditions and the following
24  *        disclaimer in the documentation and/or other materials
25  *        provided with the distribution.
26  *
27  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34  * SOFTWARE.
35  *
36  */
37 
38 /*
39  * Abstract:
40  *    Implementation of opensm helper functions.
41  */
42 
43 #if HAVE_CONFIG_H
44 #  include <config.h>
45 #endif				/* HAVE_CONFIG_H */
46 
47 #include <stdlib.h>
48 #include <stdio.h>
49 #include <string.h>
50 #include <arpa/inet.h>
51 #include <sys/socket.h>
52 #include <complib/cl_debug.h>
53 #include <iba/ib_types.h>
54 #include <opensm/osm_file_ids.h>
55 #define FILE_ID OSM_FILE_HELPER_C
56 #include <opensm/osm_helper.h>
57 #include <opensm/osm_log.h>
58 
59 #define LINE_LENGTH 256
60 
61 #define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0]))
62 
63 /* we use two tables - one for queries and one for responses */
64 static const char *ib_sa_method_str[] = {
65 	"RESERVED",		/* 0 */
66 	"SubnAdmGet",		/* 1 */
67 	"SubnAdmSet",		/* 2 */
68 	"RESERVED",		/* 3 */
69 	"RESERVED",		/* 4 */
70 	"RESERVED",		/* 5 */
71 	"SubnAdmReport",	/* 6 */
72 	"RESERVED",		/* 7 */
73 	"RESERVED",		/* 8 */
74 	"RESERVED",		/* 9 */
75 	"RESERVED",		/* A */
76 	"RESERVED",		/* B */
77 	"RESERVED",		/* C */
78 	"RESERVED",		/* D */
79 	"RESERVED",		/* E */
80 	"RESERVED",		/* F */
81 	"RESERVED",		/* 10 */
82 	"RESERVED",		/* 11 */
83 	"SubnAdmGetTable",	/* 12 */
84 	"SubnAdmGetTraceTable",	/* 13 */
85 	"SubnAdmGetMulti",	/* 14 */
86 	"SubnAdmDelete",	/* 15 */
87 	"UNKNOWN"		/* 16 */
88 };
89 
90 #define OSM_SA_METHOD_STR_UNKNOWN_VAL (ARR_SIZE(ib_sa_method_str) - 1)
91 
92 static const char *ib_sa_resp_method_str[] = {
93 	"RESERVED",		/* 80 */
94 	"SubnAdmGetResp",	/* 81 */
95 	"RESERVED (SetResp?)",	/* 82 */
96 	"RESERVED",		/* 83 */
97 	"RESERVED",		/* 84 */
98 	"RESERVED",		/* 85 */
99 	"SubnAdmReportResp",	/* 86 */
100 	"RESERVED",		/* 87 */
101 	"RESERVED",		/* 88 */
102 	"RESERVED",		/* 89 */
103 	"RESERVED",		/* 8A */
104 	"RESERVED",		/* 8B */
105 	"RESERVED",		/* 8C */
106 	"RESERVED",		/* 8D */
107 	"RESERVED",		/* 8E */
108 	"RESERVED",		/* 8F */
109 	"RESERVED",		/* 90 */
110 	"RESERVED",		/* 91 */
111 	"SubnAdmGetTableResp",	/* 92 */
112 	"RESERVED",		/* 93 */
113 	"SubnAdmGetMultiResp",	/* 94 */
114 	"SubnAdmDeleteResp",	/* 95 */
115 	"UNKNOWN"
116 };
117 
118 static const char *ib_sm_method_str[] = {
119 	"RESERVED0",		/* 0 */
120 	"SubnGet",		/* 1 */
121 	"SubnSet",		/* 2 */
122 	"RESERVED3",		/* 3 */
123 	"RESERVED4",		/* 4 */
124 	"SubnTrap",		/* 5 */
125 	"RESERVED6",		/* 6 */
126 	"SubnTrapRepress",	/* 7 */
127 	"RESERVED8",		/* 8 */
128 	"RESERVED9",		/* 9 */
129 	"RESERVEDA",		/* A */
130 	"RESERVEDB",		/* B */
131 	"RESERVEDC",		/* C */
132 	"RESERVEDD",		/* D */
133 	"RESERVEDE",		/* E */
134 	"RESERVEDF",		/* F */
135 	"RESERVED10",		/* 10 */
136 	"SubnGetResp",		/* 11 */
137 	"RESERVED12",		/* 12 */
138 	"RESERVED13",		/* 13 */
139 	"RESERVED14",		/* 14 */
140 	"RESERVED15",		/* 15 */
141 	"RESERVED16",		/* 16 */
142 	"RESERVED17",		/* 17 */
143 	"RESERVED18",		/* 18 */
144 	"RESERVED19",		/* 19 */
145 	"RESERVED1A",		/* 1A */
146 	"RESERVED1B",		/* 1B */
147 	"RESERVED1C",		/* 1C */
148 	"RESERVED1D",		/* 1D */
149 	"RESERVED1E",		/* 1E */
150 	"RESERVED1F",		/* 1F */
151 	"UNKNOWN"		/* 20 */
152 };
153 
154 #define OSM_SM_METHOD_STR_UNKNOWN_VAL (ARR_SIZE(ib_sm_method_str) - 1)
155 
156 static const char *ib_sm_attr_str[] = {
157 	"RESERVED",		/* 0 */
158 	"ClassPortInfo",	/* 1 */
159 	"Notice",		/* 2 */
160 	"InformInfo",		/* 3 */
161 	"RESERVED",		/* 4 */
162 	"RESERVED",		/* 5 */
163 	"RESERVED",		/* 6 */
164 	"RESERVED",		/* 7 */
165 	"RESERVED",		/* 8 */
166 	"RESERVED",		/* 9 */
167 	"RESERVED",		/* A */
168 	"RESERVED",		/* B */
169 	"RESERVED",		/* C */
170 	"RESERVED",		/* D */
171 	"RESERVED",		/* E */
172 	"RESERVED",		/* F */
173 	"NodeDescription",	/* 10 */
174 	"NodeInfo",		/* 11 */
175 	"SwitchInfo",		/* 12 */
176 	"UNKNOWN",		/* 13 */
177 	"GUIDInfo",		/* 14 */
178 	"PortInfo",		/* 15 */
179 	"P_KeyTable",		/* 16 */
180 	"SLtoVLMappingTable",	/* 17 */
181 	"VLArbitrationTable",	/* 18 */
182 	"LinearForwardingTable",	/* 19 */
183 	"RandomForwardingTable",	/* 1A */
184 	"MulticastForwardingTable",	/* 1B */
185 	"UNKNOWN",		/* 1C */
186 	"UNKNOWN",		/* 1D */
187 	"UNKNOWN",		/* 1E */
188 	"UNKNOWN",		/* 1F */
189 	"SMInfo",		/* 20 */
190 	"UNKNOWN"		/* 21 - always highest value */
191 };
192 
193 #define OSM_SM_ATTR_STR_UNKNOWN_VAL (ARR_SIZE(ib_sm_attr_str) - 1)
194 
195 static const char *ib_sa_attr_str[] = {
196 	"RESERVED",		/* 0 */
197 	"ClassPortInfo",	/* 1 */
198 	"Notice",		/* 2 */
199 	"InformInfo",		/* 3 */
200 	"RESERVED",		/* 4 */
201 	"RESERVED",		/* 5 */
202 	"RESERVED",		/* 6 */
203 	"RESERVED",		/* 7 */
204 	"RESERVED",		/* 8 */
205 	"RESERVED",		/* 9 */
206 	"RESERVED",		/* A */
207 	"RESERVED",		/* B */
208 	"RESERVED",		/* C */
209 	"RESERVED",		/* D */
210 	"RESERVED",		/* E */
211 	"RESERVED",		/* F */
212 	"RESERVED",		/* 10 */
213 	"NodeRecord",		/* 11 */
214 	"PortInfoRecord",	/* 12 */
215 	"SLtoVLMappingTableRecord",	/* 13 */
216 	"SwitchInfoRecord",	/* 14 */
217 	"LinearForwardingTableRecord",	/* 15 */
218 	"RandomForwardingTableRecord",	/* 16 */
219 	"MulticastForwardingTableRecord",	/* 17 */
220 	"SMInfoRecord",		/* 18 */
221 	"RESERVED",		/* 19 */
222 	"RandomForwardingTable",	/* 1A */
223 	"MulticastForwardingTable",	/* 1B */
224 	"UNKNOWN",		/* 1C */
225 	"UNKNOWN",		/* 1D */
226 	"UNKNOWN",		/* 1E */
227 	"UNKNOWN",		/* 1F */
228 	"LinkRecord",		/* 20 */
229 	"UNKNOWN",		/* 21 */
230 	"UNKNOWN",		/* 22 */
231 	"UNKNOWN",		/* 23 */
232 	"UNKNOWN",		/* 24 */
233 	"UNKNOWN",		/* 25 */
234 	"UNKNOWN",		/* 26 */
235 	"UNKNOWN",		/* 27 */
236 	"UNKNOWN",		/* 28 */
237 	"UNKNOWN",		/* 29 */
238 	"UNKNOWN",		/* 2A */
239 	"UNKNOWN",		/* 2B */
240 	"UNKNOWN",		/* 2C */
241 	"UNKNOWN",		/* 2D */
242 	"UNKNOWN",		/* 2E */
243 	"UNKNOWN",		/* 2F */
244 	"GuidInfoRecord",	/* 30 */
245 	"ServiceRecord",	/* 31 */
246 	"UNKNOWN",		/* 32 */
247 	"P_KeyTableRecord",	/* 33 */
248 	"UNKNOWN",		/* 34 */
249 	"PathRecord",		/* 35 */
250 	"VLArbitrationTableRecord",	/* 36 */
251 	"UNKNOWN",		/* 37 */
252 	"MCMemberRecord",	/* 38 */
253 	"TraceRecord",		/* 39 */
254 	"MultiPathRecord",	/* 3A */
255 	"ServiceAssociationRecord",	/* 3B */
256 	"UNKNOWN",		/* 3C */
257 	"UNKNOWN",		/* 3D */
258 	"UNKNOWN",		/* 3E */
259 	"UNKNOWN",		/* 3F */
260 	"UNKNOWN",		/* 40 */
261 	"UNKNOWN",		/* 41 */
262 	"UNKNOWN",		/* 42 */
263 	"UNKNOWN",		/* 43 */
264 	"UNKNOWN",		/* 44 */
265 	"UNKNOWN",		/* 45 */
266 	"UNKNOWN",		/* 46 */
267 	"UNKNOWN",		/* 47 */
268 	"UNKNOWN",		/* 48 */
269 	"UNKNOWN",		/* 49 */
270 	"UNKNOWN",		/* 4A */
271 	"UNKNOWN",		/* 4B */
272 	"UNKNOWN",		/* 4C */
273 	"UNKNOWN",		/* 4D */
274 	"UNKNOWN",		/* 4E */
275 	"UNKNOWN",		/* 4F */
276 	"UNKNOWN",		/* 50 */
277 	"UNKNOWN",		/* 51 */
278 	"UNKNOWN",		/* 52 */
279 	"UNKNOWN",		/* 53 */
280 	"UNKNOWN",		/* 54 */
281 	"UNKNOWN",		/* 55 */
282 	"UNKNOWN",		/* 56 */
283 	"UNKNOWN",		/* 57 */
284 	"UNKNOWN",		/* 58 */
285 	"UNKNOWN",		/* 59 */
286 	"UNKNOWN",		/* 5A */
287 	"UNKNOWN",		/* 5B */
288 	"UNKNOWN",		/* 5C */
289 	"UNKNOWN",		/* 5D */
290 	"UNKNOWN",		/* 5E */
291 	"UNKNOWN",		/* 5F */
292 	"UNKNOWN",		/* 60 */
293 	"UNKNOWN",		/* 61 */
294 	"UNKNOWN",		/* 62 */
295 	"UNKNOWN",		/* 63 */
296 	"UNKNOWN",		/* 64 */
297 	"UNKNOWN",		/* 65 */
298 	"UNKNOWN",		/* 66 */
299 	"UNKNOWN",		/* 67 */
300 	"UNKNOWN",		/* 68 */
301 	"UNKNOWN",		/* 69 */
302 	"UNKNOWN",		/* 6A */
303 	"UNKNOWN",		/* 6B */
304 	"UNKNOWN",		/* 6C */
305 	"UNKNOWN",		/* 6D */
306 	"UNKNOWN",		/* 6E */
307 	"UNKNOWN",		/* 6F */
308 	"UNKNOWN",		/* 70 */
309 	"UNKNOWN",		/* 71 */
310 	"UNKNOWN",		/* 72 */
311 	"UNKNOWN",		/* 73 */
312 	"UNKNOWN",		/* 74 */
313 	"UNKNOWN",		/* 75 */
314 	"UNKNOWN",		/* 76 */
315 	"UNKNOWN",		/* 77 */
316 	"UNKNOWN",		/* 78 */
317 	"UNKNOWN",		/* 79 */
318 	"UNKNOWN",		/* 7A */
319 	"UNKNOWN",		/* 7B */
320 	"UNKNOWN",		/* 7C */
321 	"UNKNOWN",		/* 7D */
322 	"UNKNOWN",		/* 7E */
323 	"UNKNOWN",		/* 7F */
324 	"UNKNOWN",		/* 80 */
325 	"UNKNOWN",		/* 81 */
326 	"UNKNOWN",		/* 82 */
327 	"UNKNOWN",		/* 83 */
328 	"UNKNOWN",		/* 84 */
329 	"UNKNOWN",		/* 85 */
330 	"UNKNOWN",		/* 86 */
331 	"UNKNOWN",		/* 87 */
332 	"UNKNOWN",		/* 88 */
333 	"UNKNOWN",		/* 89 */
334 	"UNKNOWN",		/* 8A */
335 	"UNKNOWN",		/* 8B */
336 	"UNKNOWN",		/* 8C */
337 	"UNKNOWN",		/* 8D */
338 	"UNKNOWN",		/* 8E */
339 	"UNKNOWN",		/* 8F */
340 	"UNKNOWN",		/* 90 */
341 	"UNKNOWN",		/* 91 */
342 	"UNKNOWN",		/* 92 */
343 	"UNKNOWN",		/* 93 */
344 	"UNKNOWN",		/* 94 */
345 	"UNKNOWN",		/* 95 */
346 	"UNKNOWN",		/* 96 */
347 	"UNKNOWN",		/* 97 */
348 	"UNKNOWN",		/* 98 */
349 	"UNKNOWN",		/* 99 */
350 	"UNKNOWN",		/* 9A */
351 	"UNKNOWN",		/* 9B */
352 	"UNKNOWN",		/* 9C */
353 	"UNKNOWN",		/* 9D */
354 	"UNKNOWN",		/* 9E */
355 	"UNKNOWN",		/* 9F */
356 	"UNKNOWN",		/* A0 */
357 	"UNKNOWN",		/* A1 */
358 	"UNKNOWN",		/* A2 */
359 	"UNKNOWN",		/* A3 */
360 	"UNKNOWN",		/* A4 */
361 	"UNKNOWN",		/* A5 */
362 	"UNKNOWN",		/* A6 */
363 	"UNKNOWN",		/* A7 */
364 	"UNKNOWN",		/* A8 */
365 	"UNKNOWN",		/* A9 */
366 	"UNKNOWN",		/* AA */
367 	"UNKNOWN",		/* AB */
368 	"UNKNOWN",		/* AC */
369 	"UNKNOWN",		/* AD */
370 	"UNKNOWN",		/* AE */
371 	"UNKNOWN",		/* AF */
372 	"UNKNOWN",		/* B0 */
373 	"UNKNOWN",		/* B1 */
374 	"UNKNOWN",		/* B2 */
375 	"UNKNOWN",		/* B3 */
376 	"UNKNOWN",		/* B4 */
377 	"UNKNOWN",		/* B5 */
378 	"UNKNOWN",		/* B6 */
379 	"UNKNOWN",		/* B7 */
380 	"UNKNOWN",		/* B8 */
381 	"UNKNOWN",		/* B9 */
382 	"UNKNOWN",		/* BA */
383 	"UNKNOWN",		/* BB */
384 	"UNKNOWN",		/* BC */
385 	"UNKNOWN",		/* BD */
386 	"UNKNOWN",		/* BE */
387 	"UNKNOWN",		/* BF */
388 	"UNKNOWN",		/* C0 */
389 	"UNKNOWN",		/* C1 */
390 	"UNKNOWN",		/* C2 */
391 	"UNKNOWN",		/* C3 */
392 	"UNKNOWN",		/* C4 */
393 	"UNKNOWN",		/* C5 */
394 	"UNKNOWN",		/* C6 */
395 	"UNKNOWN",		/* C7 */
396 	"UNKNOWN",		/* C8 */
397 	"UNKNOWN",		/* C9 */
398 	"UNKNOWN",		/* CA */
399 	"UNKNOWN",		/* CB */
400 	"UNKNOWN",		/* CC */
401 	"UNKNOWN",		/* CD */
402 	"UNKNOWN",		/* CE */
403 	"UNKNOWN",		/* CF */
404 	"UNKNOWN",		/* D0 */
405 	"UNKNOWN",		/* D1 */
406 	"UNKNOWN",		/* D2 */
407 	"UNKNOWN",		/* D3 */
408 	"UNKNOWN",		/* D4 */
409 	"UNKNOWN",		/* D5 */
410 	"UNKNOWN",		/* D6 */
411 	"UNKNOWN",		/* D7 */
412 	"UNKNOWN",		/* D8 */
413 	"UNKNOWN",		/* D9 */
414 	"UNKNOWN",		/* DA */
415 	"UNKNOWN",		/* DB */
416 	"UNKNOWN",		/* DC */
417 	"UNKNOWN",		/* DD */
418 	"UNKNOWN",		/* DE */
419 	"UNKNOWN",		/* DF */
420 	"UNKNOWN",		/* E0 */
421 	"UNKNOWN",		/* E1 */
422 	"UNKNOWN",		/* E2 */
423 	"UNKNOWN",		/* E3 */
424 	"UNKNOWN",		/* E4 */
425 	"UNKNOWN",		/* E5 */
426 	"UNKNOWN",		/* E6 */
427 	"UNKNOWN",		/* E7 */
428 	"UNKNOWN",		/* E8 */
429 	"UNKNOWN",		/* E9 */
430 	"UNKNOWN",		/* EA */
431 	"UNKNOWN",		/* EB */
432 	"UNKNOWN",		/* EC */
433 	"UNKNOWN",		/* ED */
434 	"UNKNOWN",		/* EE */
435 	"UNKNOWN",		/* EF */
436 	"UNKNOWN",		/* F0 */
437 	"UNKNOWN",		/* F1 */
438 	"UNKNOWN",		/* F2 */
439 	"InformInfoRecord",	/* F3 */
440 	"UNKNOWN"		/* F4 - always highest value */
441 };
442 
443 #define OSM_SA_ATTR_STR_UNKNOWN_VAL (ARR_SIZE(ib_sa_attr_str) - 1)
444 
445 static int ordered_rates[] = {
446 	0, 0,	/*  0, 1 - reserved */
447 	1,	/*  2 - 2.5 Gbps */
448 	3,	/*  3 - 10  Gbps */
449 	6,	/*  4 - 30  Gbps */
450 	2,	/*  5 - 5   Gbps */
451 	5,	/*  6 - 20  Gbps */
452 	9,	/*  7 - 40  Gbps */
453 	10,	/*  8 - 60  Gbps */
454 	13,	/*  9 - 80  Gbps */
455 	14,	/* 10 - 120 Gbps */
456 	4,	/* 11 -  14 Gbps (17 Gbps equiv) */
457 	12,	/* 12 -  56 Gbps (68 Gbps equiv) */
458 	16,	/* 13 - 112 Gbps (136 Gbps equiv) */
459 	17,	/* 14 - 168 Gbps (204 Gbps equiv) */
460 	7,	/* 15 -  25 Gbps (31.25 Gbps equiv) */
461 	15,	/* 16 - 100 Gbps (125 Gbps equiv) */
462 	18,	/* 17 - 200 Gbps (250 Gbps equiv) */
463 	19,	/* 18 - 300 Gbps (375 Gbps equiv) */
464 	8,	/* 19 -  28 Gbps (35 Gbps equiv) */
465 	11,	/* 20 -  50 Gbps (62.5 Gbps equiv) */
466 };
467 
sprint_uint8_arr(char * buf,size_t size,const uint8_t * arr,size_t len)468 int sprint_uint8_arr(char *buf, size_t size,
469 		     const uint8_t * arr, size_t len)
470 {
471 	int n;
472 	unsigned int i;
473 	for (i = 0, n = 0; i < len; i++) {
474 		n += snprintf(buf + n, size - n, "%s%u", i == 0 ? "" : ",",
475 			      arr[i]);
476 		if (n >= size)
477 			break;
478 	}
479 	return n;
480 }
481 
ib_get_sa_method_str(IN uint8_t method)482 const char *ib_get_sa_method_str(IN uint8_t method)
483 {
484 	if (method & 0x80) {
485 		method = method & 0x7f;
486 		if (method > OSM_SA_METHOD_STR_UNKNOWN_VAL)
487 			method = OSM_SA_METHOD_STR_UNKNOWN_VAL;
488 		/* it is a response - use the response table */
489 		return ib_sa_resp_method_str[method];
490 	} else {
491 		if (method > OSM_SA_METHOD_STR_UNKNOWN_VAL)
492 			method = OSM_SA_METHOD_STR_UNKNOWN_VAL;
493 		return ib_sa_method_str[method];
494 	}
495 }
496 
ib_get_sm_method_str(IN uint8_t method)497 const char *ib_get_sm_method_str(IN uint8_t method)
498 {
499 	if (method & 0x80)
500 		method = (method & 0x0F) | 0x10;
501 	if (method > OSM_SM_METHOD_STR_UNKNOWN_VAL)
502 		method = OSM_SM_METHOD_STR_UNKNOWN_VAL;
503 	return ib_sm_method_str[method];
504 }
505 
ib_get_sm_attr_str(IN ib_net16_t attr)506 const char *ib_get_sm_attr_str(IN ib_net16_t attr)
507 {
508 	uint16_t host_attr = cl_ntoh16(attr);
509 
510 	if (attr == IB_MAD_ATTR_MLNX_EXTENDED_PORT_INFO)
511 		return "MLNXExtendedPortInfo";
512 
513 	if (host_attr > OSM_SM_ATTR_STR_UNKNOWN_VAL)
514 		host_attr = OSM_SM_ATTR_STR_UNKNOWN_VAL;
515 
516 	return ib_sm_attr_str[host_attr];
517 }
518 
ib_get_sa_attr_str(IN ib_net16_t attr)519 const char *ib_get_sa_attr_str(IN ib_net16_t attr)
520 {
521 	uint16_t host_attr = cl_ntoh16(attr);
522 
523 	if (host_attr > OSM_SA_ATTR_STR_UNKNOWN_VAL)
524 		host_attr = OSM_SA_ATTR_STR_UNKNOWN_VAL;
525 
526 	return ib_sa_attr_str[host_attr];
527 }
528 
ib_get_trap_str(ib_net16_t trap_num)529 const char *ib_get_trap_str(ib_net16_t trap_num)
530 {
531 	switch (cl_ntoh16(trap_num)) {
532 	case SM_GID_IN_SERVICE_TRAP:	/* 64 */
533 		return "GID in service";
534 	case SM_GID_OUT_OF_SERVICE_TRAP: /* 65 */
535 		return "GID out of service";
536 	case SM_MGID_CREATED_TRAP:	/* 66 */
537 		return "New mcast group created";
538 	case SM_MGID_DESTROYED_TRAP:	/* 67 */
539 		return "Mcast group deleted";
540 	case SM_UNPATH_TRAP:		/* 68 */
541 		return "UnPath, Path no longer valid";
542 	case SM_REPATH_TRAP:		/* 69 */
543 		return "RePath, Path recomputed";
544 	case SM_LINK_STATE_CHANGED_TRAP: /* 128 */
545 		return "Link state change";
546 	case SM_LINK_INTEGRITY_THRESHOLD_TRAP: /* 129 */
547 		return "Local Link integrity threshold reached";
548 	case SM_BUFFER_OVERRUN_THRESHOLD_TRAP: /* 130 */
549 		return "Excessive Buffer Overrun Threshold reached";
550 	case SM_WATCHDOG_TIMER_EXPIRED_TRAP:   /* 131 */
551 		return "Flow Control Update watchdog timer expired";
552 	case SM_LOCAL_CHANGES_TRAP:	/* 144 */
553 		return
554 		    "CapabilityMask, NodeDescription, Link [Width|Speed] Enabled, SM priority changed";
555 	case SM_SYS_IMG_GUID_CHANGED_TRAP: /* 145 */
556 		return "System Image GUID changed";
557 	case SM_BAD_MKEY_TRAP:		/* 256 */
558 		return "Bad M_Key";
559 	case SM_BAD_PKEY_TRAP:		/* 257 */
560 		return "Bad P_Key";
561 	case SM_BAD_QKEY_TRAP:		/* 258 */
562 		return "Bad Q_Key";
563 	case SM_BAD_SWITCH_PKEY_TRAP:	/* 259 */
564 		return "Bad P_Key (switch external port)";
565 	default:
566 		break;
567 	}
568 	return "Unknown";
569 }
570 
571 const ib_gid_t ib_zero_gid = { {0} };
572 
dbg_do_line(IN char ** pp_local,IN uint32_t buf_size,IN const char * p_prefix_str,IN const char * p_new_str,IN uint32_t * p_total_len)573 static ib_api_status_t dbg_do_line(IN char **pp_local, IN uint32_t buf_size,
574 				   IN const char *p_prefix_str,
575 				   IN const char *p_new_str,
576 				   IN uint32_t * p_total_len)
577 {
578 	char line[LINE_LENGTH];
579 	uint32_t len;
580 
581 	sprintf(line, "%s%s", p_prefix_str, p_new_str);
582 	len = (uint32_t) strlen(line);
583 	*p_total_len += len;
584 	if (*p_total_len + sizeof('\0') > buf_size)
585 		return IB_INSUFFICIENT_MEMORY;
586 
587 	strcpy(*pp_local, line);
588 	*pp_local += len;
589 	return IB_SUCCESS;
590 }
591 
dbg_get_capabilities_str(IN char * p_buf,IN uint32_t buf_size,IN const char * p_prefix_str,IN const ib_port_info_t * p_pi)592 static void dbg_get_capabilities_str(IN char *p_buf, IN uint32_t buf_size,
593 				     IN const char *p_prefix_str,
594 				     IN const ib_port_info_t * p_pi)
595 {
596 	uint32_t total_len = 0;
597 	char *p_local = p_buf;
598 
599 	strcpy(p_local, "Capability Mask:\n");
600 	p_local += strlen(p_local);
601 
602 	if (p_pi->capability_mask & IB_PORT_CAP_RESV0) {
603 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
604 				"IB_PORT_CAP_RESV0\n",
605 				&total_len) != IB_SUCCESS)
606 			return;
607 	}
608 	if (p_pi->capability_mask & IB_PORT_CAP_IS_SM) {
609 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
610 				"IB_PORT_CAP_IS_SM\n",
611 				&total_len) != IB_SUCCESS)
612 			return;
613 	}
614 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_NOTICE) {
615 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
616 				"IB_PORT_CAP_HAS_NOTICE\n",
617 				&total_len) != IB_SUCCESS)
618 			return;
619 	}
620 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_TRAP) {
621 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
622 				"IB_PORT_CAP_HAS_TRAP\n",
623 				&total_len) != IB_SUCCESS)
624 			return;
625 	}
626 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_IPD) {
627 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
628 				"IB_PORT_CAP_HAS_IPD\n",
629 				&total_len) != IB_SUCCESS)
630 			return;
631 	}
632 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_AUTO_MIG) {
633 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
634 				"IB_PORT_CAP_HAS_AUTO_MIG\n",
635 				&total_len) != IB_SUCCESS)
636 			return;
637 	}
638 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_SL_MAP) {
639 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
640 				"IB_PORT_CAP_HAS_SL_MAP\n",
641 				&total_len) != IB_SUCCESS)
642 			return;
643 	}
644 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_NV_MKEY) {
645 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
646 				"IB_PORT_CAP_HAS_NV_MKEY\n",
647 				&total_len) != IB_SUCCESS)
648 			return;
649 	}
650 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_NV_PKEY) {
651 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
652 				"IB_PORT_CAP_HAS_NV_PKEY\n",
653 				&total_len) != IB_SUCCESS)
654 			return;
655 	}
656 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_LED_INFO) {
657 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
658 				"IB_PORT_CAP_HAS_LED_INFO\n",
659 				&total_len) != IB_SUCCESS)
660 			return;
661 	}
662 	if (p_pi->capability_mask & IB_PORT_CAP_SM_DISAB) {
663 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
664 				"IB_PORT_CAP_SM_DISAB\n",
665 				&total_len) != IB_SUCCESS)
666 			return;
667 	}
668 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_SYS_IMG_GUID) {
669 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
670 				"IB_PORT_CAP_HAS_SYS_IMG_GUID\n",
671 				&total_len) != IB_SUCCESS)
672 			return;
673 	}
674 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_PKEY_SW_EXT_PORT_TRAP) {
675 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
676 				"IB_PORT_CAP_PKEY_SW_EXT_PORT_TRAP\n",
677 				&total_len) != IB_SUCCESS)
678 			return;
679 	}
680 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_CABLE_INFO) {
681 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
682 				"IB_PORT_CAP_HAS_CABLE_INFO\n",
683 				&total_len) != IB_SUCCESS)
684 			return;
685 	}
686 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) {
687 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
688 				"IB_PORT_CAP_HAS_EXT_SPEEDS\n",
689 				&total_len) != IB_SUCCESS)
690 			return;
691 	}
692 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_CAP_MASK2) {
693 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
694 				"IB_PORT_CAP_HAS_CAP_MASK2\n",
695 				&total_len) != IB_SUCCESS)
696 			return;
697 	}
698 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_COM_MGT) {
699 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
700 				"IB_PORT_CAP_HAS_COM_MGT\n",
701 				&total_len) != IB_SUCCESS)
702 			return;
703 	}
704 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_SNMP) {
705 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
706 				"IB_PORT_CAP_HAS_SNMP\n",
707 				&total_len) != IB_SUCCESS)
708 			return;
709 	}
710 	if (p_pi->capability_mask & IB_PORT_CAP_REINIT) {
711 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
712 				"IB_PORT_CAP_REINIT\n",
713 				&total_len) != IB_SUCCESS)
714 			return;
715 	}
716 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_DEV_MGT) {
717 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
718 				"IB_PORT_CAP_HAS_DEV_MGT\n",
719 				&total_len) != IB_SUCCESS)
720 			return;
721 	}
722 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_VEND_CLS) {
723 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
724 				"IB_PORT_CAP_HAS_VEND_CLS\n",
725 				&total_len) != IB_SUCCESS)
726 			return;
727 	}
728 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_DR_NTC) {
729 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
730 				"IB_PORT_CAP_HAS_DR_NTC\n",
731 				&total_len) != IB_SUCCESS)
732 			return;
733 	}
734 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_CAP_NTC) {
735 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
736 				"IB_PORT_CAP_HAS_CAP_NTC\n",
737 				&total_len) != IB_SUCCESS)
738 			return;
739 	}
740 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_BM) {
741 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
742 				"IB_PORT_CAP_HAS_BM\n",
743 				&total_len) != IB_SUCCESS)
744 			return;
745 	}
746 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_LINK_RT_LATENCY) {
747 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
748 				"IB_PORT_CAP_HAS_LINK_RT_LATENCY\n",
749 				&total_len) != IB_SUCCESS)
750 			return;
751 	}
752 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_CLIENT_REREG) {
753 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
754 				"IB_PORT_CAP_HAS_CLIENT_REREG\n",
755 				&total_len) != IB_SUCCESS)
756 			return;
757 	}
758 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_OTHER_LOCAL_CHANGES_NTC) {
759 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
760 				"IB_PORT_CAP_HAS_OTHER_LOCAL_CHANGES_NTC\n",
761 				&total_len) != IB_SUCCESS)
762 			return;
763 	}
764 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_LINK_SPEED_WIDTH_PAIRS_TBL) {
765 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
766 				"IB_PORT_CAP_HAS_LINK_SPEED_WIDTH_PAIRS_TBL\n",
767 				&total_len) != IB_SUCCESS)
768 			return;
769 	}
770 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_VEND_MADS) {
771 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
772 				"IB_PORT_CAP_HAS_VEND_MADS\n",
773 				&total_len) != IB_SUCCESS)
774 			return;
775 	}
776 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_MCAST_PKEY_TRAP_SUPPRESS) {
777 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
778 				"IB_PORT_CAP_HAS_MCAST_PKEY_TRAP_SUPPRESS\n",
779 				&total_len) != IB_SUCCESS)
780 			return;
781 	}
782 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_MCAST_FDB_TOP) {
783 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
784 				"IB_PORT_CAP_HAS_MCAST_FDB_TOP\n",
785 				&total_len) != IB_SUCCESS)
786 			return;
787 	}
788 	if (p_pi->capability_mask & IB_PORT_CAP_HAS_HIER_INFO) {
789 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
790 				"IB_PORT_CAP_HAS_HIER_INFO\n",
791 				&total_len) != IB_SUCCESS)
792 			return;
793 	}
794 }
795 
dbg_get_capabilities2_str(IN char * p_buf,IN uint32_t buf_size,IN const char * p_prefix_str,IN const ib_port_info_t * p_pi)796 static void dbg_get_capabilities2_str(IN char *p_buf, IN uint32_t buf_size,
797 				      IN const char *p_prefix_str,
798 				      IN const ib_port_info_t * p_pi)
799 {
800 	uint32_t total_len = 0;
801 	char *p_local = p_buf;
802 
803 	strcpy(p_local, "Capability Mask2:\n");
804 	p_local += strlen(p_local);
805 
806 	if (p_pi->capability_mask2 & IB_PORT_CAP2_IS_SET_NODE_DESC_SUPPORTED) {
807 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
808 				"IB_PORT_CAP2_IS_SET_NODE_DESC_SUPPORTED\n",
809 				&total_len) != IB_SUCCESS)
810 			return;
811 	}
812 	if (p_pi->capability_mask2 & IB_PORT_CAP2_IS_PORT_INFO_EXT_SUPPORTED) {
813 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
814 				"IB_PORT_CAP2_IS_PORT_INFO_EXT_SUPPORTED\n",
815 				&total_len) != IB_SUCCESS)
816 			return;
817 	}
818 	if (p_pi->capability_mask2 & IB_PORT_CAP2_IS_VIRT_SUPPORTED) {
819 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
820 				"IB_PORT_CAP2_IS_VIRT_SUPPORTED\n",
821 				&total_len) != IB_SUCCESS)
822 			return;
823 	}
824 	if (p_pi->capability_mask2 & IB_PORT_CAP2_IS_SWITCH_PORT_STATE_TBL_SUPP) {
825 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
826 				"IB_PORT_CAP2_IS_SWITCH_PORT_STATE_TBL_SUPP\n",
827 				&total_len) != IB_SUCCESS)
828 			return;
829 	}
830 	if (p_pi->capability_mask2 & IB_PORT_CAP2_IS_LINK_WIDTH_2X_SUPPORTED) {
831 		if (dbg_do_line(&p_local, buf_size, p_prefix_str,
832 				"IB_PORT_CAP2_IS_LINK_WIDTH_2X_SUPPORTED\n",
833 				&total_len) != IB_SUCCESS)
834 			return;
835 	}
836 }
837 
osm_dump_port_info_to_buf(IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t port_num,IN const ib_port_info_t * p_pi,OUT char * buf)838 static void osm_dump_port_info_to_buf(IN ib_net64_t node_guid,
839 				      IN ib_net64_t port_guid,
840 				      IN uint8_t port_num,
841 				      IN const ib_port_info_t * p_pi,
842 				      OUT char * buf)
843 {
844 	if (!buf || !p_pi)
845 		return;
846 	else {
847 		sprintf(buf,
848 			"PortInfo dump:\n"
849 			"\t\t\t\tport number..............%u\n"
850 			"\t\t\t\tnode_guid................0x%016" PRIx64 "\n"
851 			"\t\t\t\tport_guid................0x%016" PRIx64 "\n"
852 			"\t\t\t\tm_key....................0x%016" PRIx64 "\n"
853 			"\t\t\t\tsubnet_prefix............0x%016" PRIx64 "\n"
854 			"\t\t\t\tbase_lid.................%u\n"
855 			"\t\t\t\tmaster_sm_base_lid.......%u\n"
856 			"\t\t\t\tcapability_mask..........0x%X\n"
857 			"\t\t\t\tdiag_code................0x%X\n"
858 			"\t\t\t\tm_key_lease_period.......0x%X\n"
859 			"\t\t\t\tlocal_port_num...........%u\n"
860 			"\t\t\t\tlink_width_enabled.......0x%X\n"
861 			"\t\t\t\tlink_width_supported.....0x%X\n"
862 			"\t\t\t\tlink_width_active........0x%X\n"
863 			"\t\t\t\tlink_speed_supported.....0x%X\n"
864 			"\t\t\t\tport_state...............%s\n"
865 			"\t\t\t\tstate_info2..............0x%X\n"
866 			"\t\t\t\tm_key_protect_bits.......0x%X\n"
867 			"\t\t\t\tlmc......................0x%X\n"
868 			"\t\t\t\tlink_speed...............0x%X\n"
869 			"\t\t\t\tmtu_smsl.................0x%X\n"
870 			"\t\t\t\tvl_cap_init_type.........0x%X\n"
871 			"\t\t\t\tvl_high_limit............0x%X\n"
872 			"\t\t\t\tvl_arb_high_cap..........0x%X\n"
873 			"\t\t\t\tvl_arb_low_cap...........0x%X\n"
874 			"\t\t\t\tinit_rep_mtu_cap.........0x%X\n"
875 			"\t\t\t\tvl_stall_life............0x%X\n"
876 			"\t\t\t\tvl_enforce...............0x%X\n"
877 			"\t\t\t\tm_key_violations.........0x%X\n"
878 			"\t\t\t\tp_key_violations.........0x%X\n"
879 			"\t\t\t\tq_key_violations.........0x%X\n"
880 			"\t\t\t\tguid_cap.................0x%X\n"
881 			"\t\t\t\tclient_reregister........0x%X\n"
882 			"\t\t\t\tmcast_pkey_trap_suppr....0x%X\n"
883 			"\t\t\t\tsubnet_timeout...........0x%X\n"
884 			"\t\t\t\tresp_time_value..........0x%X\n"
885 			"\t\t\t\terror_threshold..........0x%X\n"
886 			"\t\t\t\tmax_credit_hint..........0x%X\n"
887 			"\t\t\t\tlink_round_trip_latency..0x%X\n"
888 			"\t\t\t\tcapability_mask2.........0x%X\n"
889 			"\t\t\t\tlink_speed_ext_active....0x%X\n"
890 			"\t\t\t\tlink_speed_ext_supported.0x%X\n"
891 			"\t\t\t\tlink_speed_ext_enabled...0x%X\n",
892 			port_num, cl_ntoh64(node_guid), cl_ntoh64(port_guid),
893 			cl_ntoh64(p_pi->m_key), cl_ntoh64(p_pi->subnet_prefix),
894 			cl_ntoh16(p_pi->base_lid),
895 			cl_ntoh16(p_pi->master_sm_base_lid),
896 			cl_ntoh32(p_pi->capability_mask),
897 			cl_ntoh16(p_pi->diag_code),
898 			cl_ntoh16(p_pi->m_key_lease_period),
899 			p_pi->local_port_num, p_pi->link_width_enabled,
900 			p_pi->link_width_supported, p_pi->link_width_active,
901 			ib_port_info_get_link_speed_sup(p_pi),
902 			ib_get_port_state_str(ib_port_info_get_port_state
903 					      (p_pi)), p_pi->state_info2,
904 			ib_port_info_get_mpb(p_pi), ib_port_info_get_lmc(p_pi),
905 			p_pi->link_speed, p_pi->mtu_smsl, p_pi->vl_cap,
906 			p_pi->vl_high_limit, p_pi->vl_arb_high_cap,
907 			p_pi->vl_arb_low_cap, p_pi->mtu_cap,
908 			p_pi->vl_stall_life, p_pi->vl_enforce,
909 			cl_ntoh16(p_pi->m_key_violations),
910 			cl_ntoh16(p_pi->p_key_violations),
911 			cl_ntoh16(p_pi->q_key_violations), p_pi->guid_cap,
912 			ib_port_info_get_client_rereg(p_pi),
913 			ib_port_info_get_mcast_pkey_trap_suppress(p_pi),
914 			ib_port_info_get_timeout(p_pi),
915 			ib_port_info_get_resp_time_value(p_pi),
916 			p_pi->error_threshold, cl_ntoh16(p_pi->max_credit_hint),
917 			cl_ntoh32(p_pi->link_rt_latency),
918 			cl_ntoh16(p_pi->capability_mask2),
919 			ib_port_info_get_link_speed_ext_active(p_pi),
920 			ib_port_info_get_link_speed_ext_sup(p_pi),
921 			p_pi->link_speed_ext_enabled);
922 	}
923 }
924 
osm_dump_port_info(IN osm_log_t * p_log,IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t port_num,IN const ib_port_info_t * p_pi,IN osm_log_level_t log_level)925 void osm_dump_port_info(IN osm_log_t * p_log, IN ib_net64_t node_guid,
926 			IN ib_net64_t port_guid, IN uint8_t port_num,
927 			IN const ib_port_info_t * p_pi,
928 			IN osm_log_level_t log_level)
929 {
930 	if (osm_log_is_active(p_log, log_level)) {
931 		char buf[BUF_SIZE];
932 
933 		osm_dump_port_info_to_buf(node_guid, port_guid,
934 					  port_num, p_pi, buf);
935 
936 		osm_log(p_log, log_level, "%s", buf);
937 
938 		/*  show the capabilities masks */
939 		if (p_pi->capability_mask) {
940 			dbg_get_capabilities_str(buf, BUF_SIZE, "\t\t\t\t",
941 						 p_pi);
942 			osm_log(p_log, log_level, "%s", buf);
943 		}
944 		if ((p_pi->capability_mask & IB_PORT_CAP_HAS_CAP_MASK2) &&
945 		    p_pi->capability_mask2) {
946 			dbg_get_capabilities2_str(buf, BUF_SIZE, "\t\t\t\t",
947 						  p_pi);
948 			osm_log(p_log, log_level, "%s", buf);
949 		}
950 	}
951 }
952 
osm_dump_port_info_v2(IN osm_log_t * p_log,IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t port_num,IN const ib_port_info_t * p_pi,IN const int file_id,IN osm_log_level_t log_level)953 void osm_dump_port_info_v2(IN osm_log_t * p_log, IN ib_net64_t node_guid,
954 			   IN ib_net64_t port_guid, IN uint8_t port_num,
955 			   IN const ib_port_info_t * p_pi, IN const int file_id,
956 			   IN osm_log_level_t log_level)
957 {
958 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
959 		char buf[BUF_SIZE];
960 
961 		osm_dump_port_info_to_buf(node_guid, port_guid,
962 					  port_num, p_pi, buf);
963 
964 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
965 
966 		/*  show the capabilities masks */
967 		if (p_pi->capability_mask) {
968 			dbg_get_capabilities_str(buf, BUF_SIZE, "\t\t\t\t",
969 						 p_pi);
970 			osm_log_v2(p_log, log_level, file_id, "%s", buf);
971 		}
972 		if ((p_pi->capability_mask & IB_PORT_CAP_HAS_CAP_MASK2) &&
973 		    p_pi->capability_mask2) {
974 			dbg_get_capabilities2_str(buf, BUF_SIZE, "\t\t\t\t",
975 						  p_pi);
976 			osm_log(p_log, log_level, "%s", buf);
977 		}
978 	}
979 }
980 
osm_dump_mlnx_ext_port_info_to_buf(IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t port_num,IN const ib_mlnx_ext_port_info_t * p_pi,OUT char * buf)981 static void osm_dump_mlnx_ext_port_info_to_buf(IN ib_net64_t node_guid,
982 					       IN ib_net64_t port_guid, IN uint8_t port_num,
983 					       IN const ib_mlnx_ext_port_info_t * p_pi,
984 					       OUT char * buf)
985 {
986 	if (!buf || !p_pi)
987 		return;
988 	else {
989 		sprintf(buf,
990                         "MLNX ExtendedPortInfo dump:\n"
991                         "\t\t\t\tport number..............%u\n"
992                         "\t\t\t\tnode_guid................0x%016" PRIx64 "\n"
993                         "\t\t\t\tport_guid................0x%016" PRIx64 "\n"
994                         "\t\t\t\tStateChangeEnable........0x%X\n"
995                         "\t\t\t\tLinkSpeedSupported.......0x%X\n"
996                         "\t\t\t\tLinkSpeedEnabled.........0x%X\n"
997                         "\t\t\t\tLinkSpeedActive..........0x%X\n",
998                         port_num, cl_ntoh64(node_guid), cl_ntoh64(port_guid),
999                         p_pi->state_change_enable, p_pi->link_speed_supported,
1000                         p_pi->link_speed_enabled, p_pi->link_speed_active);
1001 	}
1002 }
1003 
osm_dump_mlnx_ext_port_info(IN osm_log_t * p_log,IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t port_num,IN const ib_mlnx_ext_port_info_t * p_pi,IN osm_log_level_t log_level)1004 void osm_dump_mlnx_ext_port_info(IN osm_log_t * p_log, IN ib_net64_t node_guid,
1005 				 IN ib_net64_t port_guid, IN uint8_t port_num,
1006 				 IN const ib_mlnx_ext_port_info_t * p_pi,
1007 				 IN osm_log_level_t log_level)
1008 {
1009 	if (osm_log_is_active(p_log, log_level)) {
1010 		char buf[BUF_SIZE];
1011 
1012 		osm_dump_mlnx_ext_port_info_to_buf(node_guid, port_guid,
1013 						   port_num, p_pi, buf);
1014 
1015 		osm_log(p_log, log_level, "%s", buf);
1016 	}
1017 }
1018 
osm_dump_mlnx_ext_port_info_v2(IN osm_log_t * p_log,IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t port_num,IN const ib_mlnx_ext_port_info_t * p_pi,IN const int file_id,IN osm_log_level_t log_level)1019 void osm_dump_mlnx_ext_port_info_v2(IN osm_log_t * p_log, IN ib_net64_t node_guid,
1020 				    IN ib_net64_t port_guid, IN uint8_t port_num,
1021 				    IN const ib_mlnx_ext_port_info_t * p_pi,
1022 				    IN const int file_id, IN osm_log_level_t log_level)
1023 {
1024         if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1025                 char buf[BUF_SIZE];
1026 
1027 		osm_dump_mlnx_ext_port_info_to_buf(node_guid, port_guid,
1028 						   port_num, p_pi, buf);
1029 
1030 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1031         }
1032 }
1033 
osm_dump_portinfo_record_to_buf(IN const ib_portinfo_record_t * p_pir,OUT char * buf)1034 static void osm_dump_portinfo_record_to_buf(IN const ib_portinfo_record_t * p_pir,
1035 					    OUT char * buf)
1036 {
1037 	if (!buf || !p_pir)
1038 		return;
1039 	else {
1040 		const ib_port_info_t *p_pi = &p_pir->port_info;
1041 
1042 		sprintf(buf,
1043 			"PortInfo Record dump:\n"
1044 			"\t\t\t\tRID\n"
1045 			"\t\t\t\tEndPortLid...............%u\n"
1046 			"\t\t\t\tPortNum..................%u\n"
1047 			"\t\t\t\tOptions..................0x%X\n"
1048 			"\t\t\t\tPortInfo dump:\n"
1049 			"\t\t\t\tm_key....................0x%016" PRIx64 "\n"
1050 			"\t\t\t\tsubnet_prefix............0x%016" PRIx64 "\n"
1051 			"\t\t\t\tbase_lid.................%u\n"
1052 			"\t\t\t\tmaster_sm_base_lid.......%u\n"
1053 			"\t\t\t\tcapability_mask..........0x%X\n"
1054 			"\t\t\t\tdiag_code................0x%X\n"
1055 			"\t\t\t\tm_key_lease_period.......0x%X\n"
1056 			"\t\t\t\tlocal_port_num...........%u\n"
1057 			"\t\t\t\tlink_width_enabled.......0x%X\n"
1058 			"\t\t\t\tlink_width_supported.....0x%X\n"
1059 			"\t\t\t\tlink_width_active........0x%X\n"
1060 			"\t\t\t\tlink_speed_supported.....0x%X\n"
1061 			"\t\t\t\tport_state...............%s\n"
1062 			"\t\t\t\tstate_info2..............0x%X\n"
1063 			"\t\t\t\tm_key_protect_bits.......0x%X\n"
1064 			"\t\t\t\tlmc......................0x%X\n"
1065 			"\t\t\t\tlink_speed...............0x%X\n"
1066 			"\t\t\t\tmtu_smsl.................0x%X\n"
1067 			"\t\t\t\tvl_cap_init_type.........0x%X\n"
1068 			"\t\t\t\tvl_high_limit............0x%X\n"
1069 			"\t\t\t\tvl_arb_high_cap..........0x%X\n"
1070 			"\t\t\t\tvl_arb_low_cap...........0x%X\n"
1071 			"\t\t\t\tinit_rep_mtu_cap.........0x%X\n"
1072 			"\t\t\t\tvl_stall_life............0x%X\n"
1073 			"\t\t\t\tvl_enforce...............0x%X\n"
1074 			"\t\t\t\tm_key_violations.........0x%X\n"
1075 			"\t\t\t\tp_key_violations.........0x%X\n"
1076 			"\t\t\t\tq_key_violations.........0x%X\n"
1077 			"\t\t\t\tguid_cap.................0x%X\n"
1078 			"\t\t\t\tclient_reregister........0x%X\n"
1079 			"\t\t\t\tmcast_pkey_trap_suppr....0x%X\n"
1080 			"\t\t\t\tsubnet_timeout...........0x%X\n"
1081 			"\t\t\t\tresp_time_value..........0x%X\n"
1082 			"\t\t\t\terror_threshold..........0x%X\n"
1083 			"\t\t\t\tmax_credit_hint..........0x%X\n"
1084 			"\t\t\t\tlink_round_trip_latency..0x%X\n"
1085 			"\t\t\t\tcapability_mask2.........0x%X\n"
1086 			"\t\t\t\tlink_speed_ext_active....0x%X\n"
1087 			"\t\t\t\tlink_speed_ext_supported.0x%X\n"
1088 			"\t\t\t\tlink_speed_ext_enabled...0x%X\n",
1089 			cl_ntoh16(p_pir->lid), p_pir->port_num, p_pir->options,
1090 			cl_ntoh64(p_pi->m_key), cl_ntoh64(p_pi->subnet_prefix),
1091 			cl_ntoh16(p_pi->base_lid),
1092 			cl_ntoh16(p_pi->master_sm_base_lid),
1093 			cl_ntoh32(p_pi->capability_mask),
1094 			cl_ntoh16(p_pi->diag_code),
1095 			cl_ntoh16(p_pi->m_key_lease_period),
1096 			p_pi->local_port_num, p_pi->link_width_enabled,
1097 			p_pi->link_width_supported, p_pi->link_width_active,
1098 			ib_port_info_get_link_speed_sup(p_pi),
1099 			ib_get_port_state_str(ib_port_info_get_port_state
1100 					      (p_pi)), p_pi->state_info2,
1101 			ib_port_info_get_mpb(p_pi), ib_port_info_get_lmc(p_pi),
1102 			p_pi->link_speed, p_pi->mtu_smsl, p_pi->vl_cap,
1103 			p_pi->vl_high_limit, p_pi->vl_arb_high_cap,
1104 			p_pi->vl_arb_low_cap, p_pi->mtu_cap,
1105 			p_pi->vl_stall_life, p_pi->vl_enforce,
1106 			cl_ntoh16(p_pi->m_key_violations),
1107 			cl_ntoh16(p_pi->p_key_violations),
1108 			cl_ntoh16(p_pi->q_key_violations), p_pi->guid_cap,
1109 			ib_port_info_get_client_rereg(p_pi),
1110 			ib_port_info_get_mcast_pkey_trap_suppress(p_pi),
1111 			ib_port_info_get_timeout(p_pi),
1112 			ib_port_info_get_resp_time_value(p_pi),
1113 			p_pi->error_threshold, cl_ntoh16(p_pi->max_credit_hint),
1114 			cl_ntoh32(p_pi->link_rt_latency),
1115 			cl_ntoh16(p_pi->capability_mask2),
1116 			ib_port_info_get_link_speed_ext_active(p_pi),
1117 			ib_port_info_get_link_speed_ext_sup(p_pi),
1118 			p_pi->link_speed_ext_enabled);
1119 	}
1120 }
1121 
osm_dump_portinfo_record(IN osm_log_t * p_log,IN const ib_portinfo_record_t * p_pir,IN osm_log_level_t log_level)1122 void osm_dump_portinfo_record(IN osm_log_t * p_log,
1123 			      IN const ib_portinfo_record_t * p_pir,
1124 			      IN osm_log_level_t log_level)
1125 {
1126 	if (osm_log_is_active(p_log, log_level)) {
1127 		char buf[BUF_SIZE];
1128 		const ib_port_info_t *p_pi = &p_pir->port_info;
1129 
1130 		osm_dump_portinfo_record_to_buf(p_pir, buf);
1131 
1132 		osm_log(p_log, log_level, "%s", buf);
1133 
1134 		/*  show the capabilities masks */
1135 		if (p_pi->capability_mask) {
1136 			dbg_get_capabilities_str(buf, BUF_SIZE, "\t\t\t\t",
1137 						 p_pi);
1138 			osm_log(p_log, log_level, "%s", buf);
1139 		}
1140 		if ((p_pi->capability_mask & IB_PORT_CAP_HAS_CAP_MASK2) &&
1141 		    p_pi->capability_mask2) {
1142 			dbg_get_capabilities2_str(buf, BUF_SIZE, "\t\t\t\t",
1143 						  p_pi);
1144 			osm_log(p_log, log_level, "%s", buf);
1145 		}
1146 	}
1147 }
1148 
osm_dump_portinfo_record_v2(IN osm_log_t * p_log,IN const ib_portinfo_record_t * p_pir,IN const int file_id,IN osm_log_level_t log_level)1149 void osm_dump_portinfo_record_v2(IN osm_log_t * p_log,
1150 				 IN const ib_portinfo_record_t * p_pir,
1151 				 IN const int file_id,
1152 				 IN osm_log_level_t log_level)
1153 {
1154 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1155 		char buf[BUF_SIZE];
1156 		const ib_port_info_t *p_pi = &p_pir->port_info;
1157 
1158 		osm_dump_portinfo_record_to_buf(p_pir, buf);
1159 
1160 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1161 
1162 		/*  show the capabilities masks */
1163 		if (p_pi->capability_mask) {
1164 			dbg_get_capabilities_str(buf, BUF_SIZE, "\t\t\t\t",
1165 						 p_pi);
1166 			osm_log_v2(p_log, log_level, file_id, "%s", buf);
1167 		}
1168 		if ((p_pi->capability_mask & IB_PORT_CAP_HAS_CAP_MASK2) &&
1169 		    p_pi->capability_mask2) {
1170 			dbg_get_capabilities2_str(buf, BUF_SIZE, "\t\t\t\t",
1171 						  p_pi);
1172 			osm_log(p_log, log_level, "%s", buf);
1173 		}
1174 	}
1175 }
1176 
osm_dump_guid_info_to_buf(IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t block_num,IN const ib_guid_info_t * p_gi,OUT char * buf)1177 static void osm_dump_guid_info_to_buf(IN ib_net64_t node_guid,
1178 				      IN ib_net64_t port_guid,
1179 				      IN uint8_t block_num,
1180 				      IN const ib_guid_info_t * p_gi,
1181 				      OUT char * buf)
1182 {
1183 	if (!buf || !p_gi)
1184 		return;
1185 	else {
1186 		sprintf(buf,
1187 			"GUIDInfo dump:\n"
1188 			"\t\t\t\tblock number............%u\n"
1189 			"\t\t\t\tnode_guid...............0x%016" PRIx64 "\n"
1190 			"\t\t\t\tport_guid...............0x%016" PRIx64 "\n"
1191 			"\t\t\t\tGUID 0..................0x%016" PRIx64 "\n"
1192 			"\t\t\t\tGUID 1..................0x%016" PRIx64 "\n"
1193 			"\t\t\t\tGUID 2..................0x%016" PRIx64 "\n"
1194 			"\t\t\t\tGUID 3..................0x%016" PRIx64 "\n"
1195 			"\t\t\t\tGUID 4..................0x%016" PRIx64 "\n"
1196 			"\t\t\t\tGUID 5..................0x%016" PRIx64 "\n"
1197 			"\t\t\t\tGUID 6..................0x%016" PRIx64 "\n"
1198 			"\t\t\t\tGUID 7..................0x%016" PRIx64 "\n",
1199 			block_num, cl_ntoh64(node_guid), cl_ntoh64(port_guid),
1200 			cl_ntoh64(p_gi->guid[0]), cl_ntoh64(p_gi->guid[1]),
1201 			cl_ntoh64(p_gi->guid[2]), cl_ntoh64(p_gi->guid[3]),
1202 			cl_ntoh64(p_gi->guid[4]), cl_ntoh64(p_gi->guid[5]),
1203 			cl_ntoh64(p_gi->guid[6]), cl_ntoh64(p_gi->guid[7]));
1204 	}
1205 }
1206 
osm_dump_guid_info(IN osm_log_t * p_log,IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t block_num,IN const ib_guid_info_t * p_gi,IN osm_log_level_t log_level)1207 void osm_dump_guid_info(IN osm_log_t * p_log, IN ib_net64_t node_guid,
1208 			IN ib_net64_t port_guid, IN uint8_t block_num,
1209 			IN const ib_guid_info_t * p_gi,
1210 			IN osm_log_level_t log_level)
1211 {
1212 	if (osm_log_is_active(p_log, log_level)) {
1213 		char buf[BUF_SIZE];
1214 
1215 		osm_dump_guid_info_to_buf(node_guid, port_guid,
1216 					  block_num, p_gi, buf);
1217 
1218 		osm_log(p_log, log_level, "%s", buf);
1219 	}
1220 }
1221 
osm_dump_guid_info_v2(IN osm_log_t * p_log,IN ib_net64_t node_guid,IN ib_net64_t port_guid,IN uint8_t block_num,IN const ib_guid_info_t * p_gi,IN const int file_id,IN osm_log_level_t log_level)1222 void osm_dump_guid_info_v2(IN osm_log_t * p_log, IN ib_net64_t node_guid,
1223 			   IN ib_net64_t port_guid, IN uint8_t block_num,
1224 			   IN const ib_guid_info_t * p_gi,
1225 			   IN const int file_id,
1226 			   IN osm_log_level_t log_level)
1227 {
1228 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1229 		char buf[BUF_SIZE];
1230 
1231 		osm_dump_guid_info_to_buf(node_guid, port_guid,
1232 					  block_num, p_gi, buf);
1233 
1234 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1235 	}
1236 }
1237 
osm_dump_guidinfo_record_to_buf(IN const ib_guidinfo_record_t * p_gir,OUT char * buf)1238 static void osm_dump_guidinfo_record_to_buf(IN const ib_guidinfo_record_t * p_gir,
1239 					    OUT char * buf)
1240 {
1241 	if (!buf || !p_gir)
1242 		return;
1243 	else {
1244 		const ib_guid_info_t *p_gi = &p_gir->guid_info;
1245 
1246 		sprintf(buf,
1247 			"GUIDInfo Record dump:\n"
1248 			"\t\t\t\tRID\n"
1249 			"\t\t\t\tLid.....................%u\n"
1250 			"\t\t\t\tBlockNum................0x%X\n"
1251 			"\t\t\t\tReserved................0x%X\n"
1252 			"\t\t\t\tGUIDInfo dump:\n"
1253 			"\t\t\t\tReserved................0x%X\n"
1254 			"\t\t\t\tGUID 0..................0x%016" PRIx64 "\n"
1255 			"\t\t\t\tGUID 1..................0x%016" PRIx64 "\n"
1256 			"\t\t\t\tGUID 2..................0x%016" PRIx64 "\n"
1257 			"\t\t\t\tGUID 3..................0x%016" PRIx64 "\n"
1258 			"\t\t\t\tGUID 4..................0x%016" PRIx64 "\n"
1259 			"\t\t\t\tGUID 5..................0x%016" PRIx64 "\n"
1260 			"\t\t\t\tGUID 6..................0x%016" PRIx64 "\n"
1261 			"\t\t\t\tGUID 7..................0x%016" PRIx64 "\n",
1262 			cl_ntoh16(p_gir->lid), p_gir->block_num, p_gir->resv,
1263 			cl_ntoh32(p_gir->reserved),
1264 			cl_ntoh64(p_gi->guid[0]), cl_ntoh64(p_gi->guid[1]),
1265 			cl_ntoh64(p_gi->guid[2]), cl_ntoh64(p_gi->guid[3]),
1266 			cl_ntoh64(p_gi->guid[4]), cl_ntoh64(p_gi->guid[5]),
1267 			cl_ntoh64(p_gi->guid[6]), cl_ntoh64(p_gi->guid[7]));
1268 	}
1269 }
osm_dump_guidinfo_record(IN osm_log_t * p_log,IN const ib_guidinfo_record_t * p_gir,IN osm_log_level_t log_level)1270 void osm_dump_guidinfo_record(IN osm_log_t * p_log,
1271 			      IN const ib_guidinfo_record_t * p_gir,
1272 			      IN osm_log_level_t log_level)
1273 {
1274 	if (osm_log_is_active(p_log, log_level)) {
1275 		char buf[BUF_SIZE];
1276 
1277 		osm_dump_guidinfo_record_to_buf(p_gir, buf);
1278 
1279 		osm_log(p_log, log_level, "%s", buf);
1280 	}
1281 }
1282 
osm_dump_guidinfo_record_v2(IN osm_log_t * p_log,IN const ib_guidinfo_record_t * p_gir,IN const int file_id,IN osm_log_level_t log_level)1283 void osm_dump_guidinfo_record_v2(IN osm_log_t * p_log,
1284 				 IN const ib_guidinfo_record_t * p_gir,
1285 				 IN const int file_id,
1286 				 IN osm_log_level_t log_level)
1287 {
1288 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1289 		char buf[BUF_SIZE];
1290 
1291 		osm_dump_guidinfo_record_to_buf(p_gir, buf);
1292 
1293 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1294 	}
1295 }
1296 
osm_dump_node_info_to_buf(IN const ib_node_info_t * p_ni,OUT char * buf)1297 static void osm_dump_node_info_to_buf(IN const ib_node_info_t * p_ni,
1298 				      OUT char * buf)
1299 {
1300 	if (!buf || !p_ni)
1301 		return;
1302 	else {
1303 		sprintf(buf,
1304 			"NodeInfo dump:\n"
1305 			"\t\t\t\tbase_version............0x%X\n"
1306 			"\t\t\t\tclass_version...........0x%X\n"
1307 			"\t\t\t\tnode_type...............%s\n"
1308 			"\t\t\t\tnum_ports...............%u\n"
1309 			"\t\t\t\tsys_guid................0x%016" PRIx64 "\n"
1310 			"\t\t\t\tnode_guid...............0x%016" PRIx64 "\n"
1311 			"\t\t\t\tport_guid...............0x%016" PRIx64 "\n"
1312 			"\t\t\t\tpartition_cap...........0x%X\n"
1313 			"\t\t\t\tdevice_id...............0x%X\n"
1314 			"\t\t\t\trevision................0x%X\n"
1315 			"\t\t\t\tport_num................%u\n"
1316 			"\t\t\t\tvendor_id...............0x%X\n",
1317 			p_ni->base_version, p_ni->class_version,
1318 			ib_get_node_type_str(p_ni->node_type), p_ni->num_ports,
1319 			cl_ntoh64(p_ni->sys_guid), cl_ntoh64(p_ni->node_guid),
1320 			cl_ntoh64(p_ni->port_guid),
1321 			cl_ntoh16(p_ni->partition_cap),
1322 			cl_ntoh16(p_ni->device_id), cl_ntoh32(p_ni->revision),
1323 			ib_node_info_get_local_port_num(p_ni),
1324 			cl_ntoh32(ib_node_info_get_vendor_id(p_ni)));
1325 	}
1326 }
1327 
osm_dump_node_info(IN osm_log_t * p_log,IN const ib_node_info_t * p_ni,IN osm_log_level_t log_level)1328 void osm_dump_node_info(IN osm_log_t * p_log, IN const ib_node_info_t * p_ni,
1329 			IN osm_log_level_t log_level)
1330 {
1331 	if (osm_log_is_active(p_log, log_level)) {
1332 		char buf[BUF_SIZE];
1333 
1334 		osm_dump_node_info_to_buf(p_ni, buf);
1335 
1336 		osm_log(p_log, log_level, "%s", buf);
1337 	}
1338 }
1339 
osm_dump_node_info_v2(IN osm_log_t * p_log,IN const ib_node_info_t * p_ni,IN const int file_id,IN osm_log_level_t log_level)1340 void osm_dump_node_info_v2(IN osm_log_t * p_log, IN const ib_node_info_t * p_ni,
1341 			   IN const int file_id, IN osm_log_level_t log_level)
1342 {
1343 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1344 		char buf[BUF_SIZE];
1345 
1346 		osm_dump_node_info_to_buf(p_ni, buf);
1347 
1348 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1349 	}
1350 }
1351 
osm_dump_node_record_to_buf(IN const ib_node_record_t * p_nr,OUT char * buf)1352 static void osm_dump_node_record_to_buf(IN const ib_node_record_t * p_nr,
1353 					OUT char * buf)
1354 {
1355 	if (!buf || !p_nr)
1356 		return;
1357 	else {
1358 		char desc[sizeof(p_nr->node_desc.description) + 1];
1359 		const ib_node_info_t *p_ni = &p_nr->node_info;
1360 
1361 		memcpy(desc, p_nr->node_desc.description,
1362 		       sizeof(p_nr->node_desc.description));
1363 		desc[sizeof(desc) - 1] = '\0';
1364 		sprintf(buf,
1365 			"Node Record dump:\n"
1366 			"\t\t\t\tRID\n"
1367 			"\t\t\t\tLid.....................%u\n"
1368 			"\t\t\t\tReserved................0x%X\n"
1369 			"\t\t\t\tNodeInfo dump:\n"
1370 			"\t\t\t\tbase_version............0x%X\n"
1371 			"\t\t\t\tclass_version...........0x%X\n"
1372 			"\t\t\t\tnode_type...............%s\n"
1373 			"\t\t\t\tnum_ports...............%u\n"
1374 			"\t\t\t\tsys_guid................0x%016" PRIx64 "\n"
1375 			"\t\t\t\tnode_guid...............0x%016" PRIx64 "\n"
1376 			"\t\t\t\tport_guid...............0x%016" PRIx64 "\n"
1377 			"\t\t\t\tpartition_cap...........0x%X\n"
1378 			"\t\t\t\tdevice_id...............0x%X\n"
1379 			"\t\t\t\trevision................0x%X\n"
1380 			"\t\t\t\tport_num................%u\n"
1381 			"\t\t\t\tvendor_id...............0x%X\n"
1382 			"\t\t\t\tNodeDescription\n"
1383 			"\t\t\t\t%s\n",
1384 			cl_ntoh16(p_nr->lid), cl_ntoh16(p_nr->resv),
1385 			p_ni->base_version, p_ni->class_version,
1386 			ib_get_node_type_str(p_ni->node_type), p_ni->num_ports,
1387 			cl_ntoh64(p_ni->sys_guid), cl_ntoh64(p_ni->node_guid),
1388 			cl_ntoh64(p_ni->port_guid),
1389 			cl_ntoh16(p_ni->partition_cap),
1390 			cl_ntoh16(p_ni->device_id), cl_ntoh32(p_ni->revision),
1391 			ib_node_info_get_local_port_num(p_ni),
1392 			cl_ntoh32(ib_node_info_get_vendor_id(p_ni)), desc);
1393 	}
1394 }
1395 
osm_dump_node_record(IN osm_log_t * p_log,IN const ib_node_record_t * p_nr,IN osm_log_level_t log_level)1396 void osm_dump_node_record(IN osm_log_t * p_log,
1397 			  IN const ib_node_record_t * p_nr,
1398 			  IN osm_log_level_t log_level)
1399 {
1400 	if (osm_log_is_active(p_log, log_level)) {
1401 		char buf[BUF_SIZE];
1402 
1403 		osm_dump_node_record_to_buf(p_nr, buf);
1404 
1405 		osm_log(p_log, log_level, "%s", buf);
1406 	}
1407 }
1408 
osm_dump_node_record_v2(IN osm_log_t * p_log,IN const ib_node_record_t * p_nr,IN const int file_id,IN osm_log_level_t log_level)1409 void osm_dump_node_record_v2(IN osm_log_t * p_log,
1410 			     IN const ib_node_record_t * p_nr,
1411 			     IN const int file_id,
1412 			     IN osm_log_level_t log_level)
1413 {
1414 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1415 		char buf[BUF_SIZE];
1416 
1417 		osm_dump_node_record_to_buf(p_nr, buf);
1418 
1419 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1420 	}
1421 }
1422 
osm_dump_path_record_to_buf(IN const ib_path_rec_t * p_pr,OUT char * buf)1423 static void osm_dump_path_record_to_buf(IN const ib_path_rec_t * p_pr,
1424 					OUT char * buf)
1425 {
1426 	if (!buf || !p_pr)
1427 		return;
1428 	else {
1429 		char gid_str[INET6_ADDRSTRLEN];
1430 		char gid_str2[INET6_ADDRSTRLEN];
1431 
1432 		sprintf(buf,
1433 			"PathRecord dump:\n"
1434 			"\t\t\t\tservice_id..............0x%016" PRIx64 "\n"
1435 			"\t\t\t\tdgid....................%s\n"
1436 			"\t\t\t\tsgid....................%s\n"
1437 			"\t\t\t\tdlid....................%u\n"
1438 			"\t\t\t\tslid....................%u\n"
1439 			"\t\t\t\thop_flow_raw............0x%X\n"
1440 			"\t\t\t\ttclass..................0x%X\n"
1441 			"\t\t\t\tnum_path_revers.........0x%X\n"
1442 			"\t\t\t\tpkey....................0x%X\n"
1443 			"\t\t\t\tqos_class...............0x%X\n"
1444 			"\t\t\t\tsl......................0x%X\n"
1445 			"\t\t\t\tmtu.....................0x%X\n"
1446 			"\t\t\t\trate....................0x%X\n"
1447 			"\t\t\t\tpkt_life................0x%X\n"
1448 			"\t\t\t\tpreference..............0x%X\n"
1449 			"\t\t\t\tresv2...................0x%02X%02X%02X%02X%02X%02X\n",
1450 			cl_ntoh64(p_pr->service_id),
1451 			inet_ntop(AF_INET6, p_pr->dgid.raw, gid_str,
1452 				  sizeof gid_str),
1453 			inet_ntop(AF_INET6, p_pr->sgid.raw, gid_str2,
1454 				  sizeof gid_str2),
1455 			cl_ntoh16(p_pr->dlid), cl_ntoh16(p_pr->slid),
1456 			cl_ntoh32(p_pr->hop_flow_raw), p_pr->tclass,
1457 			p_pr->num_path, cl_ntoh16(p_pr->pkey),
1458 			ib_path_rec_qos_class(p_pr), ib_path_rec_sl(p_pr),
1459 			p_pr->mtu, p_pr->rate, p_pr->pkt_life, p_pr->preference,
1460 			p_pr->resv2[0], p_pr->resv2[1], p_pr->resv2[2],
1461 			p_pr->resv2[3], p_pr->resv2[4], p_pr->resv2[5]);
1462 	}
1463 }
1464 
osm_dump_path_record(IN osm_log_t * p_log,IN const ib_path_rec_t * p_pr,IN osm_log_level_t log_level)1465 void osm_dump_path_record(IN osm_log_t * p_log, IN const ib_path_rec_t * p_pr,
1466 			  IN osm_log_level_t log_level)
1467 {
1468 	if (osm_log_is_active(p_log, log_level)) {
1469 		char buf[BUF_SIZE];
1470 
1471 		osm_dump_path_record_to_buf(p_pr, buf);
1472 
1473 		osm_log(p_log, log_level, "%s", buf);
1474 	}
1475 }
1476 
osm_dump_path_record_v2(IN osm_log_t * p_log,IN const ib_path_rec_t * p_pr,IN const int file_id,IN osm_log_level_t log_level)1477 void osm_dump_path_record_v2(IN osm_log_t * p_log, IN const ib_path_rec_t * p_pr,
1478 			     IN const int file_id, IN osm_log_level_t log_level)
1479 {
1480 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1481 		char buf[BUF_SIZE];
1482 
1483 		osm_dump_path_record_to_buf(p_pr, buf);
1484 
1485 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1486 	}
1487 }
1488 
osm_dump_multipath_record_to_buf(IN const ib_multipath_rec_t * p_mpr,OUT char * buf)1489 static void osm_dump_multipath_record_to_buf(IN const ib_multipath_rec_t * p_mpr,
1490 					     OUT char * buf)
1491 {
1492 	if (!buf || !p_mpr)
1493 		return;
1494 	else {
1495 		char gid_str[INET6_ADDRSTRLEN];
1496 		char buf_line[1024];
1497 		ib_gid_t const *p_gid = p_mpr->gids;
1498 		int i, n = 0;
1499 
1500 		if (p_mpr->sgid_count) {
1501 			for (i = 0; i < p_mpr->sgid_count; i++) {
1502 				n += sprintf(buf_line + n,
1503 					     "\t\t\t\tsgid%02d.................."
1504 					     "%s\n", i + 1,
1505 					     inet_ntop(AF_INET6, p_gid->raw,
1506 						       gid_str,
1507 						       sizeof gid_str));
1508 				p_gid++;
1509 			}
1510 		}
1511 		if (p_mpr->dgid_count) {
1512 			for (i = 0; i < p_mpr->dgid_count; i++) {
1513 				n += sprintf(buf_line + n,
1514 					     "\t\t\t\tdgid%02d.................."
1515 					     "%s\n", i + 1,
1516 					     inet_ntop(AF_INET6, p_gid->raw,
1517 						       gid_str,
1518 						       sizeof gid_str));
1519 				p_gid++;
1520 			}
1521 		}
1522 		sprintf(buf,
1523 			"MultiPath Record dump:\n"
1524 			"\t\t\t\thop_flow_raw............0x%X\n"
1525 			"\t\t\t\ttclass..................0x%X\n"
1526 			"\t\t\t\tnum_path_revers.........0x%X\n"
1527 			"\t\t\t\tpkey....................0x%X\n"
1528 			"\t\t\t\tqos_class...............0x%X\n"
1529 			"\t\t\t\tsl......................0x%X\n"
1530 			"\t\t\t\tmtu.....................0x%X\n"
1531 			"\t\t\t\trate....................0x%X\n"
1532 			"\t\t\t\tpkt_life................0x%X\n"
1533 			"\t\t\t\tindependence............0x%X\n"
1534 			"\t\t\t\tsgid_count..............0x%X\n"
1535 			"\t\t\t\tdgid_count..............0x%X\n"
1536 			"\t\t\t\tservice_id..............0x%016" PRIx64 "\n"
1537 			"%s\n",
1538 			cl_ntoh32(p_mpr->hop_flow_raw), p_mpr->tclass,
1539 			p_mpr->num_path, cl_ntoh16(p_mpr->pkey),
1540 			ib_multipath_rec_qos_class(p_mpr),
1541 			ib_multipath_rec_sl(p_mpr), p_mpr->mtu, p_mpr->rate,
1542 			p_mpr->pkt_life, p_mpr->independence,
1543 			p_mpr->sgid_count, p_mpr->dgid_count,
1544 			cl_ntoh64(ib_multipath_rec_service_id(p_mpr)),
1545 			buf_line);
1546 	}
1547 }
1548 
osm_dump_multipath_record(IN osm_log_t * p_log,IN const ib_multipath_rec_t * p_mpr,IN osm_log_level_t log_level)1549 void osm_dump_multipath_record(IN osm_log_t * p_log,
1550 			       IN const ib_multipath_rec_t * p_mpr,
1551 			       IN osm_log_level_t log_level)
1552 {
1553 	if (osm_log_is_active(p_log, log_level)) {
1554 		char buf[BUF_SIZE];
1555 
1556 		osm_dump_multipath_record_to_buf(p_mpr, buf);
1557 
1558 		osm_log(p_log, log_level, "%s", buf);
1559 	}
1560 }
1561 
osm_dump_multipath_record_v2(IN osm_log_t * p_log,IN const ib_multipath_rec_t * p_mpr,IN const int file_id,IN osm_log_level_t log_level)1562 void osm_dump_multipath_record_v2(IN osm_log_t * p_log,
1563 				  IN const ib_multipath_rec_t * p_mpr,
1564 				  IN const int file_id,
1565 				  IN osm_log_level_t log_level)
1566 {
1567 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1568 		char buf[BUF_SIZE];
1569 
1570 		osm_dump_multipath_record_to_buf(p_mpr, buf);
1571 
1572 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1573 	}
1574 }
1575 
osm_dump_mc_record_to_buf(IN const ib_member_rec_t * p_mcmr,OUT char * buf)1576 static void osm_dump_mc_record_to_buf(IN const ib_member_rec_t * p_mcmr,
1577 				      OUT char * buf)
1578 {
1579 	if(!buf || !p_mcmr)
1580 		return;
1581 	else {
1582 		char gid_str[INET6_ADDRSTRLEN];
1583 		char gid_str2[INET6_ADDRSTRLEN];
1584 
1585 		sprintf(buf,
1586 			"MCMember Record dump:\n"
1587 			"\t\t\t\tMGID....................%s\n"
1588 			"\t\t\t\tPortGid.................%s\n"
1589 			"\t\t\t\tqkey....................0x%X\n"
1590 			"\t\t\t\tmlid....................0x%X\n"
1591 			"\t\t\t\tmtu.....................0x%X\n"
1592 			"\t\t\t\tTClass..................0x%X\n"
1593 			"\t\t\t\tpkey....................0x%X\n"
1594 			"\t\t\t\trate....................0x%X\n"
1595 			"\t\t\t\tpkt_life................0x%X\n"
1596 			"\t\t\t\tSLFlowLabelHopLimit.....0x%X\n"
1597 			"\t\t\t\tScopeState..............0x%X\n"
1598 			"\t\t\t\tProxyJoin...............0x%X\n",
1599 			inet_ntop(AF_INET6, p_mcmr->mgid.raw, gid_str,
1600 				  sizeof gid_str),
1601 			inet_ntop(AF_INET6, p_mcmr->port_gid.raw, gid_str2,
1602 				  sizeof gid_str2),
1603 			cl_ntoh32(p_mcmr->qkey), cl_ntoh16(p_mcmr->mlid),
1604 			p_mcmr->mtu, p_mcmr->tclass, cl_ntoh16(p_mcmr->pkey),
1605 			p_mcmr->rate, p_mcmr->pkt_life,
1606 			cl_ntoh32(p_mcmr->sl_flow_hop),
1607 			p_mcmr->scope_state, p_mcmr->proxy_join);
1608 	}
1609 }
1610 
osm_dump_mc_record(IN osm_log_t * p_log,IN const ib_member_rec_t * p_mcmr,IN osm_log_level_t log_level)1611 void osm_dump_mc_record(IN osm_log_t * p_log, IN const ib_member_rec_t * p_mcmr,
1612 			IN osm_log_level_t log_level)
1613 {
1614 	if (osm_log_is_active(p_log, log_level)) {
1615 		char buf[BUF_SIZE];
1616 
1617 		osm_dump_mc_record_to_buf(p_mcmr, buf);
1618 
1619 		osm_log(p_log, log_level, "%s", buf);
1620 	}
1621 }
1622 
osm_dump_mc_record_v2(IN osm_log_t * p_log,IN const ib_member_rec_t * p_mcmr,IN const int file_id,IN osm_log_level_t log_level)1623 void osm_dump_mc_record_v2(IN osm_log_t * p_log, IN const ib_member_rec_t * p_mcmr,
1624 			   IN const int file_id, IN osm_log_level_t log_level)
1625 {
1626 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1627 		char buf[BUF_SIZE];
1628 
1629 		osm_dump_mc_record_to_buf(p_mcmr, buf);
1630 
1631 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1632 	}
1633 }
1634 
osm_dump_service_record_to_buf(IN const ib_service_record_t * p_sr,OUT char * buf)1635 static void osm_dump_service_record_to_buf(IN const ib_service_record_t * p_sr,
1636 					   OUT char * buf)
1637 {
1638 	if (!buf || !p_sr)
1639 		return;
1640 	else {
1641 		char gid_str[INET6_ADDRSTRLEN];
1642 		char buf_service_key[35];
1643 		char buf_service_name[65];
1644 
1645 		sprintf(buf_service_key,
1646 			"0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
1647 			p_sr->service_key[0], p_sr->service_key[1],
1648 			p_sr->service_key[2], p_sr->service_key[3],
1649 			p_sr->service_key[4], p_sr->service_key[5],
1650 			p_sr->service_key[6], p_sr->service_key[7],
1651 			p_sr->service_key[8], p_sr->service_key[9],
1652 			p_sr->service_key[10], p_sr->service_key[11],
1653 			p_sr->service_key[12], p_sr->service_key[13],
1654 			p_sr->service_key[14], p_sr->service_key[15]);
1655 		strncpy(buf_service_name, (char *)p_sr->service_name, 64);
1656 		buf_service_name[64] = '\0';
1657 
1658 		sprintf(buf,
1659 			"Service Record dump:\n"
1660 			"\t\t\t\tServiceID...............0x%016" PRIx64 "\n"
1661 			"\t\t\t\tServiceGID..............%s\n"
1662 			"\t\t\t\tServiceP_Key............0x%X\n"
1663 			"\t\t\t\tServiceLease............0x%X\n"
1664 			"\t\t\t\tServiceKey..............%s\n"
1665 			"\t\t\t\tServiceName.............%s\n"
1666 			"\t\t\t\tServiceData8.1..........0x%X\n"
1667 			"\t\t\t\tServiceData8.2..........0x%X\n"
1668 			"\t\t\t\tServiceData8.3..........0x%X\n"
1669 			"\t\t\t\tServiceData8.4..........0x%X\n"
1670 			"\t\t\t\tServiceData8.5..........0x%X\n"
1671 			"\t\t\t\tServiceData8.6..........0x%X\n"
1672 			"\t\t\t\tServiceData8.7..........0x%X\n"
1673 			"\t\t\t\tServiceData8.8..........0x%X\n"
1674 			"\t\t\t\tServiceData8.9..........0x%X\n"
1675 			"\t\t\t\tServiceData8.10.........0x%X\n"
1676 			"\t\t\t\tServiceData8.11.........0x%X\n"
1677 			"\t\t\t\tServiceData8.12.........0x%X\n"
1678 			"\t\t\t\tServiceData8.13.........0x%X\n"
1679 			"\t\t\t\tServiceData8.14.........0x%X\n"
1680 			"\t\t\t\tServiceData8.15.........0x%X\n"
1681 			"\t\t\t\tServiceData8.16.........0x%X\n"
1682 			"\t\t\t\tServiceData16.1.........0x%X\n"
1683 			"\t\t\t\tServiceData16.2.........0x%X\n"
1684 			"\t\t\t\tServiceData16.3.........0x%X\n"
1685 			"\t\t\t\tServiceData16.4.........0x%X\n"
1686 			"\t\t\t\tServiceData16.5.........0x%X\n"
1687 			"\t\t\t\tServiceData16.6.........0x%X\n"
1688 			"\t\t\t\tServiceData16.7.........0x%X\n"
1689 			"\t\t\t\tServiceData16.8.........0x%X\n"
1690 			"\t\t\t\tServiceData32.1.........0x%X\n"
1691 			"\t\t\t\tServiceData32.2.........0x%X\n"
1692 			"\t\t\t\tServiceData32.3.........0x%X\n"
1693 			"\t\t\t\tServiceData32.4.........0x%X\n"
1694 			"\t\t\t\tServiceData64.1.........0x%016" PRIx64 "\n"
1695 			"\t\t\t\tServiceData64.2.........0x%016" PRIx64 "\n",
1696 			cl_ntoh64(p_sr->service_id),
1697 			inet_ntop(AF_INET6, p_sr->service_gid.raw, gid_str,
1698 				  sizeof gid_str),
1699 			cl_ntoh16(p_sr->service_pkey),
1700 			cl_ntoh32(p_sr->service_lease),
1701 			buf_service_key, buf_service_name,
1702 			p_sr->service_data8[0], p_sr->service_data8[1],
1703 			p_sr->service_data8[2], p_sr->service_data8[3],
1704 			p_sr->service_data8[4], p_sr->service_data8[5],
1705 			p_sr->service_data8[6], p_sr->service_data8[7],
1706 			p_sr->service_data8[8], p_sr->service_data8[9],
1707 			p_sr->service_data8[10], p_sr->service_data8[11],
1708 			p_sr->service_data8[12], p_sr->service_data8[13],
1709 			p_sr->service_data8[14], p_sr->service_data8[15],
1710 			cl_ntoh16(p_sr->service_data16[0]),
1711 			cl_ntoh16(p_sr->service_data16[1]),
1712 			cl_ntoh16(p_sr->service_data16[2]),
1713 			cl_ntoh16(p_sr->service_data16[3]),
1714 			cl_ntoh16(p_sr->service_data16[4]),
1715 			cl_ntoh16(p_sr->service_data16[5]),
1716 			cl_ntoh16(p_sr->service_data16[6]),
1717 			cl_ntoh16(p_sr->service_data16[7]),
1718 			cl_ntoh32(p_sr->service_data32[0]),
1719 			cl_ntoh32(p_sr->service_data32[1]),
1720 			cl_ntoh32(p_sr->service_data32[2]),
1721 			cl_ntoh32(p_sr->service_data32[3]),
1722 			cl_ntoh64(p_sr->service_data64[0]),
1723 			cl_ntoh64(p_sr->service_data64[1]));
1724 	}
1725 }
1726 
osm_dump_service_record(IN osm_log_t * p_log,IN const ib_service_record_t * p_sr,IN osm_log_level_t log_level)1727 void osm_dump_service_record(IN osm_log_t * p_log,
1728 			     IN const ib_service_record_t * p_sr,
1729 			     IN osm_log_level_t log_level)
1730 {
1731 	if (osm_log_is_active(p_log, log_level)) {
1732 		char buf[BUF_SIZE];
1733 
1734 		osm_dump_service_record_to_buf(p_sr, buf);
1735 
1736 		osm_log(p_log, log_level, "%s", buf);
1737 	}
1738 }
1739 
osm_dump_service_record_v2(IN osm_log_t * p_log,IN const ib_service_record_t * p_sr,IN const int file_id,IN osm_log_level_t log_level)1740 void osm_dump_service_record_v2(IN osm_log_t * p_log,
1741 				IN const ib_service_record_t * p_sr,
1742 				IN const int file_id,
1743 				IN osm_log_level_t log_level)
1744 {
1745 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1746 		char buf[BUF_SIZE];
1747 
1748 		osm_dump_service_record_to_buf(p_sr, buf);
1749 
1750 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1751 	}
1752 }
1753 
osm_dump_inform_info_to_buf_generic(IN const ib_inform_info_t * p_ii,OUT char * buf)1754 static void osm_dump_inform_info_to_buf_generic(IN const ib_inform_info_t * p_ii,
1755 						OUT char * buf)
1756 {
1757 	if (!buf || !p_ii)
1758 		return;
1759 	else {
1760 		uint32_t qpn;
1761 		uint8_t resp_time_val;
1762 		char gid_str[INET6_ADDRSTRLEN];
1763 
1764 		ib_inform_info_get_qpn_resp_time(p_ii->g_or_v.generic.
1765 						 qpn_resp_time_val, &qpn,
1766 						 &resp_time_val);
1767 		sprintf(buf,
1768 			"InformInfo dump:\n"
1769 			"\t\t\t\tgid.....................%s\n"
1770 			"\t\t\t\tlid_range_begin.........%u\n"
1771 			"\t\t\t\tlid_range_end...........%u\n"
1772 			"\t\t\t\tis_generic..............0x%X\n"
1773 			"\t\t\t\tsubscribe...............0x%X\n"
1774 			"\t\t\t\ttrap_type...............0x%X\n"
1775 			"\t\t\t\ttrap_num................%u\n"
1776 			"\t\t\t\tqpn.....................0x%06X\n"
1777 			"\t\t\t\tresp_time_val...........0x%X\n"
1778 			"\t\t\t\tnode_type...............0x%06X\n" "",
1779 			inet_ntop(AF_INET6, p_ii->gid.raw, gid_str,
1780 				  sizeof gid_str),
1781 			cl_ntoh16(p_ii->lid_range_begin),
1782 			cl_ntoh16(p_ii->lid_range_end),
1783 			p_ii->is_generic, p_ii->subscribe,
1784 			cl_ntoh16(p_ii->trap_type),
1785 			cl_ntoh16(p_ii->g_or_v.generic.trap_num),
1786 			cl_ntoh32(qpn), resp_time_val,
1787 			cl_ntoh32(ib_inform_info_get_prod_type(p_ii)));
1788 	}
1789 }
1790 
osm_dump_inform_info_to_buf(IN const ib_inform_info_t * p_ii,OUT char * buf)1791 static void osm_dump_inform_info_to_buf(IN const ib_inform_info_t * p_ii,
1792 					OUT char * buf)
1793 {
1794 	if (!buf || !p_ii)
1795 		return;
1796 	else {
1797 		uint32_t qpn;
1798 		uint8_t resp_time_val;
1799 		char gid_str[INET6_ADDRSTRLEN];
1800 
1801 		ib_inform_info_get_qpn_resp_time(p_ii->g_or_v.generic.
1802 						 qpn_resp_time_val, &qpn,
1803 						 &resp_time_val);
1804 		sprintf(buf,
1805 			"InformInfo dump:\n"
1806 			"\t\t\t\tgid.....................%s\n"
1807 			"\t\t\t\tlid_range_begin.........%u\n"
1808 			"\t\t\t\tlid_range_end...........%u\n"
1809 			"\t\t\t\tis_generic..............0x%X\n"
1810 			"\t\t\t\tsubscribe...............0x%X\n"
1811 			"\t\t\t\ttrap_type...............0x%X\n"
1812 			"\t\t\t\tdev_id..................0x%X\n"
1813 			"\t\t\t\tqpn.....................0x%06X\n"
1814 			"\t\t\t\tresp_time_val...........0x%X\n"
1815 			"\t\t\t\tvendor_id...............0x%06X\n" "",
1816 			inet_ntop(AF_INET6, p_ii->gid.raw, gid_str,
1817 				  sizeof gid_str),
1818 			cl_ntoh16(p_ii->lid_range_begin),
1819 			cl_ntoh16(p_ii->lid_range_end),
1820 			p_ii->is_generic, p_ii->subscribe,
1821 			cl_ntoh16(p_ii->trap_type),
1822 			cl_ntoh16(p_ii->g_or_v.vend.dev_id),
1823 			cl_ntoh32(qpn), resp_time_val,
1824 			cl_ntoh32(ib_inform_info_get_prod_type(p_ii)));
1825 	}
1826 }
1827 
osm_dump_inform_info(IN osm_log_t * p_log,IN const ib_inform_info_t * p_ii,IN osm_log_level_t log_level)1828 void osm_dump_inform_info(IN osm_log_t * p_log,
1829 			  IN const ib_inform_info_t * p_ii,
1830 			  IN osm_log_level_t log_level)
1831 {
1832 	if (osm_log_is_active(p_log, log_level)) {
1833 		char buf[BUF_SIZE];
1834 
1835 		if (p_ii->is_generic)
1836 			osm_dump_inform_info_to_buf_generic(p_ii, buf);
1837 		else
1838 			osm_dump_inform_info_to_buf(p_ii, buf);
1839 
1840 		osm_log(p_log, log_level, "%s", buf);
1841 	}
1842 }
1843 
osm_dump_inform_info_v2(IN osm_log_t * p_log,IN const ib_inform_info_t * p_ii,IN const int file_id,IN osm_log_level_t log_level)1844 void osm_dump_inform_info_v2(IN osm_log_t * p_log,
1845 			     IN const ib_inform_info_t * p_ii,
1846 			     IN const int file_id,
1847 			     IN osm_log_level_t log_level)
1848 {
1849 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1850 		char buf[BUF_SIZE];
1851 
1852 		if (p_ii->is_generic)
1853 			osm_dump_inform_info_to_buf_generic(p_ii, buf);
1854 		else
1855 			osm_dump_inform_info_to_buf(p_ii, buf);
1856 
1857 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1858 	}
1859 }
1860 
osm_dump_inform_info_record_to_buf_generic(IN const ib_inform_info_record_t * p_iir,OUT char * buf)1861 static void osm_dump_inform_info_record_to_buf_generic(IN const ib_inform_info_record_t * p_iir,
1862 						       OUT char * buf)
1863 {
1864 	if (!buf || p_iir)
1865 		return;
1866 	else {
1867 		char gid_str[INET6_ADDRSTRLEN];
1868 		char gid_str2[INET6_ADDRSTRLEN];
1869 		uint32_t qpn;
1870 		uint8_t resp_time_val;
1871 
1872 		ib_inform_info_get_qpn_resp_time(p_iir->inform_info.g_or_v.
1873 						 generic.qpn_resp_time_val,
1874 						 &qpn, &resp_time_val);
1875 		sprintf(buf,
1876 			"InformInfo Record dump:\n"
1877 			"\t\t\t\tRID\n"
1878 			"\t\t\t\tSubscriberGID...........%s\n"
1879 			"\t\t\t\tSubscriberEnum..........0x%X\n"
1880 			"\t\t\t\tInformInfo dump:\n"
1881 			"\t\t\t\tgid.....................%s\n"
1882 			"\t\t\t\tlid_range_begin.........%u\n"
1883 			"\t\t\t\tlid_range_end...........%u\n"
1884 			"\t\t\t\tis_generic..............0x%X\n"
1885 			"\t\t\t\tsubscribe...............0x%X\n"
1886 			"\t\t\t\ttrap_type...............0x%X\n"
1887 			"\t\t\t\ttrap_num................%u\n"
1888 			"\t\t\t\tqpn.....................0x%06X\n"
1889 			"\t\t\t\tresp_time_val...........0x%X\n"
1890 			"\t\t\t\tnode_type...............0x%06X\n" "",
1891 			inet_ntop(AF_INET6, p_iir->subscriber_gid.raw,
1892 				  gid_str, sizeof gid_str),
1893 			cl_ntoh16(p_iir->subscriber_enum),
1894 			inet_ntop(AF_INET6, p_iir->inform_info.gid.raw,
1895 				  gid_str2, sizeof gid_str2),
1896 			cl_ntoh16(p_iir->inform_info.lid_range_begin),
1897 			cl_ntoh16(p_iir->inform_info.lid_range_end),
1898 			p_iir->inform_info.is_generic,
1899 			p_iir->inform_info.subscribe,
1900 			cl_ntoh16(p_iir->inform_info.trap_type),
1901 			cl_ntoh16(p_iir->inform_info.g_or_v.generic.
1902 				  trap_num), cl_ntoh32(qpn),
1903 			resp_time_val,
1904 			cl_ntoh32(ib_inform_info_get_prod_type
1905 				  (&p_iir->inform_info)));
1906 	}
1907 }
1908 
osm_dump_inform_info_record_to_buf(IN const ib_inform_info_record_t * p_iir,OUT char * buf)1909 static void osm_dump_inform_info_record_to_buf(IN const ib_inform_info_record_t * p_iir,
1910 					       OUT char * buf)
1911 {
1912 	if(!buf || p_iir)
1913 		return;
1914 	else {
1915 		char gid_str[INET6_ADDRSTRLEN];
1916 		char gid_str2[INET6_ADDRSTRLEN];
1917 		uint32_t qpn;
1918 		uint8_t resp_time_val;
1919 
1920 		ib_inform_info_get_qpn_resp_time(p_iir->inform_info.g_or_v.
1921 						 generic.qpn_resp_time_val,
1922 						 &qpn, &resp_time_val);
1923 		sprintf(buf,
1924 			"InformInfo Record dump:\n"
1925 			"\t\t\t\tRID\n"
1926 			"\t\t\t\tSubscriberGID...........%s\n"
1927 			"\t\t\t\tSubscriberEnum..........0x%X\n"
1928 			"\t\t\t\tInformInfo dump:\n"
1929 			"\t\t\t\tgid.....................%s\n"
1930 			"\t\t\t\tlid_range_begin.........%u\n"
1931 			"\t\t\t\tlid_range_end...........%u\n"
1932 			"\t\t\t\tis_generic..............0x%X\n"
1933 			"\t\t\t\tsubscribe...............0x%X\n"
1934 			"\t\t\t\ttrap_type...............0x%X\n"
1935 			"\t\t\t\tdev_id..................0x%X\n"
1936 			"\t\t\t\tqpn.....................0x%06X\n"
1937 			"\t\t\t\tresp_time_val...........0x%X\n"
1938 			"\t\t\t\tvendor_id...............0x%06X\n" "",
1939 			inet_ntop(AF_INET6, p_iir->subscriber_gid.raw,
1940 				  gid_str, sizeof gid_str),
1941 			cl_ntoh16(p_iir->subscriber_enum),
1942 			inet_ntop(AF_INET6, p_iir->inform_info.gid.raw,
1943 				  gid_str2, sizeof gid_str2),
1944 			cl_ntoh16(p_iir->inform_info.lid_range_begin),
1945 			cl_ntoh16(p_iir->inform_info.lid_range_end),
1946 			p_iir->inform_info.is_generic,
1947 			p_iir->inform_info.subscribe,
1948 			cl_ntoh16(p_iir->inform_info.trap_type),
1949 			cl_ntoh16(p_iir->inform_info.g_or_v.vend.
1950 				  dev_id), cl_ntoh32(qpn),
1951 			resp_time_val,
1952 			cl_ntoh32(ib_inform_info_get_prod_type
1953 				  (&p_iir->inform_info)));
1954 	}
1955 }
1956 
osm_dump_inform_info_record(IN osm_log_t * p_log,IN const ib_inform_info_record_t * p_iir,IN osm_log_level_t log_level)1957 void osm_dump_inform_info_record(IN osm_log_t * p_log,
1958 				 IN const ib_inform_info_record_t * p_iir,
1959 				 IN osm_log_level_t log_level)
1960 {
1961 	if (osm_log_is_active(p_log, log_level)) {
1962 		char buf[BUF_SIZE];
1963 
1964 		if (p_iir->inform_info.is_generic)
1965 			osm_dump_inform_info_record_to_buf_generic(p_iir, buf);
1966 		else
1967 			osm_dump_inform_info_record_to_buf(p_iir, buf);
1968 
1969 		osm_log(p_log, log_level, "%s", buf);
1970 	}
1971 }
1972 
osm_dump_inform_info_record_v2(IN osm_log_t * p_log,IN const ib_inform_info_record_t * p_iir,IN const int file_id,IN osm_log_level_t log_level)1973 void osm_dump_inform_info_record_v2(IN osm_log_t * p_log,
1974 				    IN const ib_inform_info_record_t * p_iir,
1975 				    IN const int file_id,
1976 				    IN osm_log_level_t log_level)
1977 {
1978 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
1979 		char buf[BUF_SIZE];
1980 
1981 		if (p_iir->inform_info.is_generic)
1982 			osm_dump_inform_info_record_to_buf_generic(p_iir, buf);
1983 		else
1984 			osm_dump_inform_info_record_to_buf(p_iir, buf);
1985 
1986 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
1987 	}
1988 }
1989 
osm_dump_link_record_to_buf(IN const ib_link_record_t * p_lr,OUT char * buf)1990 static void osm_dump_link_record_to_buf(IN const ib_link_record_t * p_lr,
1991 					OUT char * buf)
1992 {
1993 	if (!buf || !p_lr)
1994 		return;
1995 	else {
1996 		sprintf(buf,
1997 			"Link Record dump:\n"
1998 			"\t\t\t\tfrom_lid................%u\n"
1999 			"\t\t\t\tfrom_port_num...........%u\n"
2000 			"\t\t\t\tto_port_num.............%u\n"
2001 			"\t\t\t\tto_lid..................%u\n",
2002 			cl_ntoh16(p_lr->from_lid),
2003 			p_lr->from_port_num,
2004 			p_lr->to_port_num, cl_ntoh16(p_lr->to_lid));
2005 	}
2006 }
2007 
osm_dump_link_record(IN osm_log_t * p_log,IN const ib_link_record_t * p_lr,IN osm_log_level_t log_level)2008 void osm_dump_link_record(IN osm_log_t * p_log,
2009 			  IN const ib_link_record_t * p_lr,
2010 			  IN osm_log_level_t log_level)
2011 {
2012 	if (osm_log_is_active(p_log, log_level)) {
2013 		char buf[BUF_SIZE];
2014 
2015 		osm_dump_link_record_to_buf(p_lr, buf);
2016 
2017 		osm_log(p_log, log_level, "%s", buf);
2018 	}
2019 }
2020 
osm_dump_link_record_v2(IN osm_log_t * p_log,IN const ib_link_record_t * p_lr,IN const int file_id,IN osm_log_level_t log_level)2021 void osm_dump_link_record_v2(IN osm_log_t * p_log,
2022 			     IN const ib_link_record_t * p_lr,
2023 			     IN const int file_id,
2024 			     IN osm_log_level_t log_level)
2025 {
2026 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2027 		char buf[BUF_SIZE];
2028 
2029 		osm_dump_link_record_to_buf(p_lr, buf);
2030 
2031 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
2032 	}
2033 }
2034 
osm_dump_switch_info_to_buf(IN const ib_switch_info_t * p_si,OUT char * buf)2035 static void osm_dump_switch_info_to_buf(IN const ib_switch_info_t * p_si,
2036 					OUT char * buf)
2037 {
2038 	if (!buf || !p_si)
2039 		return;
2040 	else {
2041 		sprintf(buf,
2042 			"SwitchInfo dump:\n"
2043 			"\t\t\t\tlin_cap.................0x%X\n"
2044 			"\t\t\t\trand_cap................0x%X\n"
2045 			"\t\t\t\tmcast_cap...............0x%X\n"
2046 			"\t\t\t\tlin_top.................0x%X\n"
2047 			"\t\t\t\tdef_port................%u\n"
2048 			"\t\t\t\tdef_mcast_pri_port......%u\n"
2049 			"\t\t\t\tdef_mcast_not_port......%u\n"
2050 			"\t\t\t\tlife_state..............0x%X\n"
2051 			"\t\t\t\tlids_per_port...........%u\n"
2052 			"\t\t\t\tpartition_enf_cap.......0x%X\n"
2053 			"\t\t\t\tflags...................0x%X\n"
2054 			"\t\t\t\tmcast_top...............0x%X\n",
2055 			cl_ntoh16(p_si->lin_cap), cl_ntoh16(p_si->rand_cap),
2056 			cl_ntoh16(p_si->mcast_cap), cl_ntoh16(p_si->lin_top),
2057 			p_si->def_port, p_si->def_mcast_pri_port,
2058 			p_si->def_mcast_not_port, p_si->life_state,
2059 			cl_ntoh16(p_si->lids_per_port),
2060 			cl_ntoh16(p_si->enforce_cap), p_si->flags,
2061 			cl_ntoh16(p_si->mcast_top));
2062 	}
2063 }
2064 
osm_dump_switch_info(IN osm_log_t * p_log,IN const ib_switch_info_t * p_si,IN osm_log_level_t log_level)2065 void osm_dump_switch_info(IN osm_log_t * p_log,
2066 			  IN const ib_switch_info_t * p_si,
2067 			  IN osm_log_level_t log_level)
2068 {
2069 	if (osm_log_is_active(p_log, log_level)) {
2070 		char buf[BUF_SIZE];
2071 
2072 		osm_dump_switch_info_to_buf(p_si, buf);
2073 
2074 		osm_log(p_log, OSM_LOG_VERBOSE, "%s", buf);
2075 	}
2076 }
2077 
osm_dump_switch_info_v2(IN osm_log_t * p_log,IN const ib_switch_info_t * p_si,IN const int file_id,IN osm_log_level_t log_level)2078 void osm_dump_switch_info_v2(IN osm_log_t * p_log,
2079 			     IN const ib_switch_info_t * p_si,
2080 			     IN const int file_id,
2081 			     IN osm_log_level_t log_level)
2082 {
2083 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2084 		char buf[BUF_SIZE];
2085 
2086 		osm_dump_switch_info_to_buf(p_si, buf);
2087 
2088 		osm_log_v2(p_log, OSM_LOG_VERBOSE, file_id, "%s", buf);
2089 	}
2090 }
2091 
osm_dump_switch_info_record_to_buf(IN const ib_switch_info_record_t * p_sir,OUT char * buf)2092 static void osm_dump_switch_info_record_to_buf(IN const ib_switch_info_record_t * p_sir,
2093 					       OUT char * buf)
2094 {
2095 	if (!buf || !p_sir)
2096 		return;
2097 	else {
2098 		sprintf(buf,
2099 			"SwitchInfo Record dump:\n"
2100 			"\t\t\t\tRID\n"
2101 			"\t\t\t\tlid.....................%u\n"
2102 			"\t\t\t\tSwitchInfo dump:\n"
2103 			"\t\t\t\tlin_cap.................0x%X\n"
2104 			"\t\t\t\trand_cap................0x%X\n"
2105 			"\t\t\t\tmcast_cap...............0x%X\n"
2106 			"\t\t\t\tlin_top.................0x%X\n"
2107 			"\t\t\t\tdef_port................%u\n"
2108 			"\t\t\t\tdef_mcast_pri_port......%u\n"
2109 			"\t\t\t\tdef_mcast_not_port......%u\n"
2110 			"\t\t\t\tlife_state..............0x%X\n"
2111 			"\t\t\t\tlids_per_port...........%u\n"
2112 			"\t\t\t\tpartition_enf_cap.......0x%X\n"
2113 			"\t\t\t\tflags...................0x%X\n",
2114 			cl_ntoh16(p_sir->lid),
2115 			cl_ntoh16(p_sir->switch_info.lin_cap),
2116 			cl_ntoh16(p_sir->switch_info.rand_cap),
2117 			cl_ntoh16(p_sir->switch_info.mcast_cap),
2118 			cl_ntoh16(p_sir->switch_info.lin_top),
2119 			p_sir->switch_info.def_port,
2120 			p_sir->switch_info.def_mcast_pri_port,
2121 			p_sir->switch_info.def_mcast_not_port,
2122 			p_sir->switch_info.life_state,
2123 			cl_ntoh16(p_sir->switch_info.lids_per_port),
2124 			cl_ntoh16(p_sir->switch_info.enforce_cap),
2125 			p_sir->switch_info.flags);
2126 	}
2127 }
2128 
osm_dump_switch_info_record(IN osm_log_t * p_log,IN const ib_switch_info_record_t * p_sir,IN osm_log_level_t log_level)2129 void osm_dump_switch_info_record(IN osm_log_t * p_log,
2130 				 IN const ib_switch_info_record_t * p_sir,
2131 				 IN osm_log_level_t log_level)
2132 {
2133 	if (osm_log_is_active(p_log, log_level)) {
2134 		char buf[BUF_SIZE];
2135 
2136 		osm_dump_switch_info_record_to_buf(p_sir, buf);
2137 
2138 		osm_log(p_log, log_level, "%s", buf);
2139 	}
2140 }
2141 
osm_dump_switch_info_record_v2(IN osm_log_t * p_log,IN const ib_switch_info_record_t * p_sir,IN const int file_id,IN osm_log_level_t log_level)2142 void osm_dump_switch_info_record_v2(IN osm_log_t * p_log,
2143 				    IN const ib_switch_info_record_t * p_sir,
2144 				    IN const int file_id,
2145 				    IN osm_log_level_t log_level)
2146 {
2147 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2148 		char buf[BUF_SIZE];
2149 
2150 		osm_dump_switch_info_record_to_buf(p_sir, buf);
2151 
2152 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
2153 	}
2154 }
2155 
osm_dump_pkey_block_to_buf(IN uint64_t port_guid,IN uint16_t block_num,IN uint8_t port_num,IN const ib_pkey_table_t * p_pkey_tbl,OUT char * buf)2156 static void osm_dump_pkey_block_to_buf(IN uint64_t port_guid,
2157 				       IN uint16_t block_num,
2158 				       IN uint8_t port_num,
2159 				       IN const ib_pkey_table_t * p_pkey_tbl,
2160 				       OUT char * buf)
2161 {
2162 	if (!buf || !p_pkey_tbl)
2163 		return;
2164 	else {
2165 		char buf_line[1024];
2166 		int i, n;
2167 
2168 		for (i = 0, n = 0; i < 32; i++)
2169 			n += sprintf(buf_line + n, " 0x%04x |",
2170 				     cl_ntoh16(p_pkey_tbl->pkey_entry[i]));
2171 
2172 		sprintf(buf,
2173 			"P_Key table dump:\n"
2174 			"\t\t\tport_guid...........0x%016" PRIx64 "\n"
2175 			"\t\t\tblock_num...........0x%X\n"
2176 			"\t\t\tport_num............%u\n\tP_Key Table: %s\n",
2177 			cl_ntoh64(port_guid), block_num, port_num, buf_line);
2178 	}
2179 }
2180 
osm_dump_pkey_block(IN osm_log_t * p_log,IN uint64_t port_guid,IN uint16_t block_num,IN uint8_t port_num,IN const ib_pkey_table_t * p_pkey_tbl,IN osm_log_level_t log_level)2181 void osm_dump_pkey_block(IN osm_log_t * p_log, IN uint64_t port_guid,
2182 			 IN uint16_t block_num, IN uint8_t port_num,
2183 			 IN const ib_pkey_table_t * p_pkey_tbl,
2184 			 IN osm_log_level_t log_level)
2185 {
2186 	if (osm_log_is_active(p_log, log_level)) {
2187 		char buf[BUF_SIZE];
2188 
2189 		osm_dump_pkey_block_to_buf(port_guid, block_num, port_num,
2190 					   p_pkey_tbl, buf);
2191 
2192 		osm_log(p_log, log_level, "%s", buf);
2193 	}
2194 }
2195 
osm_dump_pkey_block_v2(IN osm_log_t * p_log,IN uint64_t port_guid,IN uint16_t block_num,IN uint8_t port_num,IN const ib_pkey_table_t * p_pkey_tbl,IN const int file_id,IN osm_log_level_t log_level)2196 void osm_dump_pkey_block_v2(IN osm_log_t * p_log, IN uint64_t port_guid,
2197 			    IN uint16_t block_num, IN uint8_t port_num,
2198 			    IN const ib_pkey_table_t * p_pkey_tbl,
2199 			    IN const int file_id,
2200 			    IN osm_log_level_t log_level)
2201 {
2202 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2203 		char buf[BUF_SIZE];
2204 
2205 		osm_dump_pkey_block_to_buf(port_guid, block_num,
2206 					   port_num, p_pkey_tbl, buf);
2207 
2208 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
2209 	}
2210 }
2211 
osm_dump_slvl_map_table_to_buf(IN uint64_t port_guid,IN uint8_t in_port_num,IN uint8_t out_port_num,IN const ib_slvl_table_t * p_slvl_tbl,OUT char * buf)2212 static void osm_dump_slvl_map_table_to_buf(IN uint64_t port_guid,
2213 					   IN uint8_t in_port_num,
2214 					   IN uint8_t out_port_num,
2215 					   IN const ib_slvl_table_t * p_slvl_tbl,
2216 					   OUT char * buf)
2217 {
2218 	if (!buf || !p_slvl_tbl)
2219 		return;
2220 	else {
2221 		char buf_line1[1024], buf_line2[1024];
2222 		int n;
2223 		uint8_t i;
2224 
2225 		for (i = 0, n = 0; i < 16; i++)
2226 			n += sprintf(buf_line1 + n, " %-2u |", i);
2227 		for (i = 0, n = 0; i < 16; i++)
2228 			n += sprintf(buf_line2 + n, "0x%01X |",
2229 				     ib_slvl_table_get(p_slvl_tbl, i));
2230 		sprintf(buf,
2231 			"SLtoVL dump:\n"
2232 			"\t\t\tport_guid............0x%016" PRIx64 "\n"
2233 			"\t\t\tin_port_num..........%u\n"
2234 			"\t\t\tout_port_num.........%u\n\tSL: | %s\n\tVL: | %s\n",
2235 			cl_ntoh64(port_guid), in_port_num, out_port_num,
2236 			buf_line1, buf_line2);
2237 	}
2238 }
2239 
osm_dump_slvl_map_table(IN osm_log_t * p_log,IN uint64_t port_guid,IN uint8_t in_port_num,IN uint8_t out_port_num,IN const ib_slvl_table_t * p_slvl_tbl,IN osm_log_level_t log_level)2240 void osm_dump_slvl_map_table(IN osm_log_t * p_log, IN uint64_t port_guid,
2241 			     IN uint8_t in_port_num, IN uint8_t out_port_num,
2242 			     IN const ib_slvl_table_t * p_slvl_tbl,
2243 			     IN osm_log_level_t log_level)
2244 {
2245 	if (osm_log_is_active(p_log, log_level)) {
2246 		char buf[BUF_SIZE];
2247 
2248 		osm_dump_slvl_map_table_to_buf(port_guid, in_port_num,
2249 					       out_port_num, p_slvl_tbl, buf);
2250 
2251 		osm_log(p_log, log_level, "%s", buf);
2252 	}
2253 }
2254 
osm_dump_slvl_map_table_v2(IN osm_log_t * p_log,IN uint64_t port_guid,IN uint8_t in_port_num,IN uint8_t out_port_num,IN const ib_slvl_table_t * p_slvl_tbl,IN const int file_id,IN osm_log_level_t log_level)2255 void osm_dump_slvl_map_table_v2(IN osm_log_t * p_log, IN uint64_t port_guid,
2256 				IN uint8_t in_port_num, IN uint8_t out_port_num,
2257 				IN const ib_slvl_table_t * p_slvl_tbl,
2258 				IN const int file_id,
2259 				IN osm_log_level_t log_level)
2260 {
2261 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2262 		char buf[BUF_SIZE];
2263 
2264 		osm_dump_slvl_map_table_to_buf(port_guid, in_port_num,
2265 					       out_port_num, p_slvl_tbl, buf);
2266 
2267 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
2268 	}
2269 }
2270 
osm_dump_vl_arb_table_to_buf(IN uint64_t port_guid,IN uint8_t block_num,IN uint8_t port_num,IN const ib_vl_arb_table_t * p_vla_tbl,OUT char * buf)2271 static void osm_dump_vl_arb_table_to_buf(IN uint64_t port_guid,
2272 					 IN uint8_t block_num,
2273 					 IN uint8_t port_num,
2274 					 IN const ib_vl_arb_table_t * p_vla_tbl,
2275 					 OUT char * buf)
2276 {
2277 	if (!buf || !p_vla_tbl)
2278 		return;
2279 	else {
2280 		char buf_line1[1024], buf_line2[1024];
2281 		int i, n;
2282 
2283 		for (i = 0, n = 0; i < 32; i++)
2284 			n += sprintf(buf_line1 + n, " 0x%01X |",
2285 				     p_vla_tbl->vl_entry[i].vl);
2286 		for (i = 0, n = 0; i < 32; i++)
2287 			n += sprintf(buf_line2 + n, " 0x%01X |",
2288 				     p_vla_tbl->vl_entry[i].weight);
2289 		sprintf(buf,
2290 			"VLArb dump:\n" "\t\t\tport_guid...........0x%016"
2291 			PRIx64 "\n" "\t\t\tblock_num...........0x%X\n"
2292 			"\t\t\tport_num............%u\n\tVL    : | %s\n\tWEIGHT:| %s\n",
2293 			cl_ntoh64(port_guid), block_num, port_num, buf_line1,
2294 			buf_line2);
2295 	}
2296 }
2297 
osm_dump_vl_arb_table(IN osm_log_t * p_log,IN uint64_t port_guid,IN uint8_t block_num,IN uint8_t port_num,IN const ib_vl_arb_table_t * p_vla_tbl,IN osm_log_level_t log_level)2298 void osm_dump_vl_arb_table(IN osm_log_t * p_log, IN uint64_t port_guid,
2299 			   IN uint8_t block_num, IN uint8_t port_num,
2300 			   IN const ib_vl_arb_table_t * p_vla_tbl,
2301 			   IN osm_log_level_t log_level)
2302 {
2303 	if (osm_log_is_active(p_log, log_level)) {
2304 		char buf[BUF_SIZE];
2305 
2306 		osm_dump_vl_arb_table_to_buf(port_guid, block_num,
2307 					     port_num, p_vla_tbl, buf);
2308 
2309 		osm_log(p_log, log_level, "%s", buf);
2310 	}
2311 }
2312 
osm_dump_vl_arb_table_v2(IN osm_log_t * p_log,IN uint64_t port_guid,IN uint8_t block_num,IN uint8_t port_num,IN const ib_vl_arb_table_t * p_vla_tbl,IN const int file_id,IN osm_log_level_t log_level)2313 void osm_dump_vl_arb_table_v2(IN osm_log_t * p_log, IN uint64_t port_guid,
2314 			      IN uint8_t block_num, IN uint8_t port_num,
2315 			      IN const ib_vl_arb_table_t * p_vla_tbl,
2316 			      IN const int file_id,
2317 			      IN osm_log_level_t log_level)
2318 {
2319 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2320 		char buf[BUF_SIZE];
2321 
2322 		osm_dump_vl_arb_table_to_buf(port_guid, block_num,
2323 					     port_num, p_vla_tbl, buf);
2324 
2325 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
2326 	}
2327 }
2328 
osm_dump_sm_info_to_buf(IN const ib_sm_info_t * p_smi,OUT char * buf)2329 static void osm_dump_sm_info_to_buf(IN const ib_sm_info_t * p_smi,
2330 				    OUT char * buf)
2331 {
2332 	if (!buf || !p_smi)
2333 		return;
2334 	else {
2335 		sprintf(buf,
2336 			"SMInfo dump:\n"
2337 			"\t\t\t\tguid....................0x%016" PRIx64 "\n"
2338 			"\t\t\t\tsm_key..................0x%016" PRIx64 "\n"
2339 			"\t\t\t\tact_count...............%u\n"
2340 			"\t\t\t\tpriority................%u\n"
2341 			"\t\t\t\tsm_state................%u\n",
2342 			cl_ntoh64(p_smi->guid), cl_ntoh64(p_smi->sm_key),
2343 			cl_ntoh32(p_smi->act_count),
2344 			ib_sminfo_get_priority(p_smi),
2345 			ib_sminfo_get_state(p_smi));
2346 	}
2347 }
2348 
osm_dump_sm_info(IN osm_log_t * p_log,IN const ib_sm_info_t * p_smi,IN osm_log_level_t log_level)2349 void osm_dump_sm_info(IN osm_log_t * p_log, IN const ib_sm_info_t * p_smi,
2350 		      IN osm_log_level_t log_level)
2351 {
2352 	if (osm_log_is_active(p_log, log_level)) {
2353 		char buf[BUF_SIZE];
2354 
2355 		osm_dump_sm_info_to_buf(p_smi, buf);
2356 
2357 		osm_log(p_log, OSM_LOG_DEBUG, "%s", buf);
2358 	}
2359 }
2360 
osm_dump_sm_info_v2(IN osm_log_t * p_log,IN const ib_sm_info_t * p_smi,IN const int file_id,IN osm_log_level_t log_level)2361 void osm_dump_sm_info_v2(IN osm_log_t * p_log, IN const ib_sm_info_t * p_smi,
2362 			 IN const int file_id, IN osm_log_level_t log_level)
2363 {
2364 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2365 		char buf[BUF_SIZE];
2366 
2367 		osm_dump_sm_info_to_buf(p_smi, buf);
2368 
2369 		osm_log_v2(p_log, OSM_LOG_DEBUG, file_id, "%s", buf);
2370 	}
2371 }
2372 
osm_dump_sm_info_record_to_buf(IN const ib_sminfo_record_t * p_smir,OUT char * buf)2373 static void osm_dump_sm_info_record_to_buf(IN const ib_sminfo_record_t * p_smir,
2374 					   OUT char * buf)
2375 {
2376 	if (!buf || !p_smir)
2377 		return;
2378 	else {
2379 		sprintf(buf,
2380 			"SMInfo Record dump:\n"
2381 			"\t\t\t\tRID\n"
2382 			"\t\t\t\tLid.....................%u\n"
2383 			"\t\t\t\tReserved................0x%X\n"
2384 			"\t\t\t\tSMInfo dump:\n"
2385 			"\t\t\t\tguid....................0x%016" PRIx64 "\n"
2386 			"\t\t\t\tsm_key..................0x%016" PRIx64 "\n"
2387 			"\t\t\t\tact_count...............%u\n"
2388 			"\t\t\t\tpriority................%u\n"
2389 			"\t\t\t\tsm_state................%u\n",
2390 			cl_ntoh16(p_smir->lid), cl_ntoh16(p_smir->resv0),
2391 			cl_ntoh64(p_smir->sm_info.guid),
2392 			cl_ntoh64(p_smir->sm_info.sm_key),
2393 			cl_ntoh32(p_smir->sm_info.act_count),
2394 			ib_sminfo_get_priority(&p_smir->sm_info),
2395 			ib_sminfo_get_state(&p_smir->sm_info));
2396 	}
2397 }
2398 
osm_dump_sm_info_record(IN osm_log_t * p_log,IN const ib_sminfo_record_t * p_smir,IN osm_log_level_t log_level)2399 void osm_dump_sm_info_record(IN osm_log_t * p_log,
2400 			     IN const ib_sminfo_record_t * p_smir,
2401 			     IN osm_log_level_t log_level)
2402 {
2403 	if (osm_log_is_active(p_log, log_level)) {
2404 		char buf[BUF_SIZE];
2405 
2406 		osm_dump_sm_info_record_to_buf(p_smir, buf);
2407 
2408 		osm_log(p_log, OSM_LOG_DEBUG, "%s", buf);
2409 	}
2410 }
2411 
osm_dump_sm_info_record_v2(IN osm_log_t * p_log,IN const ib_sminfo_record_t * p_smir,IN const int file_id,IN osm_log_level_t log_level)2412 void osm_dump_sm_info_record_v2(IN osm_log_t * p_log,
2413 				IN const ib_sminfo_record_t * p_smir,
2414 				IN const int file_id,
2415 				IN osm_log_level_t log_level)
2416 {
2417 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2418 		char buf[BUF_SIZE];
2419 
2420 		osm_dump_sm_info_record_to_buf(p_smir, buf);
2421 
2422 		osm_log_v2(p_log, OSM_LOG_DEBUG, file_id, "%s", buf);
2423 	}
2424 }
2425 
osm_dump_notice_to_buf_generic(IN const ib_mad_notice_attr_t * p_ntci,OUT char * log_buf)2426 static void osm_dump_notice_to_buf_generic(IN const ib_mad_notice_attr_t * p_ntci,
2427 					   OUT char * log_buf)
2428 {
2429 	if (!log_buf || !p_ntci)
2430 		return;
2431 	else {
2432 		char gid_str[INET6_ADDRSTRLEN];
2433 		char gid_str2[INET6_ADDRSTRLEN];
2434 		char buff[1024];
2435 		int n;
2436 
2437 		buff[0] = '\0';
2438 
2439 		/* immediate data based on the trap */
2440 		switch (cl_ntoh16(p_ntci->g_or_v.generic.trap_num)) {
2441 		case SM_GID_IN_SERVICE_TRAP:	/* 64 */
2442 		case SM_GID_OUT_OF_SERVICE_TRAP: /* 65 */
2443 		case SM_MGID_CREATED_TRAP:	/* 66 */
2444 		case SM_MGID_DESTROYED_TRAP:	/* 67 */
2445 			sprintf(buff,
2446 				"\t\t\t\tsrc_gid..................%s\n",
2447 				inet_ntop(AF_INET6, p_ntci->data_details.
2448 					  ntc_64_67.gid.raw, gid_str,
2449 					  sizeof gid_str));
2450 			break;
2451 		case SM_LINK_STATE_CHANGED_TRAP: /* 128 */
2452 			sprintf(buff,
2453 				"\t\t\t\tsw_lid...................%u\n",
2454 				cl_ntoh16(p_ntci->data_details.ntc_128.sw_lid));
2455 			break;
2456 		case SM_LINK_INTEGRITY_THRESHOLD_TRAP: /* 129 */
2457 		case SM_BUFFER_OVERRUN_THRESHOLD_TRAP: /* 130 */
2458 		case SM_WATCHDOG_TIMER_EXPIRED_TRAP:   /* 131 */
2459 			sprintf(buff,
2460 				"\t\t\t\tlid......................%u\n"
2461 				"\t\t\t\tport_num.................%u\n",
2462 				cl_ntoh16(p_ntci->data_details.
2463 					  ntc_129_131.lid),
2464 				p_ntci->data_details.ntc_129_131.port_num);
2465 			break;
2466 		case SM_LOCAL_CHANGES_TRAP:	/* 144 */
2467 			sprintf(buff,
2468 				"\t\t\t\tlid......................%u\n"
2469 				"\t\t\t\tlocal_changes............%u\n"
2470 				"\t\t\t\tnew_cap_mask.............0x%08x\n"
2471 				"\t\t\t\tchange_flags.............0x%x\n"
2472 				"\t\t\t\tcap_mask2................0x%x\n",
2473 				cl_ntoh16(p_ntci->data_details.ntc_144.lid),
2474 				p_ntci->data_details.ntc_144.local_changes,
2475 				cl_ntoh32(p_ntci->data_details.ntc_144.
2476 					  new_cap_mask),
2477 				cl_ntoh16(p_ntci->data_details.ntc_144.
2478 					  change_flgs),
2479 				cl_ntoh16(p_ntci->data_details.ntc_144.
2480 					  cap_mask2));
2481 			break;
2482 		case SM_SYS_IMG_GUID_CHANGED_TRAP: /* 145 */
2483 			sprintf(buff,
2484 				"\t\t\t\tlid......................%u\n"
2485 				"\t\t\t\tnew_sys_guid.............0x%016"
2486 				PRIx64 "\n",
2487 				cl_ntoh16(p_ntci->data_details.ntc_145.
2488 					  lid),
2489 				cl_ntoh64(p_ntci->data_details.ntc_145.
2490 					  new_sys_guid));
2491 			break;
2492 		case SM_BAD_MKEY_TRAP:	/* 256 */
2493 			n = sprintf(buff,
2494 				    "\t\t\t\tlid......................%u\n"
2495 				    "\t\t\t\tdrslid...................%u\n"
2496 				    "\t\t\t\tmethod...................0x%x\n"
2497 				    "\t\t\t\tattr_id..................0x%x\n"
2498 				    "\t\t\t\tattr_mod.................0x%x\n"
2499 				    "\t\t\t\tm_key....................0x%016"
2500 				    PRIx64 "\n"
2501 				    "\t\t\t\tdr_notice................%d\n"
2502 				    "\t\t\t\tdr_path_truncated........%d\n"
2503 				    "\t\t\t\tdr_hop_count.............%u\n",
2504 				    cl_ntoh16(p_ntci->data_details.ntc_256.lid),
2505 				    cl_ntoh16(p_ntci->data_details.ntc_256.
2506 					      dr_slid),
2507 				    p_ntci->data_details.ntc_256.method,
2508 				    cl_ntoh16(p_ntci->data_details.ntc_256.
2509 					      attr_id),
2510 				    cl_ntoh32(p_ntci->data_details.ntc_256.
2511 					      attr_mod),
2512 				    cl_ntoh64(p_ntci->data_details.ntc_256.
2513 					      mkey),
2514 				    p_ntci->data_details.ntc_256.
2515 				    dr_trunc_hop >> 7,
2516 				    p_ntci->data_details.ntc_256.
2517 				    dr_trunc_hop >> 6,
2518 				    p_ntci->data_details.ntc_256.
2519 				    dr_trunc_hop & 0x3f);
2520 			n += snprintf(buff + n, sizeof(buff) - n,
2521 				      "Directed Path Dump of %u hop path:"
2522 				      "\n\t\t\t\tPath = ",
2523 				      p_ntci->data_details.ntc_256.
2524 				      dr_trunc_hop & 0x3f);
2525 			n += sprint_uint8_arr(buff + n, sizeof(buff) - n,
2526 					      p_ntci->data_details.ntc_256.
2527 					      dr_rtn_path,
2528 					      (p_ntci->data_details.ntc_256.
2529 					       dr_trunc_hop & 0x3f) + 1);
2530 			if (n >= sizeof(buff)) {
2531 				n = sizeof(buff) - 2;
2532 				break;
2533 			}
2534 			snprintf(buff + n, sizeof(buff) - n, "\n");
2535 			break;
2536 		case SM_BAD_PKEY_TRAP:	/* 257 */
2537 		case SM_BAD_QKEY_TRAP:	/* 258 */
2538 			sprintf(buff,
2539 				"\t\t\t\tlid1.....................%u\n"
2540 				"\t\t\t\tlid2.....................%u\n"
2541 				"\t\t\t\tkey......................0x%x\n"
2542 				"\t\t\t\tsl.......................%d\n"
2543 				"\t\t\t\tqp1......................0x%x\n"
2544 				"\t\t\t\tqp2......................0x%x\n"
2545 				"\t\t\t\tgid1.....................%s\n"
2546 				"\t\t\t\tgid2.....................%s\n",
2547 				cl_ntoh16(p_ntci->data_details.ntc_257_258.
2548 					  lid1),
2549 				cl_ntoh16(p_ntci->data_details.ntc_257_258.
2550 					  lid2),
2551 				cl_ntoh32(p_ntci->data_details.ntc_257_258.key),
2552 				cl_ntoh32(p_ntci->data_details.ntc_257_258.
2553 					  qp1) >> 28,
2554 				cl_ntoh32(p_ntci->data_details.ntc_257_258.
2555 					  qp1) & 0xffffff,
2556 				cl_ntoh32(p_ntci->data_details.ntc_257_258.
2557 					  qp2) & 0xffffff,
2558 				inet_ntop(AF_INET6, p_ntci->data_details.
2559 					  ntc_257_258.gid1.raw, gid_str,
2560 					  sizeof gid_str),
2561 				inet_ntop(AF_INET6, p_ntci->data_details.
2562 					  ntc_257_258.gid2.raw, gid_str2,
2563 					  sizeof gid_str2));
2564 			break;
2565 		case SM_BAD_SWITCH_PKEY_TRAP:	/* 259 */
2566 			sprintf(buff,
2567 				"\t\t\t\tdata_valid...............0x%x\n"
2568 				"\t\t\t\tlid1.....................%u\n"
2569 				"\t\t\t\tlid2.....................%u\n"
2570 				"\t\t\t\tpkey.....................0x%x\n"
2571 				"\t\t\t\tsl.......................%d\n"
2572 				"\t\t\t\tqp1......................0x%x\n"
2573 				"\t\t\t\tqp2......................0x%x\n"
2574 				"\t\t\t\tgid1.....................%s\n"
2575 				"\t\t\t\tgid2.....................%s\n"
2576 				"\t\t\t\tsw_lid...................%u\n"
2577 				"\t\t\t\tport_no..................%u\n",
2578 				cl_ntoh16(p_ntci->data_details.ntc_259.
2579 					  data_valid),
2580 				cl_ntoh16(p_ntci->data_details.ntc_259.lid1),
2581 				cl_ntoh16(p_ntci->data_details.ntc_259.lid2),
2582 				cl_ntoh16(p_ntci->data_details.ntc_259.pkey),
2583 				cl_ntoh32(p_ntci->data_details.ntc_259.
2584 					  sl_qp1) >> 24,
2585 				cl_ntoh32(p_ntci->data_details.ntc_259.
2586 					  sl_qp1) & 0xffffff,
2587 				cl_ntoh32(p_ntci->data_details.ntc_259.qp2),
2588 				inet_ntop(AF_INET6, p_ntci->data_details.
2589 					  ntc_259.gid1.raw, gid_str,
2590 					  sizeof gid_str),
2591 				inet_ntop(AF_INET6, p_ntci->data_details.
2592 					  ntc_259.gid2.raw, gid_str2,
2593 					  sizeof gid_str2),
2594 				cl_ntoh16(p_ntci->data_details.ntc_259.sw_lid),
2595 				p_ntci->data_details.ntc_259.port_no);
2596 			break;
2597 		}
2598 
2599 		sprintf(log_buf,
2600 			"Generic Notice dump:\n"
2601 			"\t\t\t\ttype.....................%u\n"
2602 			"\t\t\t\tprod_type................%u (%s)\n"
2603 			"\t\t\t\ttrap_num.................%u\n%s",
2604 			ib_notice_get_type(p_ntci),
2605 			cl_ntoh32(ib_notice_get_prod_type(p_ntci)),
2606 			ib_get_producer_type_str(ib_notice_get_prod_type
2607 						 (p_ntci)),
2608 			cl_ntoh16(p_ntci->g_or_v.generic.trap_num), buff);
2609 	}
2610 }
2611 
osm_dump_notice_to_buf(IN const ib_mad_notice_attr_t * p_ntci,OUT char * buf)2612 static void osm_dump_notice_to_buf(IN const ib_mad_notice_attr_t * p_ntci,
2613 				   OUT char * buf)
2614 {
2615 	if (!buf || !p_ntci)
2616 		return;
2617 	else {
2618 		sprintf(buf,
2619 			"Vendor Notice dump:\n"
2620 			"\t\t\t\ttype.....................%u\n"
2621 			"\t\t\t\tvendor...................%u\n"
2622 			"\t\t\t\tdevice_id................%u\n",
2623 			cl_ntoh16(ib_notice_get_type(p_ntci)),
2624 			cl_ntoh32(ib_notice_get_vend_id(p_ntci)),
2625 			cl_ntoh16(p_ntci->g_or_v.vend.dev_id));
2626 	}
2627 }
2628 
osm_dump_notice(IN osm_log_t * p_log,IN const ib_mad_notice_attr_t * p_ntci,IN osm_log_level_t log_level)2629 void osm_dump_notice(IN osm_log_t * p_log,
2630 		     IN const ib_mad_notice_attr_t * p_ntci,
2631 		     IN osm_log_level_t log_level)
2632 {
2633 	if (osm_log_is_active(p_log, log_level)) {
2634 		char buf[BUF_SIZE];
2635 
2636 		if (ib_notice_is_generic(p_ntci))
2637 			osm_dump_notice_to_buf_generic(p_ntci, buf);
2638 		else
2639 			osm_dump_notice_to_buf(p_ntci, buf);
2640 
2641 		osm_log(p_log, log_level, "%s", buf);
2642 	}
2643 }
2644 
osm_dump_notice_v2(IN osm_log_t * p_log,IN const ib_mad_notice_attr_t * p_ntci,IN const int file_id,IN osm_log_level_t log_level)2645 void osm_dump_notice_v2(IN osm_log_t * p_log,
2646 			IN const ib_mad_notice_attr_t * p_ntci,
2647 			IN const int file_id, IN osm_log_level_t log_level)
2648 {
2649 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2650 		char buf[BUF_SIZE];
2651 
2652 		if (ib_notice_is_generic(p_ntci))
2653 			osm_dump_notice_to_buf_generic(p_ntci, buf);
2654 		else
2655 			osm_dump_notice_to_buf(p_ntci, buf);
2656 
2657 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
2658 	}
2659 }
2660 
osm_dump_dr_smp_to_buf(IN const ib_smp_t * p_smp,OUT char * buf,IN size_t buf_size)2661 static void osm_dump_dr_smp_to_buf(IN const ib_smp_t * p_smp, OUT char * buf,
2662 				   IN size_t buf_size)
2663 {
2664 	if (!buf || !p_smp)
2665 		return;
2666 	else {
2667 		unsigned n;
2668 
2669 		n = sprintf(buf,
2670 			    "SMP dump:\n"
2671 			    "\t\t\t\tbase_ver................0x%X\n"
2672 			    "\t\t\t\tmgmt_class..............0x%X\n"
2673 			    "\t\t\t\tclass_ver...............0x%X\n"
2674 			    "\t\t\t\tmethod..................0x%X (%s)\n",
2675 			    p_smp->base_ver, p_smp->mgmt_class,
2676 			    p_smp->class_ver, p_smp->method,
2677 			    ib_get_sm_method_str(p_smp->method));
2678 
2679 		if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR) {
2680 			n += snprintf(buf + n, buf_size - n,
2681 				      "\t\t\t\tD bit...................0x%X\n"
2682 				      "\t\t\t\tstatus..................0x%X\n",
2683 				      ib_smp_is_d(p_smp),
2684 				      cl_ntoh16(ib_smp_get_status(p_smp)));
2685 		} else {
2686 			n += snprintf(buf + n, buf_size - n,
2687 				      "\t\t\t\tstatus..................0x%X\n",
2688 				      cl_ntoh16(p_smp->status));
2689 		}
2690 
2691 		n += snprintf(buf + n, buf_size - n,
2692 			      "\t\t\t\thop_ptr.................0x%X\n"
2693 			      "\t\t\t\thop_count...............0x%X\n"
2694 			      "\t\t\t\ttrans_id................0x%" PRIx64 "\n"
2695 			      "\t\t\t\tattr_id.................0x%X (%s)\n"
2696 			      "\t\t\t\tresv....................0x%X\n"
2697 			      "\t\t\t\tattr_mod................0x%X\n"
2698 			      "\t\t\t\tm_key...................0x%016" PRIx64
2699 			      "\n", p_smp->hop_ptr, p_smp->hop_count,
2700 			      cl_ntoh64(p_smp->trans_id),
2701 			      cl_ntoh16(p_smp->attr_id),
2702 			      ib_get_sm_attr_str(p_smp->attr_id),
2703 			      cl_ntoh16(p_smp->resv),
2704 			      cl_ntoh32(p_smp->attr_mod),
2705 			      cl_ntoh64(p_smp->m_key));
2706 
2707 		if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR) {
2708 			uint32_t i;
2709 			n += snprintf(buf + n, buf_size - n,
2710 				      "\t\t\t\tdr_slid.................%u\n"
2711 				      "\t\t\t\tdr_dlid.................%u\n",
2712 				      cl_ntoh16(p_smp->dr_slid),
2713 				      cl_ntoh16(p_smp->dr_dlid));
2714 
2715 			n += snprintf(buf + n, buf_size - n,
2716 				      "\n\t\t\t\tInitial path: ");
2717 			n += sprint_uint8_arr(buf + n, buf_size - n,
2718 					      p_smp->initial_path,
2719 					      p_smp->hop_count + 1);
2720 
2721 			n += snprintf(buf + n, buf_size - n,
2722 				      "\n\t\t\t\tReturn path:  ");
2723 			n += sprint_uint8_arr(buf + n, buf_size - n,
2724 					      p_smp->return_path,
2725 					      p_smp->hop_count + 1);
2726 
2727 			n += snprintf(buf + n, buf_size - n,
2728 				      "\n\t\t\t\tReserved:     ");
2729 			for (i = 0; i < 7; i++) {
2730 				n += snprintf(buf + n, buf_size - n,
2731 					      "[%0X]", p_smp->resv1[i]);
2732 			}
2733 			n += snprintf(buf + n, buf_size - n, "\n");
2734 
2735 			for (i = 0; i < 64; i += 16) {
2736 				n += snprintf(buf + n, buf_size - n,
2737 					      "\n\t\t\t\t%02X %02X %02X %02X "
2738 					      "%02X %02X %02X %02X"
2739 					      "   %02X %02X %02X %02X %02X %02X %02X %02X\n",
2740 					      p_smp->data[i],
2741 					      p_smp->data[i + 1],
2742 					      p_smp->data[i + 2],
2743 					      p_smp->data[i + 3],
2744 					      p_smp->data[i + 4],
2745 					      p_smp->data[i + 5],
2746 					      p_smp->data[i + 6],
2747 					      p_smp->data[i + 7],
2748 					      p_smp->data[i + 8],
2749 					      p_smp->data[i + 9],
2750 					      p_smp->data[i + 10],
2751 					      p_smp->data[i + 11],
2752 					      p_smp->data[i + 12],
2753 					      p_smp->data[i + 13],
2754 					      p_smp->data[i + 14],
2755 					      p_smp->data[i + 15]);
2756 			}
2757 		} else {
2758 			/* not a Direct Route so provide source and destination lids */
2759 			n += snprintf(buf + n, buf_size - n,
2760 				      "\t\t\t\tMAD IS LID ROUTED\n");
2761 		}
2762 	}
2763 }
2764 
osm_dump_dr_smp(IN osm_log_t * p_log,IN const ib_smp_t * p_smp,IN osm_log_level_t log_level)2765 void osm_dump_dr_smp(IN osm_log_t * p_log, IN const ib_smp_t * p_smp,
2766 		     IN osm_log_level_t log_level)
2767 {
2768 	if (osm_log_is_active(p_log, log_level)) {
2769 		char buf[BUF_SIZE];
2770 
2771 		osm_dump_dr_smp_to_buf(p_smp, buf, BUF_SIZE);
2772 
2773 		osm_log(p_log, log_level, "%s", buf);
2774 	}
2775 }
2776 
osm_dump_dr_smp_v2(IN osm_log_t * p_log,IN const ib_smp_t * p_smp,IN const int file_id,IN osm_log_level_t log_level)2777 void osm_dump_dr_smp_v2(IN osm_log_t * p_log, IN const ib_smp_t * p_smp,
2778 			IN const int file_id, IN osm_log_level_t log_level)
2779 {
2780 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2781 		char buf[BUF_SIZE];
2782 
2783 		osm_dump_dr_smp_to_buf(p_smp, buf, BUF_SIZE);
2784 
2785 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
2786 	}
2787 }
2788 
osm_dump_sa_mad_to_buf(IN const ib_sa_mad_t * p_mad,OUT char * buf)2789 static void osm_dump_sa_mad_to_buf(IN const ib_sa_mad_t * p_mad, OUT char * buf)
2790 {
2791 	if (!buf || !p_mad)
2792 		return;
2793 	else {
2794 		/* make sure the mad is valid */
2795 		if (p_mad == NULL) {
2796 			sprintf(buf, "NULL MAD POINTER\n");
2797 			return;
2798 		}
2799 
2800 		sprintf(buf,
2801 			"SA MAD dump:\n"
2802 			"\t\t\t\tbase_ver................0x%X\n"
2803 			"\t\t\t\tmgmt_class..............0x%X\n"
2804 			"\t\t\t\tclass_ver...............0x%X\n"
2805 			"\t\t\t\tmethod..................0x%X (%s)\n"
2806 			"\t\t\t\tstatus..................0x%X\n"
2807 			"\t\t\t\tresv....................0x%X\n"
2808 			"\t\t\t\ttrans_id................0x%" PRIx64 "\n"
2809 			"\t\t\t\tattr_id.................0x%X (%s)\n"
2810 			"\t\t\t\tresv1...................0x%X\n"
2811 			"\t\t\t\tattr_mod................0x%X\n"
2812 			"\t\t\t\trmpp_version............0x%X\n"
2813 			"\t\t\t\trmpp_type...............0x%X\n"
2814 			"\t\t\t\trmpp_flags..............0x%X\n"
2815 			"\t\t\t\trmpp_status.............0x%X\n"
2816 			"\t\t\t\tseg_num.................0x%X\n"
2817 			"\t\t\t\tpayload_len/new_win.....0x%X\n"
2818 			"\t\t\t\tsm_key..................0x%016" PRIx64 "\n"
2819 			"\t\t\t\tattr_offset.............0x%X\n"
2820 			"\t\t\t\tresv2...................0x%X\n"
2821 			"\t\t\t\tcomp_mask...............0x%016" PRIx64 "\n",
2822 			p_mad->base_ver, p_mad->mgmt_class, p_mad->class_ver,
2823 			p_mad->method, ib_get_sa_method_str(p_mad->method),
2824 			cl_ntoh16(p_mad->status), cl_ntoh16(p_mad->resv),
2825 			cl_ntoh64(p_mad->trans_id), cl_ntoh16(p_mad->attr_id),
2826 			ib_get_sa_attr_str(p_mad->attr_id),
2827 			cl_ntoh16(p_mad->resv1), cl_ntoh32(p_mad->attr_mod),
2828 			p_mad->rmpp_version, p_mad->rmpp_type,
2829 			p_mad->rmpp_flags, p_mad->rmpp_status,
2830 			cl_ntoh32(p_mad->seg_num),
2831 			cl_ntoh32(p_mad->paylen_newwin),
2832 			cl_ntoh64(p_mad->sm_key), cl_ntoh16(p_mad->attr_offset),
2833 			cl_ntoh16(p_mad->resv3), cl_ntoh64(p_mad->comp_mask));
2834 
2835 		strcat(buf, "\n");
2836 	}
2837 }
2838 
osm_dump_sa_mad(IN osm_log_t * p_log,IN const ib_sa_mad_t * p_mad,IN osm_log_level_t log_level)2839 void osm_dump_sa_mad(IN osm_log_t * p_log, IN const ib_sa_mad_t * p_mad,
2840 		     IN osm_log_level_t log_level)
2841 {
2842 	if (osm_log_is_active(p_log, log_level)) {
2843 		char buf[BUF_SIZE];
2844 
2845 		osm_dump_sa_mad_to_buf(p_mad, buf);
2846 
2847 		osm_log(p_log, log_level, "%s\n", buf);
2848 	}
2849 }
2850 
osm_dump_sa_mad_v2(IN osm_log_t * p_log,IN const ib_sa_mad_t * p_mad,IN const int file_id,IN osm_log_level_t log_level)2851 void osm_dump_sa_mad_v2(IN osm_log_t * p_log, IN const ib_sa_mad_t * p_mad,
2852 			IN const int file_id, IN osm_log_level_t log_level)
2853 {
2854 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2855 		char buf[BUF_SIZE];
2856 
2857 		osm_dump_sa_mad_to_buf(p_mad, buf);
2858 
2859 		osm_log_v2(p_log, log_level, file_id, "%s", buf);
2860 	}
2861 }
2862 
osm_dump_dr_path_to_buf(IN const osm_dr_path_t * p_path,OUT char * buf,IN size_t buf_size)2863 static void osm_dump_dr_path_to_buf(IN const osm_dr_path_t * p_path,
2864 				    OUT char * buf, IN size_t buf_size)
2865 {
2866 	if (!buf || !p_path)
2867 		return;
2868 	else {
2869 		unsigned n = 0;
2870 
2871 		n = sprintf(buf, "Directed Path Dump of %u hop path: "
2872 			    "Path = ", p_path->hop_count);
2873 
2874 		sprint_uint8_arr(buf + n, buf_size - n, p_path->path,
2875 				 p_path->hop_count + 1);
2876 	}
2877 }
2878 
osm_dump_dr_path(IN osm_log_t * p_log,IN const osm_dr_path_t * p_path,IN osm_log_level_t log_level)2879 void osm_dump_dr_path(IN osm_log_t * p_log, IN const osm_dr_path_t * p_path,
2880 		      IN osm_log_level_t log_level)
2881 {
2882 	if (osm_log_is_active(p_log, log_level)) {
2883 		char buf[BUF_SIZE];
2884 
2885 		osm_dump_dr_path_to_buf(p_path, buf, BUF_SIZE);
2886 
2887 		osm_log(p_log, log_level, "%s\n", buf);
2888 	}
2889 }
2890 
osm_dump_dr_path_v2(IN osm_log_t * p_log,IN const osm_dr_path_t * p_path,IN const int file_id,IN osm_log_level_t log_level)2891 void osm_dump_dr_path_v2(IN osm_log_t * p_log, IN const osm_dr_path_t * p_path,
2892 			 IN const int file_id, IN osm_log_level_t log_level)
2893 {
2894 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2895 		char buf[BUF_SIZE];
2896 
2897 		osm_dump_dr_path_to_buf(p_path, buf, BUF_SIZE);
2898 
2899 		osm_log_v2(p_log, log_level, file_id, "%s\n", buf);
2900 	}
2901 }
2902 
osm_dump_smp_dr_path_to_buf(IN const ib_smp_t * p_smp,OUT char * buf,IN size_t buf_size)2903 static void osm_dump_smp_dr_path_to_buf(IN const ib_smp_t * p_smp,
2904 					OUT char * buf, IN size_t buf_size)
2905 {
2906 	if (!buf || !p_smp)
2907 		return;
2908 	else {
2909 		unsigned n;
2910 
2911 		n = sprintf(buf, "Received SMP on a %u hop path: "
2912 			    "Initial path = ", p_smp->hop_count);
2913 		n += sprint_uint8_arr(buf + n, buf_size - n,
2914 				      p_smp->initial_path,
2915 				      p_smp->hop_count + 1);
2916 
2917 		n += snprintf(buf + n, buf_size - n, ", Return path  = ");
2918 		n += sprint_uint8_arr(buf + n, buf_size - n,
2919 				      p_smp->return_path, p_smp->hop_count + 1);
2920 	}
2921 }
2922 
osm_dump_smp_dr_path(IN osm_log_t * p_log,IN const ib_smp_t * p_smp,IN osm_log_level_t log_level)2923 void osm_dump_smp_dr_path(IN osm_log_t * p_log, IN const ib_smp_t * p_smp,
2924 			  IN osm_log_level_t log_level)
2925 {
2926 	if (osm_log_is_active(p_log, log_level)) {
2927 		char buf[BUF_SIZE];
2928 
2929 		osm_dump_smp_dr_path_to_buf(p_smp, buf, BUF_SIZE);
2930 
2931 		osm_log(p_log, log_level, "%s\n", buf);
2932 	}
2933 }
2934 
osm_dump_smp_dr_path_v2(IN osm_log_t * p_log,IN const ib_smp_t * p_smp,IN const int file_id,IN osm_log_level_t log_level)2935 void osm_dump_smp_dr_path_v2(IN osm_log_t * p_log, IN const ib_smp_t * p_smp,
2936 			     IN const int file_id, IN osm_log_level_t log_level)
2937 {
2938 	if (osm_log_is_active_v2(p_log, log_level, file_id)) {
2939 		char buf[BUF_SIZE];
2940 
2941 		osm_dump_smp_dr_path_to_buf(p_smp, buf, BUF_SIZE);
2942 
2943 		osm_log_v2(p_log, log_level, file_id, "%s\n", buf);
2944 	}
2945 }
2946 
osm_dump_dr_path_as_buf(IN size_t max_len,IN const osm_dr_path_t * p_path,OUT char * buf)2947 void osm_dump_dr_path_as_buf(IN size_t max_len,
2948 			     IN const osm_dr_path_t * p_path,
2949 			     OUT char* buf)
2950 {
2951 	sprint_uint8_arr(buf, max_len, p_path->path, p_path->hop_count + 1);
2952 }
2953 
2954 static const char *sm_signal_str[] = {
2955 	"OSM_SIGNAL_NONE",	/* 0 */
2956 	"OSM_SIGNAL_SWEEP",	/* 1 */
2957 	"OSM_SIGNAL_IDLE_TIME_PROCESS_REQUEST",	/* 2 */
2958 	"OSM_SIGNAL_PERFMGR_SWEEP",	/* 3 */
2959 	"OSM_SIGNAL_GUID_PROCESS_REQUEST",	/* 4 */
2960 	"UNKNOWN SIGNAL!!"	/* 5 */
2961 };
2962 
osm_get_sm_signal_str(IN osm_signal_t signal)2963 const char *osm_get_sm_signal_str(IN osm_signal_t signal)
2964 {
2965 	if (signal > OSM_SIGNAL_MAX)
2966 		signal = OSM_SIGNAL_MAX;
2967 	return sm_signal_str[signal];
2968 }
2969 
2970 static const char *disp_msg_str[] = {
2971 	"OSM_MSG_NONE",
2972 	"OSM_MSG_MAD_NODE_INFO",
2973 	"OSM_MSG_MAD_PORT_INFO",
2974 	"OSM_MSG_MAD_SWITCH_INFO",
2975 	"OSM_MSG_MAD_GUID_INFO",
2976 	"OSM_MSG_MAD_NODE_DESC",
2977 	"OSM_MSG_MAD_NODE_RECORD",
2978 	"OSM_MSG_MAD_PORTINFO_RECORD",
2979 	"OSM_MSG_MAD_SERVICE_RECORD",
2980 	"OSM_MSG_MAD_PATH_RECORD",
2981 	"OSM_MSG_MAD_MCMEMBER_RECORD",
2982 	"OSM_MSG_MAD_LINK_RECORD",
2983 	"OSM_MSG_MAD_SMINFO_RECORD",
2984 	"OSM_MSG_MAD_CLASS_PORT_INFO",
2985 	"OSM_MSG_MAD_INFORM_INFO",
2986 	"OSM_MSG_MAD_LFT_RECORD",
2987 	"OSM_MSG_MAD_LFT",
2988 	"OSM_MSG_MAD_SM_INFO",
2989 	"OSM_MSG_MAD_NOTICE",
2990 	"OSM_MSG_LIGHT_SWEEP_FAIL",
2991 	"OSM_MSG_MAD_MFT",
2992 	"OSM_MSG_MAD_PKEY_TBL_RECORD",
2993 	"OSM_MSG_MAD_VL_ARB_RECORD",
2994 	"OSM_MSG_MAD_SLVL_TBL_RECORD",
2995 	"OSM_MSG_MAD_PKEY",
2996 	"OSM_MSG_MAD_VL_ARB",
2997 	"OSM_MSG_MAD_SLVL",
2998 	"OSM_MSG_MAD_GUIDINFO_RECORD",
2999 	"OSM_MSG_MAD_INFORM_INFO_RECORD",
3000 	"OSM_MSG_MAD_SWITCH_INFO_RECORD",
3001 	"OSM_MSG_MAD_MFT_RECORD",
3002 #if defined (VENDOR_RMPP_SUPPORT) && defined (DUAL_SIDED_RMPP)
3003 	"OSM_MSG_MAD_MULTIPATH_RECORD",
3004 #endif
3005 	"OSM_MSG_MAD_PORT_COUNTERS",
3006 	"OSM_MSG_MAD_MLNX_EXT_PORT_INFO",
3007 	"UNKNOWN!!"
3008 };
3009 
osm_get_disp_msg_str(IN cl_disp_msgid_t msg)3010 const char *osm_get_disp_msg_str(IN cl_disp_msgid_t msg)
3011 {
3012 	if (msg >= OSM_MSG_MAX)
3013 		msg = OSM_MSG_MAX-1;
3014 	return disp_msg_str[msg];
3015 }
3016 
3017 static const char *port_state_str_fixed_width[] = {
3018 	"NOC",
3019 	"DWN",
3020 	"INI",
3021 	"ARM",
3022 	"ACT",
3023 	"???"
3024 };
3025 
osm_get_port_state_str_fixed_width(IN uint8_t port_state)3026 const char *osm_get_port_state_str_fixed_width(IN uint8_t port_state)
3027 {
3028 	if (port_state > IB_LINK_ACTIVE)
3029 		port_state = IB_LINK_ACTIVE + 1;
3030 	return port_state_str_fixed_width[port_state];
3031 }
3032 
3033 static const char *node_type_str_fixed_width[] = {
3034 	"??",
3035 	"CA",
3036 	"SW",
3037 	"RT",
3038 };
3039 
osm_get_node_type_str_fixed_width(IN uint8_t node_type)3040 const char *osm_get_node_type_str_fixed_width(IN uint8_t node_type)
3041 {
3042 	if (node_type > IB_NODE_TYPE_ROUTER)
3043 		node_type = 0;
3044 	return node_type_str_fixed_width[node_type];
3045 }
3046 
osm_get_manufacturer_str(IN uint64_t guid_ho)3047 const char *osm_get_manufacturer_str(IN uint64_t guid_ho)
3048 {
3049 	/* note that the max vendor string length is 11 */
3050 	static const char *intel_str = "Intel";
3051 	static const char *mellanox_str = "Mellanox";
3052 	static const char *redswitch_str = "Redswitch";
3053 	static const char *silverstorm_str = "SilverStorm";
3054 	static const char *topspin_str = "Topspin";
3055 	static const char *fujitsu_str = "Fujitsu";
3056 	static const char *voltaire_str = "Voltaire";
3057 	static const char *yotta_str = "YottaYotta";
3058 	static const char *pathscale_str = "PathScale";
3059 	static const char *ibm_str = "IBM";
3060 	static const char *divergenet_str = "DivergeNet";
3061 	static const char *flextronics_str = "Flextronics";
3062 	static const char *agilent_str = "Agilent";
3063 	static const char *obsidian_str = "Obsidian";
3064 	static const char *baymicro_str = "BayMicro";
3065 	static const char *lsilogic_str = "LSILogic";
3066 	static const char *ddn_str = "DataDirect";
3067 	static const char *panta_str = "Panta";
3068 	static const char *hp_str = "HP";
3069 	static const char *rioworks_str = "Rioworks";
3070 	static const char *sun_str = "Sun";
3071 	static const char *leafntwks_str = "3LeafNtwks";
3072 	static const char *xsigo_str = "Xsigo";
3073 	static const char *dell_str = "Dell";
3074 	static const char *supermicro_str = "SuperMicro";
3075 	static const char *openib_str = "OpenIB";
3076 	static const char *unknown_str = "Unknown";
3077 	static const char *bull_str = "Bull";
3078 
3079 	switch ((uint32_t) (guid_ho >> (5 * 8))) {
3080 	case OSM_VENDOR_ID_INTEL:
3081 		return intel_str;
3082 	case OSM_VENDOR_ID_MELLANOX:
3083 	case OSM_VENDOR_ID_MELLANOX2:
3084 	case OSM_VENDOR_ID_MELLANOX3:
3085 	case OSM_VENDOR_ID_MELLANOX4:
3086 	case OSM_VENDOR_ID_MELLANOX5:
3087 		return mellanox_str;
3088 	case OSM_VENDOR_ID_REDSWITCH:
3089 		return redswitch_str;
3090 	case OSM_VENDOR_ID_SILVERSTORM:
3091 		return silverstorm_str;
3092 	case OSM_VENDOR_ID_TOPSPIN:
3093 		return topspin_str;
3094 	case OSM_VENDOR_ID_FUJITSU:
3095 	case OSM_VENDOR_ID_FUJITSU2:
3096 		return fujitsu_str;
3097 	case OSM_VENDOR_ID_VOLTAIRE:
3098 		return voltaire_str;
3099 	case OSM_VENDOR_ID_YOTTAYOTTA:
3100 		return yotta_str;
3101 	case OSM_VENDOR_ID_PATHSCALE:
3102 		return pathscale_str;
3103 	case OSM_VENDOR_ID_IBM:
3104 	case OSM_VENDOR_ID_IBM2:
3105 		return ibm_str;
3106 	case OSM_VENDOR_ID_DIVERGENET:
3107 		return divergenet_str;
3108 	case OSM_VENDOR_ID_FLEXTRONICS:
3109 		return flextronics_str;
3110 	case OSM_VENDOR_ID_AGILENT:
3111 		return agilent_str;
3112 	case OSM_VENDOR_ID_OBSIDIAN:
3113 		return obsidian_str;
3114 	case OSM_VENDOR_ID_BAYMICRO:
3115 		return baymicro_str;
3116 	case OSM_VENDOR_ID_LSILOGIC:
3117 		return lsilogic_str;
3118 	case OSM_VENDOR_ID_DDN:
3119 		return ddn_str;
3120 	case OSM_VENDOR_ID_PANTA:
3121 		return panta_str;
3122 	case OSM_VENDOR_ID_HP:
3123 	case OSM_VENDOR_ID_HP2:
3124 	case OSM_VENDOR_ID_HP3:
3125 	case OSM_VENDOR_ID_HP4:
3126 		return hp_str;
3127 	case OSM_VENDOR_ID_RIOWORKS:
3128 		return rioworks_str;
3129 	case OSM_VENDOR_ID_SUN:
3130 	case OSM_VENDOR_ID_SUN2:
3131 		return sun_str;
3132 	case OSM_VENDOR_ID_3LEAFNTWKS:
3133 		return leafntwks_str;
3134 	case OSM_VENDOR_ID_XSIGO:
3135 		return xsigo_str;
3136 	case OSM_VENDOR_ID_DELL:
3137 		return dell_str;
3138 	case OSM_VENDOR_ID_SUPERMICRO:
3139 		return supermicro_str;
3140 	case OSM_VENDOR_ID_OPENIB:
3141 		return openib_str;
3142 	case OSM_VENDOR_ID_BULL:
3143 		return bull_str;
3144 	default:
3145 		return unknown_str;
3146 	}
3147 }
3148 
3149 static const char *mtu_str_fixed_width[] = {
3150 	"??? ",
3151 	"256 ",
3152 	"512 ",
3153 	"1024",
3154 	"2048",
3155 	"4096"
3156 };
3157 
osm_get_mtu_str(IN uint8_t mtu)3158 const char *osm_get_mtu_str(IN uint8_t mtu)
3159 {
3160 	if (mtu > IB_MTU_LEN_4096)
3161 		return mtu_str_fixed_width[0];
3162 	else
3163 		return mtu_str_fixed_width[mtu];
3164 }
3165 
3166 static const char *lwa_str_fixed_width[] = {
3167 	"???",
3168 	"1x ",
3169 	"4x ",
3170 	"???",
3171 	"8x ",
3172 	"???",
3173 	"???",
3174 	"???",
3175 	"12x",
3176 	"???",
3177 	"???",
3178 	"???",
3179 	"???",
3180 	"???",
3181 	"???",
3182 	"???",
3183 	"2x "
3184 };
3185 
osm_get_lwa_str(IN uint8_t lwa)3186 const char *osm_get_lwa_str(IN uint8_t lwa)
3187 {
3188 	if (lwa > 16)
3189 		return lwa_str_fixed_width[0];
3190 	else
3191 		return lwa_str_fixed_width[lwa];
3192 }
3193 
3194 static const char *lsa_str_fixed_width[] = {
3195 	"Ext ",
3196 	"2.5 ",
3197 	"5   ",
3198 	"????",
3199 	"10  "
3200 };
3201 
3202 static const char *lsea_str_fixed_width[] = {
3203 	"Std ",
3204 	"14  ",
3205 	"25  "
3206 };
3207 
osm_get_lsa_str(IN uint8_t lsa,IN uint8_t lsea,IN uint8_t state,IN uint8_t fdr10)3208 const char *osm_get_lsa_str(IN uint8_t lsa, IN uint8_t lsea, IN uint8_t state,
3209 			    IN uint8_t fdr10)
3210 {
3211 	if (lsa > IB_LINK_SPEED_ACTIVE_10 || state == IB_LINK_DOWN)
3212 		return lsa_str_fixed_width[3];
3213 	if (lsea == IB_LINK_SPEED_EXT_ACTIVE_NONE) {
3214 		if (fdr10)
3215 			return "FDR10";
3216 		else
3217 			return lsa_str_fixed_width[lsa];
3218 	}
3219 	if (lsea > IB_LINK_SPEED_EXT_ACTIVE_25)
3220 		return lsa_str_fixed_width[3];
3221 	return lsea_str_fixed_width[lsea];
3222 }
3223 
3224 static const char *sm_mgr_signal_str[] = {
3225 	"OSM_SM_SIGNAL_NONE",	/* 0 */
3226 	"OSM_SM_SIGNAL_DISCOVERY_COMPLETED",	/* 1 */
3227 	"OSM_SM_SIGNAL_POLLING_TIMEOUT",	/* 2 */
3228 	"OSM_SM_SIGNAL_DISCOVER",	/* 3 */
3229 	"OSM_SM_SIGNAL_DISABLE",	/* 4 */
3230 	"OSM_SM_SIGNAL_HANDOVER",	/* 5 */
3231 	"OSM_SM_SIGNAL_HANDOVER_SENT",	/* 6 */
3232 	"OSM_SM_SIGNAL_ACKNOWLEDGE",	/* 7 */
3233 	"OSM_SM_SIGNAL_STANDBY",	/* 8 */
3234 	"OSM_SM_SIGNAL_MASTER_OR_HIGHER_SM_DETECTED",	/* 9 */
3235 	"OSM_SM_SIGNAL_WAIT_FOR_HANDOVER",	/* 10 */
3236 	"UNKNOWN STATE!!"	/* 11 */
3237 };
3238 
osm_get_sm_mgr_signal_str(IN osm_sm_signal_t signal)3239 const char *osm_get_sm_mgr_signal_str(IN osm_sm_signal_t signal)
3240 {
3241 	if (signal > OSM_SM_SIGNAL_MAX)
3242 		signal = OSM_SM_SIGNAL_MAX;
3243 	return sm_mgr_signal_str[signal];
3244 }
3245 
3246 static const char *sm_mgr_state_str[] = {
3247 	"NOTACTIVE",		/* 0 */
3248 	"DISCOVERING",		/* 1 */
3249 	"STANDBY",		/* 2 */
3250 	"MASTER",		/* 3 */
3251 	"UNKNOWN STATE!!"	/* 4 */
3252 };
3253 
osm_get_sm_mgr_state_str(IN uint16_t state)3254 const char *osm_get_sm_mgr_state_str(IN uint16_t state)
3255 {
3256 	return state < ARR_SIZE(sm_mgr_state_str) ?
3257 	    sm_mgr_state_str[state] :
3258 	    sm_mgr_state_str[ARR_SIZE(sm_mgr_state_str) - 1];
3259 }
3260 
ib_mtu_is_valid(IN const int mtu)3261 int ib_mtu_is_valid(IN const int mtu)
3262 {
3263 	if (mtu < IB_MIN_MTU || mtu > IB_MAX_MTU)
3264 		return 0;
3265 	return 1;
3266 }
3267 
ib_rate_is_valid(IN const int rate)3268 int ib_rate_is_valid(IN const int rate)
3269 {
3270 	if (rate < IB_MIN_RATE || rate > IB_MAX_RATE)
3271 		return 0;
3272 	return 1;
3273 }
3274 
ib_path_compare_rates(IN const int rate1,IN const int rate2)3275 int ib_path_compare_rates(IN const int rate1, IN const int rate2)
3276 {
3277 	int orate1 = 0, orate2 = 0;
3278 
3279 	CL_ASSERT(rate1 >= IB_MIN_RATE && rate1 <= IB_MAX_RATE);
3280 	CL_ASSERT(rate2 >= IB_MIN_RATE && rate2 <= IB_MAX_RATE);
3281 
3282 	if (rate1 <= IB_MAX_RATE)
3283 		orate1 = ordered_rates[rate1];
3284 	if (rate2 <= IB_MAX_RATE)
3285 		orate2 = ordered_rates[rate2];
3286 	if (orate1 < orate2)
3287 		return -1;
3288 	if (orate1 == orate2)
3289 		return 0;
3290 	return 1;
3291 }
3292 
find_ordered_rate(IN const int rate)3293 static int find_ordered_rate(IN const int rate)
3294 {
3295 	int i;
3296 
3297 	for (i = IB_MIN_RATE; i <= IB_MAX_RATE; i++) {
3298 		if (ordered_rates[i] == rate)
3299 			return i;
3300 	}
3301 	return 0;
3302 }
3303 
ib_path_rate_get_prev(IN const int rate)3304 int ib_path_rate_get_prev(IN const int rate)
3305 {
3306 	int orate;
3307 
3308 	CL_ASSERT(rate >= IB_MIN_RATE && rate <= IB_MAX_RATE);
3309 
3310 	if (rate <= IB_MIN_RATE)
3311 		return 0;
3312 	if (rate > IB_MAX_RATE)
3313 		return 0;
3314 	orate = ordered_rates[rate];
3315 	orate--;
3316 	return find_ordered_rate(orate);
3317 }
3318 
ib_path_rate_get_next(IN const int rate)3319 int ib_path_rate_get_next(IN const int rate)
3320 {
3321 	int orate;
3322 
3323 	CL_ASSERT(rate >= IB_MIN_RATE && rate <= IB_MAX_RATE);
3324 
3325 	if (rate < IB_MIN_RATE)
3326 		return 0;
3327 	if (rate >= IB_MAX_RATE)
3328 		return 0;
3329 	orate = ordered_rates[rate];
3330 	orate++;
3331 	return find_ordered_rate(orate);
3332 }
3333