1 /* 2 * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. 3 * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved. 4 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. 5 * Copyright (c) 2009-2011 ZIH, TU Dresden, Federal Republic of Germany. All rights reserved. 6 * 7 * This software is available to you under a choice of one of two 8 * licenses. You may choose to be licensed under the terms of the GNU 9 * General Public License (GPL) Version 2, available from the file 10 * COPYING in the main directory of this source tree, or the 11 * OpenIB.org BSD license below: 12 * 13 * Redistribution and use in source and binary forms, with or 14 * without modification, are permitted provided that the following 15 * conditions are met: 16 * 17 * - Redistributions of source code must retain the above 18 * copyright notice, this list of conditions and the following 19 * disclaimer. 20 * 21 * - Redistributions in binary form must reproduce the above 22 * copyright notice, this list of conditions and the following 23 * disclaimer in the documentation and/or other materials 24 * provided with the distribution. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 33 * SOFTWARE. 34 * 35 */ 36 37 /* 38 * Abstract: 39 * Declaration of osm_opensm_t. 40 * This object represents the OpenSM super object. 41 * This object is part of the OpenSM family of objects. 42 */ 43 44 #ifndef _OSM_OPENSM_H_ 45 #define _OSM_OPENSM_H_ 46 47 #include <stdio.h> 48 #include <complib/cl_qlist.h> 49 #include <complib/cl_dispatcher.h> 50 #include <complib/cl_passivelock.h> 51 #include <complib/cl_atomic.h> 52 #include <complib/cl_nodenamemap.h> 53 #include <opensm/osm_console_io.h> 54 #include <opensm/osm_stats.h> 55 #include <opensm/osm_log.h> 56 #include <opensm/osm_sm.h> 57 #include <opensm/osm_sa.h> 58 #include <opensm/osm_perfmgr.h> 59 #include <opensm/osm_event_plugin.h> 60 #include <opensm/osm_db.h> 61 #include <opensm/osm_subnet.h> 62 #include <opensm/osm_mad_pool.h> 63 #include <opensm/osm_vl15intf.h> 64 #include <opensm/osm_congestion_control.h> 65 66 #ifdef __cplusplus 67 # define BEGIN_C_DECLS extern "C" { 68 # define END_C_DECLS } 69 #else /* !__cplusplus */ 70 # define BEGIN_C_DECLS 71 # define END_C_DECLS 72 #endif /* __cplusplus */ 73 74 BEGIN_C_DECLS 75 /****h* OpenSM/OpenSM 76 * NAME 77 * OpenSM 78 * 79 * DESCRIPTION 80 * The OpenSM object encapsulates the information needed by the 81 * OpenSM to govern itself. The OpenSM is one OpenSM object. 82 * 83 * The OpenSM object is thread safe. 84 * 85 * This object should be treated as opaque and should 86 * be manipulated only through the provided functions. 87 * 88 * AUTHOR 89 * Steve King, Intel 90 * 91 *********/ 92 /****d* OpenSM: OpenSM/osm_routing_engine_type_t 93 * NAME 94 * osm_routing_engine_type_t 95 * 96 * DESCRIPTION 97 * Enumerates the possible routing engines that 98 * could be used to route a subnet. 99 * 100 * SYNOPSIS 101 */ 102 typedef enum _osm_routing_engine_type { 103 OSM_ROUTING_ENGINE_TYPE_NONE = 0, 104 OSM_ROUTING_ENGINE_TYPE_MINHOP, 105 OSM_ROUTING_ENGINE_TYPE_UPDN, 106 OSM_ROUTING_ENGINE_TYPE_DNUP, 107 OSM_ROUTING_ENGINE_TYPE_FILE, 108 OSM_ROUTING_ENGINE_TYPE_FTREE, 109 OSM_ROUTING_ENGINE_TYPE_LASH, 110 OSM_ROUTING_ENGINE_TYPE_DOR, 111 OSM_ROUTING_ENGINE_TYPE_TORUS_2QOS, 112 OSM_ROUTING_ENGINE_TYPE_SSSP, 113 OSM_ROUTING_ENGINE_TYPE_DFSSSP, 114 OSM_ROUTING_ENGINE_TYPE_UNKNOWN 115 } osm_routing_engine_type_t; 116 /***********/ 117 118 /****s* OpenSM: OpenSM/osm_routing_engine 119 * NAME 120 * struct osm_routing_engine 121 * 122 * DESCRIPTION 123 * OpenSM routing engine module definition. 124 * NOTES 125 * routing engine structure - multicast callbacks may be 126 * added later. 127 */ 128 struct osm_routing_engine { 129 osm_routing_engine_type_t type; 130 const char *name; 131 void *context; 132 int (*build_lid_matrices) (void *context); 133 int (*ucast_build_fwd_tables) (void *context); 134 void (*ucast_dump_tables) (void *context); 135 void (*update_sl2vl)(void *context, IN osm_physp_t *port, 136 IN uint8_t in_port_num, IN uint8_t out_port_num, 137 IN OUT ib_slvl_table_t *t); 138 void (*update_vlarb)(void *context, IN osm_physp_t *port, 139 IN uint8_t port_num, 140 IN OUT ib_vl_arb_table_t *block, 141 unsigned block_length, unsigned block_num); 142 uint8_t (*path_sl)(void *context, IN uint8_t path_sl_hint, 143 IN const ib_net16_t slid, IN const ib_net16_t dlid); 144 ib_api_status_t (*mcast_build_stree)(void *context, 145 IN OUT osm_mgrp_box_t *mgb); 146 void (*destroy) (void *context); 147 struct osm_routing_engine *next; 148 }; 149 /* 150 * FIELDS 151 * name 152 * The routing engine name (will be used in logs). 153 * 154 * context 155 * The routing engine context. Will be passed as parameter 156 * to the callback functions. 157 * 158 * build_lid_matrices 159 * The callback for lid matrices generation. 160 * 161 * ucast_build_fwd_tables 162 * The callback for unicast forwarding table generation. 163 * 164 * ucast_dump_tables 165 * The callback for dumping unicast routing tables. 166 * 167 * update_sl2vl(void *context, IN osm_physp_t *port, 168 * IN uint8_t in_port_num, IN uint8_t out_port_num, 169 * OUT ib_slvl_table_t *t) 170 * The callback to allow routing engine input for SL2VL maps. 171 * *port is the physical port for which the SL2VL map is to be 172 * updated. For switches, in_port_num/out_port_num identify 173 * which part of the SL2VL map to update. For router/HCA ports, 174 * in_port_num/out_port_num should be ignored. 175 * 176 * update_vlarb(void *context, IN osm_physp_t *port, 177 * IN uint8_t port_num, 178 * IN OUT ib_vl_arb_table_t *block, 179 * unsigned block_length, unsigned block_num) 180 * The callback to allow routing engine input for VLArbitration. 181 * *port is the physical port for which the VLArb table is to be 182 * updated. 183 * 184 * path_sl 185 * The callback for computing path SL. 186 * 187 * mcast_build_stree 188 * The callback for building the spanning tree for multicast 189 * forwarding, called per MLID. 190 * 191 * destroy 192 * The destroy method, may be used for routing engine 193 * internals cleanup. 194 * 195 * next 196 * Pointer to next routing engine in the list. 197 */ 198 199 /****s* OpenSM: OpenSM/osm_opensm_t 200 * NAME 201 * osm_opensm_t 202 * 203 * DESCRIPTION 204 * OpenSM structure. 205 * 206 * This object should be treated as opaque and should 207 * be manipulated only through the provided functions. 208 * 209 * SYNOPSIS 210 */ 211 typedef struct osm_opensm { 212 const char *osm_version; 213 osm_subn_t subn; 214 osm_sm_t sm; 215 osm_sa_t sa; 216 #ifdef ENABLE_OSM_PERF_MGR 217 osm_perfmgr_t perfmgr; 218 #endif /* ENABLE_OSM_PERF_MGR */ 219 osm_congestion_control_t cc; 220 cl_qlist_t plugin_list; 221 osm_db_t db; 222 boolean_t mad_pool_constructed; 223 osm_mad_pool_t mad_pool; 224 osm_vendor_t *p_vendor; 225 boolean_t vl15_constructed; 226 osm_vl15_t vl15; 227 osm_log_t log; 228 cl_dispatcher_t disp; 229 cl_dispatcher_t sa_set_disp; 230 boolean_t sa_set_disp_initialized; 231 cl_plock_t lock; 232 struct osm_routing_engine *routing_engine_list; 233 struct osm_routing_engine *routing_engine_used; 234 struct osm_routing_engine *default_routing_engine; 235 boolean_t no_fallback_routing_engine; 236 osm_stats_t stats; 237 osm_console_t console; 238 nn_map_t *node_name_map; 239 } osm_opensm_t; 240 /* 241 * FIELDS 242 * osm_version 243 * OpenSM version (as generated in osm_version.h) 244 * 245 * subn 246 * Subnet object for this subnet. 247 * 248 * sm 249 * The Subnet Manager (SM) object for this subnet. 250 * 251 * sa 252 * The Subnet Administration (SA) object for this subnet. 253 * 254 * db 255 * Persistant storage of some data required between sessions. 256 * 257 * mad_pool 258 * Pool of Management Datagram (MAD) objects. 259 * 260 * p_vendor 261 * Pointer to the Vendor specific adapter for various 262 * transport interfaces, such as UMADT, AL, etc. The 263 * particular interface is set at compile time. 264 * 265 * vl15 266 * The VL15 interface. 267 * 268 * log 269 * Log facility used by all OpenSM components. 270 * 271 * disp 272 * Central dispatcher containing the OpenSM worker threads. 273 * 274 * sa_set_disp 275 * Dispatcher for SA Set and Delete requests. 276 * 277 * sa_set_disp_initialized. 278 * Indicator that sa_set_disp dispatcher was initialized. 279 * 280 * lock 281 * Shared lock guarding most OpenSM structures. 282 * 283 * routing_engine_list 284 * List of routing engines that should be tried for use. 285 * 286 * routing_engine_used 287 * Indicates which routing engine was used to route a subnet. 288 * 289 * no_fallback_routing_engine 290 * Indicates if default routing engine should not be used. 291 * 292 * stats 293 * Open SM statistics block 294 * 295 * SEE ALSO 296 *********/ 297 298 /****f* OpenSM: OpenSM/osm_opensm_construct 299 * NAME 300 * osm_opensm_construct 301 * 302 * DESCRIPTION 303 * This function constructs an OpenSM object. 304 * 305 * SYNOPSIS 306 */ 307 void osm_opensm_construct(IN osm_opensm_t * p_osm); 308 /* 309 * PARAMETERS 310 * p_osm 311 * [in] Pointer to a OpenSM object to construct. 312 * 313 * RETURN VALUE 314 * This function does not return a value. 315 * 316 * NOTES 317 * Allows calling osm_opensm_init, osm_opensm_destroy 318 * 319 * Calling osm_opensm_construct is a prerequisite to calling any other 320 * method except osm_opensm_init. 321 * 322 * SEE ALSO 323 * SM object, osm_opensm_init, osm_opensm_destroy 324 *********/ 325 326 /****f* OpenSM: OpenSM/osm_opensm_construct_finish 327 * NAME 328 * osm_opensm_construct_finish 329 * 330 * DESCRIPTION 331 * The osm_opensm_construct_finish function completes 332 * the second phase of constucting an OpenSM object. 333 * 334 * SYNOPSIS 335 */ 336 void osm_opensm_construct_finish(IN osm_opensm_t * p_osm); 337 /* 338 * PARAMETERS 339 * p_osm 340 * [in] Pointer to a OpenSM object to construct. 341 * 342 * RETURN VALUE 343 * This function does not return a value. 344 * 345 * NOTES 346 * Calling osm_opensm_construct/osm_construct_finish is a prerequisite 347 * to calling any other method except osm_opensm_init/osm_opensm_init_finish. 348 * 349 * SEE ALSO 350 * SM object, osm_opensm_init, osm_opensm_construct_finish, 351 * osm_opensm_destroy, osm_opensm_destroy_finish 352 *********/ 353 354 /****f* OpenSM: OpenSM/osm_opensm_destroy 355 * NAME 356 * osm_opensm_destroy 357 * 358 * DESCRIPTION 359 * The osm_opensm_destroy function destroys an SM, releasing 360 * all resources. 361 * 362 * SYNOPSIS 363 */ 364 void osm_opensm_destroy(IN osm_opensm_t * p_osm); 365 /* 366 * PARAMETERS 367 * p_osm 368 * [in] Pointer to a OpenSM object to destroy. 369 * 370 * RETURN VALUE 371 * This function does not return a value. 372 * 373 * NOTES 374 * Performs any necessary cleanup of the specified OpenSM object. 375 * Further operations should not be attempted on the destroyed object. 376 * This function should only be called after a call to osm_opensm_construct or 377 * osm_opensm_init. 378 * 379 * SEE ALSO 380 * SM object, osm_opensm_construct, osm_opensm_init 381 *********/ 382 383 /****f* OpenSM: OpenSM/osm_opensm_destroy_finish 384 * NAME 385 * osm_opensm_destroy_finish 386 * 387 * DESCRIPTION 388 * The osm_opensm_destroy_finish function handles the second phase 389 * of destroying an SM, releasing all resources. 390 * 391 * SYNOPSIS 392 */ 393 void osm_opensm_destroy_finish(IN osm_opensm_t * p_osm); 394 /* 395 * PARAMETERS 396 * p_osm 397 * [in] Pointer to a OpenSM object to destroy. 398 * 399 * RETURN VALUE 400 * This function does not return a value. 401 * 402 * NOTES 403 * Performs second phase of any necessary cleanup of the specified OpenSM object. 404 * Further operations should not be attempted on the destroyed object. 405 * This function should only be called after a call to 406 * osm_opensm_construct_finish or osm_opensm_init_finish. 407 * 408 * SEE ALSO 409 * SM object, osm_opensm_construct, osm_opensm_construct_finish, 410 * osm_opensm_init, osm_opensm_init_finish 411 *********/ 412 413 /****f* OpenSM: OpenSM/osm_opensm_init 414 * NAME 415 * osm_opensm_init 416 * 417 * DESCRIPTION 418 * The osm_opensm_init function initializes a OpenSM object for use. 419 * 420 * SYNOPSIS 421 */ 422 ib_api_status_t osm_opensm_init(IN osm_opensm_t * p_osm, 423 IN const osm_subn_opt_t * p_opt); 424 /* 425 * PARAMETERS 426 * p_osm 427 * [in] Pointer to an osm_opensm_t object to initialize. 428 * 429 * p_opt 430 * [in] Pointer to the subnet options structure. 431 * 432 * RETURN VALUES 433 * IB_SUCCESS if the OpenSM object was initialized successfully. 434 * 435 * NOTES 436 * Allows calling other OpenSM methods. 437 * 438 * SEE ALSO 439 * SM object, osm_opensm_construct, osm_opensm_destroy 440 *********/ 441 442 /****f* OpenSM: OpenSM/osm_opensm_init_finish 443 * NAME 444 * osm_opensm_init_finish 445 * 446 * DESCRIPTION 447 * The osm_opensm_init_finish function performs the second phase 448 * of initialization of an OpenSM object. 449 * 450 * SYNOPSIS 451 */ 452 ib_api_status_t osm_opensm_init_finish(IN osm_opensm_t * p_osm, 453 IN const osm_subn_opt_t * p_opt); 454 /* 455 * PARAMETERS 456 * p_osm 457 * [in] Pointer to an osm_opensm_t object to initialize. 458 * 459 * p_opt 460 * [in] Pointer to the subnet options structure. 461 * 462 * RETURN VALUES 463 * IB_SUCCESS if the OpenSM object was initialized successfully. 464 * 465 * NOTES 466 * Allows calling other OpenSM methods. 467 * 468 * SEE ALSO 469 * SM object, osm_opensm_construct, osm_opensm_construct_finish, 470 * osm_opensm_destroy, osm_opensm_destroy_finish 471 *********/ 472 473 /****f* OpenSM: OpenSM/osm_opensm_sweep 474 * NAME 475 * osm_opensm_sweep 476 * 477 * DESCRIPTION 478 * Initiates a subnet sweep. 479 * 480 * SYNOPSIS 481 */ 482 static inline void osm_opensm_sweep(IN osm_opensm_t * p_osm) 483 { 484 osm_sm_sweep(&p_osm->sm); 485 } 486 487 /* 488 * PARAMETERS 489 * p_osm 490 * [in] Pointer to an osm_opensm_t object on which to 491 * initiate a sweep. 492 * 493 * RETURN VALUES 494 * None 495 * 496 * NOTES 497 * If the OpenSM object is not bound to a port, this function 498 * does nothing. 499 * 500 * SEE ALSO 501 *********/ 502 503 /****f* OpenSM: OpenSM/osm_opensm_set_log_flags 504 * NAME 505 * osm_opensm_set_log_flags 506 * 507 * DESCRIPTION 508 * Sets the log level. 509 * 510 * SYNOPSIS 511 */ 512 static inline void osm_opensm_set_log_flags(IN osm_opensm_t * p_osm, 513 IN osm_log_level_t log_flags) 514 { 515 osm_log_set_level(&p_osm->log, log_flags); 516 } 517 518 /* 519 * PARAMETERS 520 * p_osm 521 * [in] Pointer to an osm_opensm_t object. 522 * 523 * log_flags 524 * [in] Log level flags to set. 525 * 526 * RETURN VALUES 527 * None 528 * 529 * NOTES 530 * 531 * SEE ALSO 532 *********/ 533 534 /****f* OpenSM: OpenSM/osm_opensm_bind 535 * NAME 536 * osm_opensm_bind 537 * 538 * DESCRIPTION 539 * Binds the opensm object to a port guid. 540 * 541 * SYNOPSIS 542 */ 543 ib_api_status_t osm_opensm_bind(IN osm_opensm_t * p_osm, IN ib_net64_t guid); 544 /* 545 * PARAMETERS 546 * p_osm 547 * [in] Pointer to an osm_opensm_t object to bind. 548 * 549 * guid 550 * [in] Local port GUID with which to bind. 551 * 552 * RETURN VALUES 553 * None 554 * 555 * NOTES 556 * A given opensm object can only be bound to one port at a time. 557 * 558 * SEE ALSO 559 *********/ 560 561 /****f* OpenSM: OpenSM/osm_opensm_wait_for_subnet_up 562 * NAME 563 * osm_opensm_wait_for_subnet_up 564 * 565 * DESCRIPTION 566 * Blocks the calling thread until the subnet is up. 567 * 568 * SYNOPSIS 569 */ 570 static inline cl_status_t 571 osm_opensm_wait_for_subnet_up(IN osm_opensm_t * p_osm, IN uint32_t wait_us, 572 IN boolean_t interruptible) 573 { 574 return osm_sm_wait_for_subnet_up(&p_osm->sm, wait_us, interruptible); 575 } 576 577 /* 578 * PARAMETERS 579 * p_osm 580 * [in] Pointer to an osm_opensm_t object. 581 * 582 * wait_us 583 * [in] Number of microseconds to wait. 584 * 585 * interruptible 586 * [in] Indicates whether the wait operation can be interrupted 587 * by external signals. 588 * 589 * RETURN VALUES 590 * CL_SUCCESS if the wait operation succeeded in response to the event 591 * being set. 592 * 593 * CL_TIMEOUT if the specified time period elapses. 594 * 595 * CL_NOT_DONE if the wait was interrupted by an external signal. 596 * 597 * CL_ERROR if the wait operation failed. 598 * 599 * NOTES 600 * 601 * SEE ALSO 602 *********/ 603 604 /****f* OpenSM: OpenSM/osm_routing_engine_type_str 605 * NAME 606 * osm_routing_engine_type_str 607 * 608 * DESCRIPTION 609 * Returns a string for the specified routing engine type. 610 * 611 * SYNOPSIS 612 */ 613 const char *osm_routing_engine_type_str(IN osm_routing_engine_type_t type); 614 /* 615 * PARAMETERS 616 * type 617 * [in] routing engine type. 618 * 619 * RETURN VALUES 620 * Pointer to routing engine name. 621 * 622 * NOTES 623 * 624 * SEE ALSO 625 *********/ 626 627 /****f* OpenSM: OpenSM/osm_routing_engine_type 628 * NAME 629 * osm_routing_engine_type 630 * 631 * DESCRIPTION 632 * Returns a routing engine type specified routing engine name string. 633 * 634 * SYNOPSIS 635 */ 636 osm_routing_engine_type_t osm_routing_engine_type(IN const char *str); 637 /* 638 * PARAMETERS 639 * str 640 * [in] routing engine name string. 641 * 642 * RETURN VALUES 643 * Routing engine type. 644 * 645 * NOTES 646 * 647 * SEE ALSO 648 *********/ 649 650 void osm_opensm_report_event(osm_opensm_t *osm, osm_epi_event_id_t event_id, 651 void *event_data); 652 653 /* dump helpers */ 654 void osm_dump_mcast_routes(osm_opensm_t * osm); 655 void osm_dump_all(osm_opensm_t * osm); 656 void osm_dump_qmap_to_file(osm_opensm_t * p_osm, const char *file_name, 657 cl_qmap_t * map, 658 void (*func) (cl_map_item_t *, FILE *, void *), 659 void *cxt); 660 661 /****v* OpenSM/osm_exit_flag 662 */ 663 extern volatile unsigned int osm_exit_flag; 664 /* 665 * DESCRIPTION 666 * Set to one to cause all threads to leave 667 *********/ 668 669 END_C_DECLS 670 #endif /* _OSM_OPENSM_H_ */ 671