1/* 2 * Copyright (c) 2004-2007 Voltaire Inc. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and/or other materials 21 * provided with the distribution. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 * 32 */ 33#ifndef _MAD_H_ 34#define _MAD_H_ 35 36#include <stdint.h> 37#include <string.h> 38 39#ifdef __cplusplus 40# define BEGIN_C_DECLS extern "C" { 41# define END_C_DECLS } 42#else /* !__cplusplus */ 43# define BEGIN_C_DECLS 44# define END_C_DECLS 45#endif /* __cplusplus */ 46 47BEGIN_C_DECLS 48 49#define IB_SUBNET_PATH_HOPS_MAX 64 50#define IB_DEFAULT_SUBN_PREFIX 0xfe80000000000000llu 51#define IB_DEFAULT_QP1_QKEY 0x80010000 52 53#define IB_MAD_SIZE 256 54 55#define IB_SMP_DATA_OFFS 64 56#define IB_SMP_DATA_SIZE 64 57 58#define IB_VENDOR_RANGE1_DATA_OFFS 24 59#define IB_VENDOR_RANGE1_DATA_SIZE (IB_MAD_SIZE - IB_VENDOR_RANGE1_DATA_OFFS) 60 61#define IB_VENDOR_RANGE2_DATA_OFFS 40 62#define IB_VENDOR_RANGE2_DATA_SIZE (IB_MAD_SIZE - IB_VENDOR_RANGE2_DATA_OFFS) 63 64#define IB_SA_DATA_SIZE 200 65#define IB_SA_DATA_OFFS 56 66 67#define IB_PC_DATA_OFFS 64 68#define IB_PC_DATA_SZ (IB_MAD_SIZE - IB_PC_DATA_OFFS) 69 70#define IB_SA_MCM_RECSZ 53 71#define IB_SA_PR_RECSZ 64 72 73enum MAD_CLASSES { 74 IB_SMI_CLASS = 0x1, 75 IB_SMI_DIRECT_CLASS = 0x81, 76 IB_SA_CLASS = 0x3, 77 IB_PERFORMANCE_CLASS = 0x4, 78 IB_BOARD_MGMT_CLASS = 0x5, 79 IB_DEVICE_MGMT_CLASS = 0x6, 80 IB_CM_CLASS = 0x7, 81 IB_SNMP_CLASS = 0x8, 82 IB_VENDOR_RANGE1_START_CLASS = 0x9, 83 IB_VENDOR_RANGE1_END_CLASS = 0x0f, 84 IB_CC_CLASS = 0x21, 85 IB_VENDOR_RANGE2_START_CLASS = 0x30, 86 IB_VENDOR_RANGE2_END_CLASS = 0x4f, 87}; 88 89enum MAD_METHODS { 90 IB_MAD_METHOD_GET = 0x1, 91 IB_MAD_METHOD_SET = 0x2, 92 IB_MAD_METHOD_GET_RESPONSE = 0x81, 93 94 IB_MAD_METHOD_SEND = 0x3, 95 IB_MAD_METHOD_TRAP = 0x5, 96 IB_MAD_METHOD_TRAP_REPRESS = 0x7, 97 98 IB_MAD_METHOD_REPORT = 0x6, 99 IB_MAD_METHOD_REPORT_RESPONSE = 0x86, 100 IB_MAD_METHOD_GET_TABLE = 0x12, 101 IB_MAD_METHOD_GET_TABLE_RESPONSE = 0x92, 102 IB_MAD_METHOD_GET_TRACE_TABLE = 0x13, 103 IB_MAD_METHOD_GET_TRACE_TABLE_RESPONSE = 0x93, 104 IB_MAD_METHOD_GETMULTI = 0x14, 105 IB_MAD_METHOD_GETMULTI_RESPONSE = 0x94, 106 IB_MAD_METHOD_DELETE = 0x15, 107 IB_MAD_METHOD_DELETE_RESPONSE = 0x95, 108 109 IB_MAD_RESPONSE = 0x80, 110}; 111 112enum MAD_ATTR_ID { 113 CLASS_PORT_INFO = 0x1, 114 NOTICE = 0x2, 115 INFORM_INFO = 0x3, 116}; 117 118enum SMI_ATTR_ID { 119 IB_ATTR_NODE_DESC = 0x10, 120 IB_ATTR_NODE_INFO = 0x11, 121 IB_ATTR_SWITCH_INFO = 0x12, 122 IB_ATTR_GUID_INFO = 0x14, 123 IB_ATTR_PORT_INFO = 0x15, 124 IB_ATTR_PKEY_TBL = 0x16, 125 IB_ATTR_SLVL_TABLE = 0x17, 126 IB_ATTR_VL_ARBITRATION = 0x18, 127 IB_ATTR_LINEARFORWTBL = 0x19, 128 IB_ATTR_MULTICASTFORWTBL = 0x1b, 129 IB_ATTR_SMINFO = 0x20, 130 131 IB_ATTR_LAST 132}; 133 134enum SA_ATTR_ID { 135 IB_SA_ATTR_NOTICE = 0x02, 136 IB_SA_ATTR_INFORMINFO = 0x03, 137 IB_SA_ATTR_PORTINFORECORD = 0x12, 138 IB_SA_ATTR_LINKRECORD = 0x20, 139 IB_SA_ATTR_SERVICERECORD = 0x31, 140 IB_SA_ATTR_PATHRECORD = 0x35, 141 IB_SA_ATTR_MCRECORD = 0x38, 142 IB_SA_ATTR_MULTIPATH = 0x3a, 143 144 IB_SA_ATTR_LAST 145}; 146 147enum GSI_ATTR_ID { 148 IB_GSI_PORT_SAMPLES_CONTROL = 0x10, 149 IB_GSI_PORT_SAMPLES_RESULT = 0x11, 150 IB_GSI_PORT_COUNTERS = 0x12, 151 IB_GSI_PORT_COUNTERS_EXT = 0x1D, 152 153 IB_GSI_ATTR_LAST 154}; 155 156#define IB_VENDOR_OPENIB_PING_CLASS (IB_VENDOR_RANGE2_START_CLASS + 2) 157#define IB_VENDOR_OPENIB_SYSSTAT_CLASS (IB_VENDOR_RANGE2_START_CLASS + 3) 158#define IB_OPENIB_OUI (0x001405) 159 160typedef uint8_t ibmad_gid_t[16]; 161#ifdef USE_DEPRECATED_IB_GID_T 162typedef ibmad_gid_t ib_gid_t __attribute__((deprecated)); 163#endif 164 165typedef struct { 166 int cnt; 167 uint8_t p[IB_SUBNET_PATH_HOPS_MAX]; 168 uint16_t drslid; 169 uint16_t drdlid; 170} ib_dr_path_t; 171 172typedef struct { 173 unsigned id; 174 unsigned mod; 175} ib_attr_t; 176 177typedef struct { 178 int mgtclass; 179 int method; 180 ib_attr_t attr; 181 uint32_t rstatus; /* return status */ 182 int dataoffs; 183 int datasz; 184 uint64_t mkey; 185 uint64_t trid; /* used for out mad if nonzero, return real val */ 186 uint64_t mask; /* for sa mads */ 187 unsigned recsz; /* for sa mads (attribute offset) */ 188 int timeout; 189 uint32_t oui; /* for vendor range 2 mads */ 190} ib_rpc_t; 191 192typedef struct portid { 193 int lid; /* lid or 0 if directed route */ 194 ib_dr_path_t drpath; 195 int grh_present; /* flag */ 196 ibmad_gid_t gid; 197 uint32_t qp; 198 uint32_t qkey; 199 uint8_t sl; 200 unsigned pkey_idx; 201} ib_portid_t; 202 203typedef void (ib_mad_dump_fn)(char *buf, int bufsz, void *val, int valsz); 204 205#define IB_FIELD_NAME_LEN 32 206 207typedef struct ib_field { 208 int bitoffs; 209 int bitlen; 210 char name[IB_FIELD_NAME_LEN]; 211 ib_mad_dump_fn *def_dump_fn; 212} ib_field_t; 213 214enum MAD_FIELDS { 215 IB_NO_FIELD, 216 217 IB_GID_PREFIX_F, 218 IB_GID_GUID_F, 219 220 /* first MAD word (0-3 bytes) */ 221 IB_MAD_METHOD_F, 222 IB_MAD_RESPONSE_F, 223 IB_MAD_CLASSVER_F, 224 IB_MAD_MGMTCLASS_F, 225 IB_MAD_BASEVER_F, 226 227 /* second MAD word (4-7 bytes) */ 228 IB_MAD_STATUS_F, 229 230 /* DRSMP only */ 231 IB_DRSMP_HOPCNT_F, 232 IB_DRSMP_HOPPTR_F, 233 IB_DRSMP_STATUS_F, 234 IB_DRSMP_DIRECTION_F, 235 236 /* words 3,4,5,6 (8-23 bytes) */ 237 IB_MAD_TRID_F, 238 IB_MAD_ATTRID_F, 239 IB_MAD_ATTRMOD_F, 240 241 /* word 7,8 (24-31 bytes) */ 242 IB_MAD_MKEY_F, 243 244 /* word 9 (32-37 bytes) */ 245 IB_DRSMP_DRSLID_F, 246 IB_DRSMP_DRDLID_F, 247 248 /* word 10,11 (36-43 bytes) */ 249 IB_SA_MKEY_F, 250 251 /* word 12 (44-47 bytes) */ 252 IB_SA_ATTROFFS_F, 253 254 /* word 13,14 (48-55 bytes) */ 255 IB_SA_COMPMASK_F, 256 257 /* word 13,14 (56-255 bytes) */ 258 IB_SA_DATA_F, 259 260 /* bytes 64 - 127 */ 261 IB_SM_DATA_F, 262 263 /* bytes 64 - 256 */ 264 IB_GS_DATA_F, 265 266 /* bytes 128 - 191 */ 267 IB_DRSMP_PATH_F, 268 269 /* bytes 192 - 255 */ 270 IB_DRSMP_RPATH_F, 271 272 /* 273 * PortInfo fields: 274 */ 275 IB_PORT_FIRST_F, 276 IB_PORT_MKEY_F = IB_PORT_FIRST_F, 277 IB_PORT_GID_PREFIX_F, 278 IB_PORT_LID_F, 279 IB_PORT_SMLID_F, 280 IB_PORT_CAPMASK_F, 281 IB_PORT_DIAG_F, 282 IB_PORT_MKEY_LEASE_F, 283 IB_PORT_LOCAL_PORT_F, 284 IB_PORT_LINK_WIDTH_ENABLED_F, 285 IB_PORT_LINK_WIDTH_SUPPORTED_F, 286 IB_PORT_LINK_WIDTH_ACTIVE_F, 287 IB_PORT_LINK_SPEED_SUPPORTED_F, 288 IB_PORT_STATE_F, 289 IB_PORT_PHYS_STATE_F, 290 IB_PORT_LINK_DOWN_DEF_F, 291 IB_PORT_MKEY_PROT_BITS_F, 292 IB_PORT_LMC_F, 293 IB_PORT_LINK_SPEED_ACTIVE_F, 294 IB_PORT_LINK_SPEED_ENABLED_F, 295 IB_PORT_NEIGHBOR_MTU_F, 296 IB_PORT_SMSL_F, 297 IB_PORT_VL_CAP_F, 298 IB_PORT_INIT_TYPE_F, 299 IB_PORT_VL_HIGH_LIMIT_F, 300 IB_PORT_VL_ARBITRATION_HIGH_CAP_F, 301 IB_PORT_VL_ARBITRATION_LOW_CAP_F, 302 IB_PORT_INIT_TYPE_REPLY_F, 303 IB_PORT_MTU_CAP_F, 304 IB_PORT_VL_STALL_COUNT_F, 305 IB_PORT_HOQ_LIFE_F, 306 IB_PORT_OPER_VLS_F, 307 IB_PORT_PART_EN_INB_F, 308 IB_PORT_PART_EN_OUTB_F, 309 IB_PORT_FILTER_RAW_INB_F, 310 IB_PORT_FILTER_RAW_OUTB_F, 311 IB_PORT_MKEY_VIOL_F, 312 IB_PORT_PKEY_VIOL_F, 313 IB_PORT_QKEY_VIOL_F, 314 IB_PORT_GUID_CAP_F, 315 IB_PORT_CLIENT_REREG_F, 316 IB_PORT_SUBN_TIMEOUT_F, 317 IB_PORT_RESP_TIME_VAL_F, 318 IB_PORT_LOCAL_PHYS_ERR_F, 319 IB_PORT_OVERRUN_ERR_F, 320 IB_PORT_MAX_CREDIT_HINT_F, 321 IB_PORT_LINK_ROUND_TRIP_F, 322 IB_PORT_LAST_F, 323 324 /* 325 * NodeInfo fields: 326 */ 327 IB_NODE_FIRST_F, 328 IB_NODE_BASE_VERS_F = IB_NODE_FIRST_F, 329 IB_NODE_CLASS_VERS_F, 330 IB_NODE_TYPE_F, 331 IB_NODE_NPORTS_F, 332 IB_NODE_SYSTEM_GUID_F, 333 IB_NODE_GUID_F, 334 IB_NODE_PORT_GUID_F, 335 IB_NODE_PARTITION_CAP_F, 336 IB_NODE_DEVID_F, 337 IB_NODE_REVISION_F, 338 IB_NODE_LOCAL_PORT_F, 339 IB_NODE_VENDORID_F, 340 IB_NODE_LAST_F, 341 342 /* 343 * SwitchInfo fields: 344 */ 345 IB_SW_FIRST_F, 346 IB_SW_LINEAR_FDB_CAP_F = IB_SW_FIRST_F, 347 IB_SW_RANDOM_FDB_CAP_F, 348 IB_SW_MCAST_FDB_CAP_F, 349 IB_SW_LINEAR_FDB_TOP_F, 350 IB_SW_DEF_PORT_F, 351 IB_SW_DEF_MCAST_PRIM_F, 352 IB_SW_DEF_MCAST_NOT_PRIM_F, 353 IB_SW_LIFE_TIME_F, 354 IB_SW_STATE_CHANGE_F, 355 IB_SW_LIDS_PER_PORT_F, 356 IB_SW_PARTITION_ENFORCE_CAP_F, 357 IB_SW_PARTITION_ENF_INB_F, 358 IB_SW_PARTITION_ENF_OUTB_F, 359 IB_SW_FILTER_RAW_INB_F, 360 IB_SW_FILTER_RAW_OUTB_F, 361 IB_SW_ENHANCED_PORT0_F, 362 IB_SW_LAST_F, 363 364 /* 365 * SwitchLinearForwardingTable fields: 366 */ 367 IB_LINEAR_FORW_TBL_F, 368 369 /* 370 * SwitchMulticastForwardingTable fields: 371 */ 372 IB_MULTICAST_FORW_TBL_F, 373 374 /* 375 * NodeDescription fields: 376 */ 377 IB_NODE_DESC_F, 378 379 /* 380 * Notice/Trap fields 381 */ 382 IB_NOTICE_IS_GENERIC_F, 383 IB_NOTICE_TYPE_F, 384 IB_NOTICE_PRODUCER_F, 385 IB_NOTICE_TRAP_NUMBER_F, 386 IB_NOTICE_ISSUER_LID_F, 387 IB_NOTICE_TOGGLE_F, 388 IB_NOTICE_COUNT_F, 389 IB_NOTICE_DATA_DETAILS_F, 390 IB_NOTICE_DATA_LID_F, 391 IB_NOTICE_DATA_144_LID_F, 392 IB_NOTICE_DATA_144_CAPMASK_F, 393 394 /* 395 * GS Performance 396 */ 397 IB_PC_FIRST_F, 398 IB_PC_PORT_SELECT_F = IB_PC_FIRST_F, 399 IB_PC_COUNTER_SELECT_F, 400 IB_PC_ERR_SYM_F, 401 IB_PC_LINK_RECOVERS_F, 402 IB_PC_LINK_DOWNED_F, 403 IB_PC_ERR_RCV_F, 404 IB_PC_ERR_PHYSRCV_F, 405 IB_PC_ERR_SWITCH_REL_F, 406 IB_PC_XMT_DISCARDS_F, 407 IB_PC_ERR_XMTCONSTR_F, 408 IB_PC_ERR_RCVCONSTR_F, 409 IB_PC_ERR_LOCALINTEG_F, 410 IB_PC_ERR_EXCESS_OVR_F, 411 IB_PC_VL15_DROPPED_F, 412 IB_PC_XMT_BYTES_F, 413 IB_PC_RCV_BYTES_F, 414 IB_PC_XMT_PKTS_F, 415 IB_PC_RCV_PKTS_F, 416 IB_PC_LAST_F, 417 418 /* 419 * SMInfo 420 */ 421 IB_SMINFO_GUID_F, 422 IB_SMINFO_KEY_F, 423 IB_SMINFO_ACT_F, 424 IB_SMINFO_PRIO_F, 425 IB_SMINFO_STATE_F, 426 427 /* 428 * SA RMPP 429 */ 430 IB_SA_RMPP_VERS_F, 431 IB_SA_RMPP_TYPE_F, 432 IB_SA_RMPP_RESP_F, 433 IB_SA_RMPP_FLAGS_F, 434 IB_SA_RMPP_STATUS_F, 435 436 /* data1 */ 437 IB_SA_RMPP_D1_F, 438 IB_SA_RMPP_SEGNUM_F, 439 /* data2 */ 440 IB_SA_RMPP_D2_F, 441 IB_SA_RMPP_LEN_F, /* DATA: Payload len */ 442 IB_SA_RMPP_NEWWIN_F, /* ACK: new window last */ 443 444 /* 445 * SA Multi Path rec 446 */ 447 IB_SA_MP_NPATH_F, 448 IB_SA_MP_NSRC_F, 449 IB_SA_MP_NDEST_F, 450 IB_SA_MP_GID0_F, 451 452 /* 453 * SA Path rec 454 */ 455 IB_SA_PR_DGID_F, 456 IB_SA_PR_SGID_F, 457 IB_SA_PR_DLID_F, 458 IB_SA_PR_SLID_F, 459 IB_SA_PR_NPATH_F, 460 461 /* 462 * MC Member rec 463 */ 464 IB_SA_MCM_MGID_F, 465 IB_SA_MCM_PORTGID_F, 466 IB_SA_MCM_QKEY_F, 467 IB_SA_MCM_MLID_F, 468 IB_SA_MCM_SL_F, 469 IB_SA_MCM_MTU_F, 470 IB_SA_MCM_RATE_F, 471 IB_SA_MCM_TCLASS_F, 472 IB_SA_MCM_PKEY_F, 473 IB_SA_MCM_FLOW_LABEL_F, 474 IB_SA_MCM_JOIN_STATE_F, 475 IB_SA_MCM_PROXY_JOIN_F, 476 477 /* 478 * Service record 479 */ 480 IB_SA_SR_ID_F, 481 IB_SA_SR_GID_F, 482 IB_SA_SR_PKEY_F, 483 IB_SA_SR_LEASE_F, 484 IB_SA_SR_KEY_F, 485 IB_SA_SR_NAME_F, 486 IB_SA_SR_DATA_F, 487 488 /* 489 * ATS SM record - within SA_SR_DATA 490 */ 491 IB_ATS_SM_NODE_ADDR_F, 492 IB_ATS_SM_MAGIC_KEY_F, 493 IB_ATS_SM_NODE_TYPE_F, 494 IB_ATS_SM_NODE_NAME_F, 495 496 /* 497 * SLTOVL MAPPING TABLE 498 */ 499 IB_SLTOVL_MAPPING_TABLE_F, 500 501 /* 502 * VL ARBITRATION TABLE 503 */ 504 IB_VL_ARBITRATION_TABLE_F, 505 506 /* 507 * IB vendor class range 2 508 */ 509 IB_VEND2_OUI_F, 510 IB_VEND2_DATA_F, 511 512 /* 513 * PortCountersExtended 514 */ 515 IB_PC_EXT_FIRST_F, 516 IB_PC_EXT_PORT_SELECT_F = IB_PC_EXT_FIRST_F, 517 IB_PC_EXT_COUNTER_SELECT_F, 518 IB_PC_EXT_XMT_BYTES_F, 519 IB_PC_EXT_RCV_BYTES_F, 520 IB_PC_EXT_XMT_PKTS_F, 521 IB_PC_EXT_RCV_PKTS_F, 522 IB_PC_EXT_XMT_UPKTS_F, 523 IB_PC_EXT_RCV_UPKTS_F, 524 IB_PC_EXT_XMT_MPKTS_F, 525 IB_PC_EXT_RCV_MPKTS_F, 526 IB_PC_EXT_LAST_F, 527 528 /* 529 * GUIDInfo fields 530 */ 531 IB_GUID_GUID0_F, 532 533 IB_FIELD_LAST_ /* must be last */ 534}; 535 536/* 537 * SA RMPP section 538 */ 539enum RMPP_TYPE_ENUM { 540 IB_RMPP_TYPE_NONE, 541 IB_RMPP_TYPE_DATA, 542 IB_RMPP_TYPE_ACK, 543 IB_RMPP_TYPE_STOP, 544 IB_RMPP_TYPE_ABORT, 545}; 546 547enum RMPP_FLAGS_ENUM { 548 IB_RMPP_FLAG_ACTIVE = 1 << 0, 549 IB_RMPP_FLAG_FIRST = 1 << 1, 550 IB_RMPP_FLAG_LAST = 1 << 2, 551}; 552 553typedef struct { 554 int type; 555 int flags; 556 int status; 557 union { 558 uint32_t u; 559 uint32_t segnum; 560 } d1; 561 union { 562 uint32_t u; 563 uint32_t len; 564 uint32_t newwin; 565 } d2; 566} ib_rmpp_hdr_t; 567 568enum SA_SIZES_ENUM { 569 SA_HEADER_SZ = 20, 570}; 571 572typedef struct ib_sa_call { 573 unsigned attrid; 574 unsigned mod; 575 uint64_t mask; 576 unsigned method; 577 578 uint64_t trid; /* used for out mad if nonzero, return real val */ 579 unsigned recsz; /* return field */ 580 ib_rmpp_hdr_t rmpp; 581} ib_sa_call_t; 582 583typedef struct ib_vendor_call { 584 unsigned method; 585 unsigned mgmt_class; 586 unsigned attrid; 587 unsigned mod; 588 uint32_t oui; 589 unsigned timeout; 590 ib_rmpp_hdr_t rmpp; 591} ib_vendor_call_t; 592 593#define IB_MIN_UCAST_LID 1 594#define IB_MAX_UCAST_LID (0xc000-1) 595#define IB_MIN_MCAST_LID 0xc000 596#define IB_MAX_MCAST_LID (0xffff-1) 597 598#define IB_LID_VALID(lid) ((lid) >= IB_MIN_UCAST_LID && lid <= IB_MAX_UCAST_LID) 599#define IB_MLID_VALID(lid) ((lid) >= IB_MIN_MCAST_LID && lid <= IB_MAX_MCAST_LID) 600 601#define MAD_DEF_RETRIES 3 602#define MAD_DEF_TIMEOUT_MS 1000 603 604enum { 605 IB_DEST_LID, 606 IB_DEST_DRPATH, 607 IB_DEST_GUID, 608 IB_DEST_DRSLID, 609}; 610 611enum { 612 IB_NODE_CA = 1, 613 IB_NODE_SWITCH, 614 IB_NODE_ROUTER, 615 NODE_RNIC, 616 617 IB_NODE_MAX = NODE_RNIC 618}; 619 620/******************************************************************************/ 621 622/* portid.c */ 623char * portid2str(ib_portid_t *portid); 624int portid2portnum(ib_portid_t *portid); 625int str2drpath(ib_dr_path_t *path, char *routepath, int drslid, int drdlid); 626char * drpath2str(ib_dr_path_t *path, char *dstr, size_t dstr_size); 627 628static inline int 629ib_portid_set(ib_portid_t *portid, int lid, int qp, int qkey) 630{ 631 portid->lid = lid; 632 portid->qp = qp; 633 portid->qkey = qkey; 634 portid->grh_present = 0; 635 636 return 0; 637} 638 639/* fields.c */ 640extern ib_field_t ib_mad_f[]; 641 642void _set_field(void *buf, int base_offs, ib_field_t *f, uint32_t val); 643uint32_t _get_field(void *buf, int base_offs, ib_field_t *f); 644void _set_array(void *buf, int base_offs, ib_field_t *f, void *val); 645void _get_array(void *buf, int base_offs, ib_field_t *f, void *val); 646void _set_field64(void *buf, int base_offs, ib_field_t *f, uint64_t val); 647uint64_t _get_field64(void *buf, int base_offs, ib_field_t *f); 648 649/* mad.c */ 650static inline uint32_t 651mad_get_field(void *buf, int base_offs, int field) 652{ 653 return _get_field(buf, base_offs, ib_mad_f + field); 654} 655 656static inline void 657mad_set_field(void *buf, int base_offs, int field, uint32_t val) 658{ 659 _set_field(buf, base_offs, ib_mad_f + field, val); 660} 661 662/* field must be byte aligned */ 663static inline uint64_t 664mad_get_field64(void *buf, int base_offs, int field) 665{ 666 return _get_field64(buf, base_offs, ib_mad_f + field); 667} 668 669static inline void 670mad_set_field64(void *buf, int base_offs, int field, uint64_t val) 671{ 672 _set_field64(buf, base_offs, ib_mad_f + field, val); 673} 674 675static inline void 676mad_set_array(void *buf, int base_offs, int field, void *val) 677{ 678 _set_array(buf, base_offs, ib_mad_f + field, val); 679} 680 681static inline void 682mad_get_array(void *buf, int base_offs, int field, void *val) 683{ 684 _get_array(buf, base_offs, ib_mad_f + field, val); 685} 686 687void mad_decode_field(uint8_t *buf, int field, void *val); 688void mad_encode_field(uint8_t *buf, int field, void *val); 689void * mad_encode(void *buf, ib_rpc_t *rpc, ib_dr_path_t *drpath, void *data); 690uint64_t mad_trid(void); 691int mad_build_pkt(void *umad, ib_rpc_t *rpc, ib_portid_t *dport, ib_rmpp_hdr_t *rmpp, void *data); 692 693/* register.c */ 694int mad_register_port_client(int port_id, int mgmt, uint8_t rmpp_version); 695int mad_register_client(int mgmt, uint8_t rmpp_version); 696int mad_register_server(int mgmt, uint8_t rmpp_version, 697 long method_mask[16/sizeof(long)], 698 uint32_t class_oui); 699int mad_class_agent(int mgmt); 700int mad_agent_class(int agent); 701 702/* serv.c */ 703int mad_send(ib_rpc_t *rpc, ib_portid_t *dport, ib_rmpp_hdr_t *rmpp, 704 void *data); 705void * mad_receive(void *umad, int timeout); 706int mad_respond(void *umad, ib_portid_t *portid, uint32_t rstatus); 707void * mad_alloc(void); 708void mad_free(void *umad); 709 710/* vendor.c */ 711uint8_t *ib_vendor_call(void *data, ib_portid_t *portid, 712 ib_vendor_call_t *call); 713 714static inline int 715mad_is_vendor_range1(int mgmt) 716{ 717 return mgmt >= 0x9 && mgmt <= 0xf; 718} 719 720static inline int 721mad_is_vendor_range2(int mgmt) 722{ 723 return mgmt >= 0x30 && mgmt <= 0x4f; 724} 725 726/* rpc.c */ 727int madrpc_portid(void); 728int madrpc_set_retries(int retries); 729int madrpc_set_timeout(int timeout); 730void * madrpc(ib_rpc_t *rpc, ib_portid_t *dport, void *payload, void *rcvdata); 731void * madrpc_rmpp(ib_rpc_t *rpc, ib_portid_t *dport, ib_rmpp_hdr_t *rmpp, 732 void *data); 733void madrpc_init(char *dev_name, int dev_port, int *mgmt_classes, 734 int num_classes); 735void madrpc_save_mad(void *madbuf, int len); 736void madrpc_lock(void); 737void madrpc_unlock(void); 738void madrpc_show_errors(int set); 739 740void * mad_rpc_open_port(char *dev_name, int dev_port, int *mgmt_classes, 741 int num_classes); 742void mad_rpc_close_port(void *ibmad_port); 743void * mad_rpc(const void *ibmad_port, ib_rpc_t *rpc, ib_portid_t *dport, 744 void *payload, void *rcvdata); 745void * mad_rpc_rmpp(const void *ibmad_port, ib_rpc_t *rpc, ib_portid_t *dport, 746 ib_rmpp_hdr_t *rmpp, void *data); 747 748/* smp.c */ 749uint8_t * smp_query(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod, 750 unsigned timeout); 751uint8_t * smp_set(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod, 752 unsigned timeout); 753uint8_t * smp_query_via(void *buf, ib_portid_t *id, unsigned attrid, 754 unsigned mod, unsigned timeout, const void *srcport); 755uint8_t * smp_set_via(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod, 756 unsigned timeout, const void *srcport); 757 758inline static uint8_t * 759safe_smp_query(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod, 760 unsigned timeout) 761{ 762 uint8_t *p; 763 764 madrpc_lock(); 765 p = smp_query(rcvbuf, portid, attrid, mod, timeout); 766 madrpc_unlock(); 767 768 return p; 769} 770 771inline static uint8_t * 772safe_smp_set(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod, 773 unsigned timeout) 774{ 775 uint8_t *p; 776 777 madrpc_lock(); 778 p = smp_set(rcvbuf, portid, attrid, mod, timeout); 779 madrpc_unlock(); 780 781 return p; 782} 783 784/* sa.c */ 785uint8_t * sa_call(void *rcvbuf, ib_portid_t *portid, ib_sa_call_t *sa, 786 unsigned timeout); 787uint8_t * sa_rpc_call(const void *ibmad_port, void *rcvbuf, ib_portid_t *portid, 788 ib_sa_call_t *sa, unsigned timeout); 789int ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id, 790 void *buf); /* returns lid */ 791int ib_path_query_via(const void *srcport, ibmad_gid_t srcgid, 792 ibmad_gid_t destgid, ib_portid_t *sm_id, void *buf); 793 794inline static uint8_t * 795safe_sa_call(void *rcvbuf, ib_portid_t *portid, ib_sa_call_t *sa, 796 unsigned timeout) 797{ 798 uint8_t *p; 799 800 madrpc_lock(); 801 p = sa_call(rcvbuf, portid, sa, timeout); 802 madrpc_unlock(); 803 804 return p; 805} 806 807/* resolve.c */ 808int ib_resolve_smlid(ib_portid_t *sm_id, int timeout); 809int ib_resolve_guid(ib_portid_t *portid, uint64_t *guid, 810 ib_portid_t *sm_id, int timeout); 811int ib_resolve_portid_str(ib_portid_t *portid, char *addr_str, 812 int dest_type, ib_portid_t *sm_id); 813int ib_resolve_self(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid); 814 815int ib_resolve_smlid_via(ib_portid_t *sm_id, int timeout, 816 const void *srcport); 817int ib_resolve_guid_via(ib_portid_t *portid, uint64_t *guid, 818 ib_portid_t *sm_id, int timeout, 819 const void *srcport); 820int ib_resolve_portid_str_via(ib_portid_t *portid, char *addr_str, 821 int dest_type, ib_portid_t *sm_id, 822 const void *srcport); 823int ib_resolve_self_via(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid, 824 const void *srcport); 825 826/* gs.c */ 827uint8_t *perf_classportinfo_query(void *rcvbuf, ib_portid_t *dest, int port, 828 unsigned timeout); 829uint8_t *port_performance_query(void *rcvbuf, ib_portid_t *dest, int port, 830 unsigned timeout); 831uint8_t *port_performance_reset(void *rcvbuf, ib_portid_t *dest, int port, 832 unsigned mask, unsigned timeout); 833uint8_t *port_performance_ext_query(void *rcvbuf, ib_portid_t *dest, int port, 834 unsigned timeout); 835uint8_t *port_performance_ext_reset(void *rcvbuf, ib_portid_t *dest, int port, 836 unsigned mask, unsigned timeout); 837uint8_t *port_samples_control_query(void *rcvbuf, ib_portid_t *dest, int port, 838 unsigned timeout); 839uint8_t *port_samples_result_query(void *rcvbuf, ib_portid_t *dest, int port, 840 unsigned timeout); 841 842uint8_t *perf_classportinfo_query_via(void *rcvbuf, ib_portid_t *dest, int port, 843 unsigned timeout, const void *srcport); 844uint8_t *port_performance_query_via(void *rcvbuf, ib_portid_t *dest, int port, 845 unsigned timeout, const void *srcport); 846uint8_t *port_performance_reset_via(void *rcvbuf, ib_portid_t *dest, int port, 847 unsigned mask, unsigned timeout, const void *srcport); 848uint8_t *port_performance_ext_query_via(void *rcvbuf, ib_portid_t *dest, int port, 849 unsigned timeout, const void *srcport); 850uint8_t *port_performance_ext_reset_via(void *rcvbuf, ib_portid_t *dest, int port, 851 unsigned mask, unsigned timeout, const void *srcport); 852uint8_t *port_samples_control_query_via(void *rcvbuf, ib_portid_t *dest, int port, 853 unsigned timeout, const void *srcport); 854uint8_t *port_samples_result_query_via(void *rcvbuf, ib_portid_t *dest, int port, 855 unsigned timeout, const void *srcport); 856/* dump.c */ 857ib_mad_dump_fn 858 mad_dump_int, mad_dump_uint, mad_dump_hex, mad_dump_rhex, 859 mad_dump_bitfield, mad_dump_array, mad_dump_string, 860 mad_dump_linkwidth, mad_dump_linkwidthsup, mad_dump_linkwidthen, 861 mad_dump_linkdowndefstate, 862 mad_dump_linkspeed, mad_dump_linkspeedsup, mad_dump_linkspeeden, 863 mad_dump_portstate, mad_dump_portstates, 864 mad_dump_physportstate, mad_dump_portcapmask, 865 mad_dump_mtu, mad_dump_vlcap, mad_dump_opervls, 866 mad_dump_node_type, 867 mad_dump_sltovl, mad_dump_vlarbitration, 868 mad_dump_nodedesc, mad_dump_nodeinfo, mad_dump_portinfo, mad_dump_switchinfo, 869 mad_dump_perfcounters, mad_dump_perfcounters_ext; 870 871int _mad_dump(ib_mad_dump_fn *fn, char *name, void *val, int valsz); 872char * _mad_dump_field(ib_field_t *f, char *name, char *buf, int bufsz, 873 void *val); 874int _mad_print_field(ib_field_t *f, char *name, void *val, int valsz); 875char * _mad_dump_val(ib_field_t *f, char *buf, int bufsz, void *val); 876 877static inline int 878mad_print_field(int field, char *name, void *val) 879{ 880 if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_) 881 return -1; 882 return _mad_print_field(ib_mad_f + field, name, val, 0); 883} 884 885static inline char * 886mad_dump_field(int field, char *buf, int bufsz, void *val) 887{ 888 if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_) 889 return 0; 890 return _mad_dump_field(ib_mad_f + field, 0, buf, bufsz, val); 891} 892 893static inline char * 894mad_dump_val(int field, char *buf, int bufsz, void *val) 895{ 896 if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_) 897 return 0; 898 return _mad_dump_val(ib_mad_f + field, buf, bufsz, val); 899} 900 901extern int ibdebug; 902 903END_C_DECLS 904 905#endif /* _MAD_H_ */ 906