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 */
64static 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
92static 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
118static 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
156static 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
195static 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
445static 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
468int 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
482const 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
497const 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
506const 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
519const 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
529const 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
571const ib_gid_t ib_zero_gid = { {0} };
572
573static 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
592static 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
796static 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
838static 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
925void 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
953void 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
981static 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
1004void 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
1019void 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
1034static 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
1122void 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
1149void 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
1177static 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
1207void 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
1222void 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
1238static 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}
1270void 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
1283void 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
1297static 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
1328void 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
1340void 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
1352static 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
1396void 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
1409void 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
1423static 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
1465void 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
1477void 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
1489static 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
1549void 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
1562void 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
1576static 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
1611void 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
1623void 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
1635static 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
1727void 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
1740void 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
1754static 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
1791static 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
1828void 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
1844void 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
1861static 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
1909static 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
1957void 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
1973void 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
1990static 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
2008void 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
2021void 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
2035static 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
2065void 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
2078void 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
2092static 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
2129void 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
2142void 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
2156static 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
2181void 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
2196void 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
2212static 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
2240void 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
2255void 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
2271static 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
2298void 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
2313void 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
2329static 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
2349void 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
2361void 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
2373static 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
2399void 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
2412void 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
2426static 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
2612static 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
2629void 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
2645void 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
2661static 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
2765void 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
2777void 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
2789static 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
2839void 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
2851void 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
2863static 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
2879void 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
2891void 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
2903static 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
2923void 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
2935void 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
2947void 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
2954static 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
2963const 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
2970static 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
3010const 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
3017static const char *port_state_str_fixed_width[] = {
3018	"NOC",
3019	"DWN",
3020	"INI",
3021	"ARM",
3022	"ACT",
3023	"???"
3024};
3025
3026const 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
3033static const char *node_type_str_fixed_width[] = {
3034	"??",
3035	"CA",
3036	"SW",
3037	"RT",
3038};
3039
3040const 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
3047const 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
3149static const char *mtu_str_fixed_width[] = {
3150	"??? ",
3151	"256 ",
3152	"512 ",
3153	"1024",
3154	"2048",
3155	"4096"
3156};
3157
3158const 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
3166static 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
3186const 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
3194static const char *lsa_str_fixed_width[] = {
3195	"Ext ",
3196	"2.5 ",
3197	"5   ",
3198	"????",
3199	"10  "
3200};
3201
3202static const char *lsea_str_fixed_width[] = {
3203	"Std ",
3204	"14  ",
3205	"25  "
3206};
3207
3208const 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
3224static 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
3239const 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
3246static const char *sm_mgr_state_str[] = {
3247	"NOTACTIVE",		/* 0 */
3248	"DISCOVERING",		/* 1 */
3249	"STANDBY",		/* 2 */
3250	"MASTER",		/* 3 */
3251	"UNKNOWN STATE!!"	/* 4 */
3252};
3253
3254const 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
3261int 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
3268int 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
3275int 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
3293static 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
3304int 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
3319int 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