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